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.
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;
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.
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.
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 ;
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;
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;