2009-12-12 29 views
4

J'ai ce problème bizarre qu'un converti d'une chaîne sur ma machine et un serveur de production obtient des résultats différents par exemple:Delphi 5 - StrToFloat résultats differntly sur Windows XP et Win2K

procedure TForm1.Button1Click(Sender: TObject); 
var 
    s1: string; 
    f1: double; 
begin 
    s1 := '1.234'; 
    f1 := StrToFloat(s1); 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
var 
    s2: string; 
    f2: double; 
begin 
    s2 := '1,234'; 
    f2 := StrToFloat(s2); 
end; 

résultats Button1Click sur ma machine Windows XP en un '1.234' n'est pas une valeur à virgule flottante valide alors que sur la machine Win2K cela fonctionne très bien. Button2Click sur l'autre extrémité se comporte sur mon WinXP mais résultera en un '1.234' n'est pas une erreur de valeur de virgule flottante valide.

Les deux machines ont des paramètres régionaux réglés sur « allemand (Autriche) » - toute idée pourquoi cela se passe ou tout au moins pourquoi la boîte de dialogue régionale paramètres ne présente un caractère DecimalSeparator différent de Delphi « DecimalSeparator » et « GetLocaleChar (GetThreadLocale, LOCALE_SDECIMAL, '.)?

Cordialement, Reinhard

Répondre

12

la DecimalSeparator variable stocke la valeur du séparateur décimal de Windows tel que défini dans les paramètres régionaux. Si une virgule apparaît dans la chaîne convertir avec le StrToFloat fonction, il doit correspondre à la valeur DecimalSeparator en cours. Je crois que bien que les paramètres régionaux correspondent au séparateur décimal doit être différent dans les deux systèmes. vous pouvez vérifier avec ce code les valeurs définies dans les deux systèmes.

uses 
Windows; 

procedure TForm1.Button3Click(Sender: TObject); 
Var 
StrDummy : string; 
begin 
StrDummy:='Decimal Separator in Windows '+GetLocaleChar(GetThreadLocale, LOCALE_SDECIMAL, '.')+#13#10+ 
      'Decimal Separator in Delphi '+DecimalSeparator; 
ShowMessage(StrDummy); 

end; 
+0

thx, c'est ce que je pensais aussi, alors j'ai imprimé la DecimalSeparator et il a montré différent de ce que montrait dans les RegionalSettings que ce qui est dans « DecimalSeparator » ou « GetLocaleChar (GetThreadLocale, LOCALE_SDECIMAL, '.) » De toute façon, j'ai réglé et re-régler les paramètres régionaux de l'allemand (Autriche) à l'anglais (UK) et vice versa et vous ne le croirez pas, maintenant tout va bien. – pastacool

+0

Alors, pourquoi n'avez-vous pas marqué cette réponse comme "acceptée"? –