gpletinckx
Messages postés40Date d'inscriptionmardi 28 novembre 2006StatutMembreDernière intervention 3 août 2010
-
2 mars 2009 à 16:00
cs_papillonFR
Messages postés1Date d'inscriptionlundi 11 décembre 2000StatutMembreDernière intervention 6 février 2012
-
6 févr. 2012 à 10:22
Bonjour,
Je travaille avec Delphi 7.
Le séparateur de milliers défini comme paramètre régional est un espace. Ex : 38 256.28
J'encode mes données dans un tableau sous forme de string:
Je veux maintenant utiliser la valeur encodée dans un calcul :
test := StrToFloat(Table8[2,ct1])*10 ;
Lorsque je lance l'application je reçois comme message d'erreur : classe d'exception EConvertError ... '38 256' n'est pas une valeur en virgule flottante correcte.
Or dans un autre programme où j'applique les mêmes technique, je n'ai aucun problème.
Qui peut m'aider?
G. PLETINCKX
A voir également:
Strtofloat delphi
N'est pas une valeur en virgule flottante correcte - Meilleures réponses
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 2 mars 2009 à 22:54
Salut,
Je suis d'accord avec Cantador. Surtout pour des valeurs que tu dois réutiliser dans des calculs...
Sinon, tu peux adapter ça à tes besoins:
function FormatedFloatToFloat(FloatString, ThousSep:String; var E:Extended):Integer;
begin
val(StringReplace(FloatString,ThousSep,'',[rfReplaceAll]),E,Result);
end;
{Utilisation}
procedure TForm1.Button1Click(Sender: TObject);
var E : Extended;
S : String;
begin
S := '1 000.10';
if FormatedFloatToFloat(S,' ',E) = 0 then Edit1.Text := Floattostr(E)
else MessageDlg('Erreur en position:'
+IntToStr(FormatedFloatToFloat(S,' ',E)),mtWarning,[mbOk],0);
end;
gpletinckx
Messages postés40Date d'inscriptionmardi 28 novembre 2006StatutMembreDernière intervention 3 août 2010 4 mars 2009 à 15:05
LA valeur de S est une valeur entière car le format de (FloatToStrF(Donnees.QStatGenMOYBRUT.AsFloat,ffNumber,9,0)) est sans chiffre après la virgule. Mais le signe des décimales est le point et non la virgule.
La valeur de S en l'occurence est bien "10 000" sans point ni chiffre après la virgule.
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 4 mars 2009 à 16:56
@Cirec
Quand je dis que "
ThousandSepartor" est une variable insaisissable, c'est à cause de ça :
var S : string;
C : Char;
begin
S := '1 000.21';
C := ' ';
Edit1.Text := IntToStr(pos(C,S)); // <-- ça marche ' ' est bien en 2ème place.
C := ThousandSeparator; //ThousandSeparator est une variable de type Char
Edit1.Text := IntToStr(pos(C,S)); // <-- ça marche pas. Revoie 0.
//pourtant
Edit1.Text := '___'+C+'___'; // <-- ça marche.
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 3 mars 2009 à 21:46
tout mais pas StringReplace !!!!!
il est bien trop gourmand en temps et en ressources
@ Caribensila:
ton code est bien beau mais ne respecte pas les "standards"
FloatToStr convertit (par défaut en Français) le point "." en virgule ","
de ce fait ton code n'est pas exacte puisqu'il faut avoir S = '1000 .
10' alors
que les fonctions retournent S = '1000, 10'
voici un bout de code qui est au moins 100 fois plus rapide que StringReplace et qui respecte les normes locales:
Function trouvé sur Codyx Function ExcludeChars(Const S : String;
Const CS : TSysCharSet): String;
Var P,
PR : PByte;
Size, I : Integer;
Begin
P := PByte(S);
Size := Length(S);
SetLength(Result,
Size);
PR := PByte(Result);
I := 0;
While P^ <> $0 Do
Begin
If Not
(Chr(P^) In CS) Then
Begin
Pr^ : = P^;
Inc(Pr);
End
Else
Inc(I);
Inc(P);
End;
If I
> 0 Then
SetLength(Result, Size - I)
End;
Procedure
TForm1.Button1Click(Sender: TObject);
Var
S : String;
Begin
S := '1
000,10';
Edit1.Text := Floattostr(StrToFloat(ExcludeChars(S, [' '])));
End ;
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 4 mars 2009 à 01:28
T'as raison Cirec. Comme d'hab! :)
Mais je me suis surtout heurté à "ThousandSepartor" en tant que paramètre de fonction, pendant mes recherches...
T'aurais pas des infos sur cette variable insaisissable?
Histoire de pouvoir faire :
function FormatedFloatToFloat(FloatString: String; ThousandSepartor: Char; var E: Extended): Integer;
gpletinckx
Messages postés40Date d'inscriptionmardi 28 novembre 2006StatutMembreDernière intervention 3 août 2010 4 mars 2009 à 11:20
Désolé mais le réponse que j'obtiens dans mon code est 0 au lieu de la valeur recherchée.
Voici mon code:
For ct1 := 0 To 7 Do
Begin
test := StrToInt(StringReplace(Table2[2,ct1], ' ', '', [rfReplaceAll]));
S := Table2[2,ct1];
test1 := StrToFloat(ExcludeChars(S, [' ']));
cs2.add(test,Table2[0,ct1]);
End;
Table2[2,ct1] est la valeur sous forme de string.
test1 devrait me donner la valeur sous forme décimale; elle renvoie 0.
J'ai recopié la fonction à l'identique et elle fonctionne.
Function TFRapGlo.ExcludeChars(Const S : String; Const CS : TSysCharSet): String;
Var P, PR : PByte;
Size, I : Integer;
Begin
P := PByte(S);
Size := Length(S);
SetLength(Result, Size);
PR := PByte(Result);
I := 0;
While P^ <> $0 Do
Begin
If Not (Chr(P^) In CS) Then
Begin
Pr^ := P^;
Inc(Pr);
End
Else Inc(I);
Inc(P);
End;
If I > 0 Then SetLength(Result, Size - I)
End;