CONVERSION CHAINE -> FLOTTANT SANS SE SOUCIER DES PARAMÈTRE RÉGIONNAUX

jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 - 4 mars 2005 à 21:34
salamo1980 Messages postés 2 Date d'inscription jeudi 22 janvier 2004 Statut Membre Derniè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.

https://codes-sources.commentcamarche.net/source/29903-conversion-chaine-flottant-sans-se-soucier-des-parametre-regionnaux

salamo1980 Messages postés 2 Date d'inscription jeudi 22 janvier 2004 Statut Membre Dernière intervention 7 mai 2007
20 mai 2007 à 01:17
merci ami
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
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.
Salut,

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és 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
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és 1 Date d'inscription jeudi 8 janvier 2004 Statut Membre Derniè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és 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
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és 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
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?

Bonne continuation,
JMP77.