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

codial
Messages postés
270
Date d'inscription
mercredi 14 avril 2004
Dernière intervention
5 mai 2015
- 17 mai 2005 à 18:20 - Dernière réponse : japee
Messages postés
1799
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
19 juillet 2018
- 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 

Votre réponse

14 réponses

Meilleure réponse
japee
Messages postés
1799
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
19 juillet 2018
- 18 mai 2005 à 11:36
3
Merci
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

Merci japee 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de japee
Meilleure réponse
cs_Delphiprog
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
- 18 mai 2005 à 12:23
3
Merci
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.
<

Merci cs_Delphiprog 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de cs_Delphiprog
cs_Delphiprog
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
- 17 mai 2005 à 21:05
0
Merci
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
Messages postés
270
Date d'inscription
mercredi 14 avril 2004
Dernière intervention
5 mai 2015
- 17 mai 2005 à 22:57
0
Merci
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
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
- 17 mai 2005 à 23:35
0
Merci
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
Messages postés
270
Date d'inscription
mercredi 14 avril 2004
Dernière intervention
5 mai 2015
- 18 mai 2005 à 10:27
0
Merci
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
Messages postés
168
Date d'inscription
mercredi 8 octobre 2003
Dernière intervention
10 novembre 2008
- 18 mai 2005 à 11:07
0
Merci
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
Messages postés
1651
Date d'inscription
samedi 10 juillet 2004
Dernière intervention
25 juillet 2014
- 18 mai 2005 à 13:08
0
Merci
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
Messages postés
1799
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
19 juillet 2018
- 18 mai 2005 à 13:11
0
Merci
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
Messages postés
270
Date d'inscription
mercredi 14 avril 2004
Dernière intervention
5 mai 2015
- 18 mai 2005 à 13:15
0
Merci
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
Messages postés
1799
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
19 juillet 2018
- 18 mai 2005 à 13:18
0
Merci
Oui, jl100, j'admets que c'est plus simple...



Bonne prog'



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