Conversion chaine -> flottant sans se soucier des paramètre régionnaux

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 987 fois - Téléchargée 38 fois

Contenu du snippet

Mon premier code sur codes-source

Qui n'a jamais eu de souci en voulant convertir une saisie utilisateur en flottant ?

Ce code permet de convertir une chaine en flottant sans se soucier du séparateur des paramètres régionnaux

En espérant que ca puisse être utile à quelqu'un

Source / Exemple :


(* ************************************************************************** *)
(*                         FUNCTION StrF_ToValue                              *)
(*                                                                            *)
(* Retourne une valeur réelle a partir d'une chaine avec . ou ,               *)
(* comme séparareur                                                           *)
(*                                                                            *)
(* ************************************************************************** *)
Function StrF_ToValue ( Const Chaine : String ) : double;
Var
  DecSeparator : Char;
  S            : String;
  I            : Integer;
Begin

  (* sauvegarde séparateur des options windows *)
  DecSeparator := DecimalSeparator;

  S := Chaine;

  Try

    (* Force le séparateur '.' *)
    DecimalSeparator := '.';

    (* Si on trouve le séparateur '.' *)
    IF Pos(DecimalSeparator, S) > 0 THEN
    Begin

      Try
        Result := StrToFloat (S);
      Except
        (* Si erreur de conversion *)
        Raise;
      End;

    End Else
    Begin
      (* Si on trouve le séparateur ',' *)
      I := Pos(',', S);

      (* On le remplace par '.' *)
      IF I > 0 THEN
        S[I] := DecimalSeparator;

      Try
        Result := StrToFloat (S);
      Except
        (* Si erreur de conversion *)
        Raise;
      End;

    End;

  Finally
    (* rétabli séparateur des options windows *)
    DecimalSeparator := DecSeparator;
  End;

End;

A voir également

Ajouter un commentaire Commentaires
Messages postés
2
Date d'inscription
jeudi 22 janvier 2004
Statut
Membre
Dernière intervention
7 mai 2007

merci ami
Messages postés
449
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
2
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
Messages postés
1119
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
4 octobre 2006
7
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.
Messages postés
1
Date d'inscription
jeudi 8 janvier 2004
Statut
Membre
Dernière intervention
5 mars 2005

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
Afficher les 7 commentaires

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.