CONVERSION CHAINE -> FLOTTANT SANS SE SOUCIER DES PARAMÈTRE RÉGIONNAUX
jmp77
Messages postés1119Date d'inscriptionlundi 4 février 2002StatutMembreDernière intervention 4 octobre 2006
-
4 mars 2005 à 21:34
salamo1980
Messages postés2Date d'inscriptionjeudi 22 janvier 2004StatutMembreDernière intervention 7 mai 2007
-
20 mai 2007 à 01:17
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
salamo1980
Messages postés2Date d'inscriptionjeudi 22 janvier 2004StatutMembreDernière intervention 7 mai 2007 20 mai 2007 à 01:17
merci ami
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 20092 30 mars 2005 à 21:26
Confronté au meme probleme : strtofloat qui se met dans le mur sans raison apparente, j'ai réécrit un StrToXtd
function StrToXtd(Chaine,DecSep :string):extended;
var L,K,i: integer;
R:extended;
begin
R:=0;
L:=Length(Chaine);
K:=Pos(DecSep,Chaine);
For i:=1 to L do
if Chaine[i] in ['0'..'9'] then R:=R*10.0 + StrToInt(Chaine[i]);
if K > 0 Then R:=R/IntPower(10,(L-K));
StrToXtd:= R;
end;
Evidement c'est incomplet, il manque la gestion des trucs genre 2.325E45, et des négatif (et des exposant négatif hein en plus), mais c'est vraiment aisé a rajouter.
Vous voulez pouvoir utiliser la virgule ou le point comme séparateur décimal en meme temps ?? sans modifier le système ?
Ne vous cassez pas la tête :
function StringToFloat(S: string): Extended;
begin
case DecimalSeparator of
'.': S:=StringReplace(S,',',DecimalSeparator,[]);
',': S:=StringReplace(S,'.',DecimalSeparator,[]);
end; // case.
Result:=StrToFloat(S);
end;
ou pour la version TRY:
function TryStringToFloat(S: string; out Into: Extended): Boolean;
begin
case DecimalSeparator of
'.': S:=StringReplace(S,',',DecimalSeparator,[]);
',': S:=StringReplace(S,'.',DecimalSeparator,[]);
end; // case.
Result:=TryStrToFloat(S,Into);
end;
Voila le code est assez explicite de lui même et c'est tout simple.
@ ++
Florent
jmp77
Messages postés1119Date d'inscriptionlundi 4 février 2002StatutMembreDernière intervention 4 octobre 20067 7 mars 2005 à 09:54
Delphiprog :
Lol effectivement delphiprog j'ai été un peu vite. Mais c'est parceque en générale j'utilise la version qui renvoi true ou false. J'ai voulu faire une variante mais pas de chance planté.
Merci de me l'avoir fait remarquer.
David_SDI_O1 :
Je ne comprends pas pourquoi tu veux absolument utilisé les . ou , mais bon tu es libre de ton choix.
Le principal c'est que ca fonctionne comme dirais l'autre.
Allez bonne continuation à vous deux,
JMP77.
DAVID_SDI_01
Messages postés1Date d'inscriptionjeudi 8 janvier 2004StatutMembreDernière intervention 5 mars 2005 5 mars 2005 à 21:17
Hello JMP77,
pourquoi au debut de mon programme je ne fait pas :
DecimalSeparator := '.' ?
Tout simplement parce que je voulais que la saisie soit validée avec '.' ou ',' et non pas limitée à une des deux possibilités
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 5 mars 2005 à 08:53
Effectivement, pourquoi faire compliqué quand on peut faire simple ?
Notez qu'il existe aussi la function TryStrToFloat définie dans SysUtils.
JMP77 : dans ta routine
function IsNumber(S : String) : Double; Overload;
begin
Try
Result := StrToFloat(S);
Except
Result := -1;
end;
end;
tu oublies que le type de données Double a pour étendue 5.0 x 10^-324 .. 1.7 x 10^308 et donc renvoyer -1 comme résultat n'est pas la preuve absolue d'un problème de conversion d'une chaine en un nombre flottant. CQFD.
jmp77
Messages postés1119Date d'inscriptionlundi 4 février 2002StatutMembreDernière intervention 4 octobre 20067 4 mars 2005 à 21:34
Hello,
Et pourquoi au debut de ton programme tu ne fait pas tout simplement :
DecimalSeparator := '.';
Et ensuite tu fais un test simple comme ceci quand tu veux recuperer la valeur :
Valeur1 := IsNumber(Edit1.Text);
Avec la fonction suivante :
function IsNumber(S : String) : Double; Overload;
begin
Try
Result := StrToFloat(S);
Except
Result := -1;
end;
end;
Ou encore si tu veux signaler a l'utilisateur que la saisie est incorrect :
If IsNumber(Edit1.Text) then Valeur1 := StrToFloat(Edit1.Text)
else ShowMessage('Valeur incorrect dansle champ 1');
Avec la fonction suivante :
function IsNumber(S : String) : Boolean; Overload;
begin
Result := True;
Try
StrToFloat(S);
Except
Result := False;
end;
end;
Enfin c'est sur il peut y avoir des centaines de code sur le sujet.
Ca me parait bien moins compliqué quand meme non?
20 mai 2007 à 01:17
30 mars 2005 à 21:26
function StrToXtd(Chaine,DecSep :string):extended;
var L,K,i: integer;
R:extended;
begin
R:=0;
L:=Length(Chaine);
K:=Pos(DecSep,Chaine);
For i:=1 to L do
if Chaine[i] in ['0'..'9'] then R:=R*10.0 + StrToInt(Chaine[i]);
if K > 0 Then R:=R/IntPower(10,(L-K));
StrToXtd:= R;
end;
Evidement c'est incomplet, il manque la gestion des trucs genre 2.325E45, et des négatif (et des exposant négatif hein en plus), mais c'est vraiment aisé a rajouter.
9 mars 2005 à 13:34
Vous voulez pouvoir utiliser la virgule ou le point comme séparateur décimal en meme temps ?? sans modifier le système ?
Ne vous cassez pas la tête :
function StringToFloat(S: string): Extended;
begin
case DecimalSeparator of
'.': S:=StringReplace(S,',',DecimalSeparator,[]);
',': S:=StringReplace(S,'.',DecimalSeparator,[]);
end; // case.
Result:=StrToFloat(S);
end;
ou pour la version TRY:
function TryStringToFloat(S: string; out Into: Extended): Boolean;
begin
case DecimalSeparator of
'.': S:=StringReplace(S,',',DecimalSeparator,[]);
',': S:=StringReplace(S,'.',DecimalSeparator,[]);
end; // case.
Result:=TryStrToFloat(S,Into);
end;
Voila le code est assez explicite de lui même et c'est tout simple.
@ ++
Florent
7 mars 2005 à 09:54
Lol effectivement delphiprog j'ai été un peu vite. Mais c'est parceque en générale j'utilise la version qui renvoi true ou false. J'ai voulu faire une variante mais pas de chance planté.
Merci de me l'avoir fait remarquer.
David_SDI_O1 :
Je ne comprends pas pourquoi tu veux absolument utilisé les . ou , mais bon tu es libre de ton choix.
Le principal c'est que ca fonctionne comme dirais l'autre.
Allez bonne continuation à vous deux,
JMP77.
5 mars 2005 à 21:17
pourquoi au debut de mon programme je ne fait pas :
DecimalSeparator := '.' ?
Tout simplement parce que je voulais que la saisie soit validée avec '.' ou ',' et non pas limitée à une des deux possibilités
5 mars 2005 à 08:53
Notez qu'il existe aussi la function TryStrToFloat définie dans SysUtils.
JMP77 : dans ta routine
function IsNumber(S : String) : Double; Overload;
begin
Try
Result := StrToFloat(S);
Except
Result := -1;
end;
end;
tu oublies que le type de données Double a pour étendue 5.0 x 10^-324 .. 1.7 x 10^308 et donc renvoyer -1 comme résultat n'est pas la preuve absolue d'un problème de conversion d'une chaine en un nombre flottant. CQFD.
4 mars 2005 à 21:34
Et pourquoi au debut de ton programme tu ne fait pas tout simplement :
DecimalSeparator := '.';
Et ensuite tu fais un test simple comme ceci quand tu veux recuperer la valeur :
Valeur1 := IsNumber(Edit1.Text);
Avec la fonction suivante :
function IsNumber(S : String) : Double; Overload;
begin
Try
Result := StrToFloat(S);
Except
Result := -1;
end;
end;
Ou encore si tu veux signaler a l'utilisateur que la saisie est incorrect :
If IsNumber(Edit1.Text) then Valeur1 := StrToFloat(Edit1.Text)
else ShowMessage('Valeur incorrect dansle champ 1');
Avec la fonction suivante :
function IsNumber(S : String) : Boolean; Overload;
begin
Result := True;
Try
StrToFloat(S);
Except
Result := False;
end;
end;
Enfin c'est sur il peut y avoir des centaines de code sur le sujet.
Ca me parait bien moins compliqué quand meme non?
Bonne continuation,
JMP77.