Séparateur décimal [Résolu]

Signaler
Messages postés
637
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
9 janvier 2017
-
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
-
Lors de la vonvertion d'une chaine en flotan il arrive d'avoir l'erreur de convertion car le séparateur décimal n'est pas celmui du système.

Au lieu d'utiliser strtofloat(s) quelle instruction simple utuliser pour que cela focntionne aussi bien avec comme séparateur décimal le point "." ou la virgule "," ?

Sans changer la configuration système afin que cela fonctionne sur un grand nombre de PC

yvessimon

10 réponses

Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
11
salut,

une fonction qui accepte les 2 format je ne connais pas mais tu peux
soit tester la presence de l'un ou l'autre des séparateur decimaux;
soit utiliser la fonction stringreplace pour mettre le séparateur en
conformité avec le systeme soit enfin gérer les erreurs de conversion

poru mio je pense qu'il est plus simple de remplacer le séparateur decimal avec la fonction stringreplace:

chaine:=stringreplace(chaine,'.',decimalseparator,[rfReplaceAll]);



@+

jlen
Messages postés
118
Date d'inscription
dimanche 28 septembre 2003
Statut
Membre
Dernière intervention
19 juin 2007

salut!
StrToFloat(const S:string;const FormatSettings:TFormatSettings)
où FormatSettings est le séparateur décimal.

a++
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
11
salut flo003

mettre le formtsetting n'empèchera pas l'erreur de conversion si celui
dans la chaine ne correspond pas à celui défini dans formatsetting



@+

jlen
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
11
on peut améliorer en automatisant la détection

if decimalseparator= ',' then

chaine: =stringreplace(chaine,'.',decimalseparator,[rfReplaceAll])

else

chaine:=stringreplace(chaine,',',decimalseparator,[rfReplaceAll]);



@+

jlen
Messages postés
118
Date d'inscription
dimanche 28 septembre 2003
Statut
Membre
Dernière intervention
19 juin 2007

salut jlen100!

Complètement d'accord avec ta méthode.
Mais je m'excuse de ne pas être allé au bout de mon explication.
Et comme je suis quelqu'un de très compliqué je propose ma solution (qui n'est pas la meilleure on est d'accord, j'ai pas essayé j'ai honte si ça se trouve marche pas):

if decimalseparator=',' then
StrToFloat(chaine,'.')
else
StrToFloat(chaine,'.');

ps: ne pas hésiter à me le dire si j'ai dis une connerie
a++
Messages postés
637
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
9 janvier 2017

en utilisant: stringreplace(chaine,'.',decimalseparator,[rfReplaceAll])



ou stringreplace(chaine,',',decimalseparator,[rfReplaceAll])



correspond à ma solution.

Merci

yvessimon
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
11
flor003 comme je te l'ai dit le fait de forcer le séparateur décimal ne
supprimera les erreurs de convertion. je m'explique si tu veux
convertir la chaine:= '123 . 25' et que le séparteur décimal est à ',' tu auras une erreur Eerrorconvert de même si tu as 123,25' et que le séparteur décimal est à '.' il faut qu'il y ait adéquation entre la chaine et le séparateur décimal la seule façon à ma connaissance est de forcer la chaine au séparateur décimal.

en fait quand tu ecis:

if decimalseparator =',' then

StrToFloat(chaine,'.')

else

StrToFloat(chaine,'.');

cela revient à écrire : StrToFloat(chaine,DecimalSeparator)



@+

jlen
Messages postés
118
Date d'inscription
dimanche 28 septembre 2003
Statut
Membre
Dernière intervention
19 juin 2007

merci pour cette précision JLEN100 , je n'étais pas sur de mon truc.
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
11
pas de quoi il peut toutefois rester un problème: Si la chaine a été
formatée avec des séparateurs de millier qui sont l'inverse des
séparateur decimaux---> un bon casse tete!



@+

jlen
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
36
j'ai deja poster la solution plusieurs fois pour ce genre de probleme.
merci de chercher sur le forum.

La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>