StrToFloat Problème avec le séparateur des milliers [Résolu]

Signaler
Messages postés
265
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
5 mai 2015
-
Messages postés
1724
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2020
-
Bonsoir tout le monde,


J'importe des données dans une table paradox à partir d'un fichier texte et j'ai un problème avec ce code:


table1.Fieldbyname('Euros').asCurrency:=StrToFloat(wEuros);
table1.Fieldbyname('Francs').asCurrency:=StrToFloat(wFrancs);


car StrToFloat n'admet pas le séparateur des millier et j'ai un message d'erreur à chaque fois.


Existe il un moyen pour contourner ce problème?


D'avance merci


Codial

14 réponses

Messages postés
1724
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2020
6
Si ça peut dépanner, une petit truc vite fait (à optimiser éventuellement ?):



function MyStrToCurr(S: String): Currency;

var

i: Integer;

Tmp: String;

begin

try

Tmp := '';

for i := 1 to Length(S) do

if not (S[i] = ' ') then

Tmp := Tmp + S[i];

Result := StrToCurr(Tmp);

except

Result := 0;

end;

end;



table1.Fieldbyname('Euros').asCurrency := MyStrToCurr(wEuros);



Bonne prog'



japee
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Salut Japee.
Cette ligne : if not (S[i] = ' ') then se traduit en :
if S[i] <> '' then
"not equal" est équivalent de "different of"
Si Codial veut traiter plusieurs caractères, alors la formule suivante est plus adaptée :
//traitement des caractères espace et virgule
if not (S[i] in [' ', ',']) then...


<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
<
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Voir la fonction StrtoCurr


<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
<
Messages postés
265
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
5 mai 2015
1
j'ai déja essayé

table1.Fieldbyname('Francs').asCurrency:=StrToCurr (wFrancs);

mais j'ai toujours le même message d'erreur:

"1 200,20 n'est pas une valeur flottante"

Cordialement

Codial
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Même si tu déclares la virgule comme séparateur décimal au début de l'application ?

DecimalSeparator := ',';


<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
<
Messages postés
265
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
5 mai 2015
1
Oui j'ai mis DecimalSeparator := ','; et ça ne change rien.

Le problème c'est dans mon fichier texte le séparateur des milliers qui n'est pas admis par la fonction StrToFloat.
Comment je peux contourner ça ?

Codial
Messages postés
165
Date d'inscription
mercredi 8 octobre 2003
Statut
Membre
Dernière intervention
10 novembre 2008

Salut,



Et si tu recupère la valeur en string, ensuite tu fais un traitement pour supprimer les espaces et tu la transforme en float.

Ca arrange pas ton probleme ?



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

il ya plus simple pour supprimer les espaces

si S contient la chaine :

while pos(' ',S)<>0 do delete(S,pos(' ',S),1);





bonne prog
Messages postés
1724
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2020
6
Salut Delphiprog



Tout à fait d'accord pour "S[i] <> ' ' then", c'est ma manière habituelle de procéder.

J'ai juste voulu changer de style, pour voir...

Sais pas ce qui m'a pris, lol.



Bonne prog'



japee



P-S: le ferai plus...
Messages postés
265
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
5 mai 2015
1
Bonjour,

ne maitrisant pas encore très bien Delphi, j'ai trouvé cette solution qui semble convenir:

table1.FieldValues['Euros']:= wEuros;
table1.FieldValues['Francs']:=wFrancs;

Cependant j'ai testé la fonction de jappee et c'est bon je peux remplir ma table.
En fait c'est juste le traitement des espaces qui posait problème.
Je vous remercie pour vos réponses qui m'ont bien dépannées

Codial
Messages postés
1724
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2020
6
Oui, jl100, j'admets que c'est plus simple...



Bonne prog'



japee
Messages postés
702
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
3
Si vous aimez l'assembleur, il est amusant de regarder le déroulement de la fonction
StrToCurr

il y est fait appel à la procédure TextToFloat




X := StrToFloat(wEuros) est alors traduit en TextToFloat(PChar(wEuros),X,fvCurrency)



La fonction
TextToFloat
convertit sans erreur les chaines avec autant d'espace avant et après
la représentation numérique, mais s'il y en a un (espace) entre le
chiffres, après le signe, avant ou après le point, la conversion est
interrompue est une erreur est revoyée.




' +13.46' est bon

'+13.46 ' est bon


' +13.46 ' est bon



C'est bon à savoir ! Pas besoin de faire le ménage avant !



Tout autre espace inséré provoque une erreur. Même si on a pris la précaution de mettre ThousandSeparator :=' '; Je parlerai pour ma part de bug (et je sais de quoi je parle, je suis un gros producteur !

)



Ken@vo

<hr size ="2" width="100%">Code, Code, Codec !




http://www.pourflorenceethussein.org/

[%3C/body ]
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
11
salut,

apparemment le seul séparateur des milliers admis en Delphi est le
point '.' : voir l'aide à la rubrique FormatFloat,fonction;
attention également on peut avoir la même erreur en récupérant des
données au format US ou la virgule est remplacée par le point décimal
d'autre part dans ce format le séparateur des milliers est la virgule
',' ce qui dans le cas de conversion d'une valeur entiére '40,000'
donnerais 40 pour résultat;

surprenant non?

jlen.
Messages postés
1724
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2020
6
Le sujet est décidément intéressant et très ouvert

Les programmeurs Delphi dans le secteur bancaire, et plus
particulièrement concernant le marché des changes, doivent s'arracher
quelques cheveux, non ?



Tiens, j'ai trouvé une approche un peu plus concise que celle que je proposais plus haut :



function MyStrToCurr(S: String): Currency;

begin

Result := StrToCurr(StringReplace(S, ' ', EmptyStr, [rfReplaceAll]));

end;



Bonne prog'



japee