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

codial 270 Messages postés mercredi 14 avril 2004Date d'inscription 5 mai 2015 Dernière intervention - 17 mai 2005 à 18:20 - Dernière réponse : japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention
- 18 mai 2005 à 19:03
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
Afficher la suite 

14 réponses

Répondre au sujet
japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention - 18 mai 2005 à 11:36
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de japee
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 18 mai 2005 à 12:23
+3
Utile
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.
<
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Delphiprog
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 17 mai 2005 à 21:05
0
Utile
Voir la fonction StrtoCurr


<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
<
Commenter la réponse de cs_Delphiprog
codial 270 Messages postés mercredi 14 avril 2004Date d'inscription 5 mai 2015 Dernière intervention - 17 mai 2005 à 22:57
0
Utile
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
Commenter la réponse de codial
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 17 mai 2005 à 23:35
0
Utile
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.
<
Commenter la réponse de cs_Delphiprog
codial 270 Messages postés mercredi 14 avril 2004Date d'inscription 5 mai 2015 Dernière intervention - 18 mai 2005 à 10:27
0
Utile
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
Commenter la réponse de codial
moldov 168 Messages postés mercredi 8 octobre 2003Date d'inscription 10 novembre 2008 Dernière intervention - 18 mai 2005 à 11:07
0
Utile
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
Commenter la réponse de moldov
jlen100 1651 Messages postés samedi 10 juillet 2004Date d'inscription 25 juillet 2014 Dernière intervention - 18 mai 2005 à 13:08
0
Utile
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
Commenter la réponse de jlen100
japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention - 18 mai 2005 à 13:11
0
Utile
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...
Commenter la réponse de japee
codial 270 Messages postés mercredi 14 avril 2004Date d'inscription 5 mai 2015 Dernière intervention - 18 mai 2005 à 13:15
0
Utile
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
Commenter la réponse de codial
japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention - 18 mai 2005 à 13:18
0
Utile
Oui, jl100, j'admets que c'est plus simple...



Bonne prog'



japee
Commenter la réponse de japee
cs_Kenavo 759 Messages postés vendredi 21 mars 2003Date d'inscription 1 octobre 2009 Dernière intervention - 18 mai 2005 à 17:21
0
Utile
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 ]
Commenter la réponse de cs_Kenavo
jlen100 1651 Messages postés samedi 10 juillet 2004Date d'inscription 25 juillet 2014 Dernière intervention - 18 mai 2005 à 18:33
0
Utile
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.
Commenter la réponse de jlen100
japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention - 18 mai 2005 à 19:03
0
Utile
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
Commenter la réponse de japee

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.