【问题标题】:Delphi 5 - StrToFloat results differntly on WinXP and Win2KDelphi 5 - StrToFloat 在 WinXP 和 Win2K 上的结果不同
【发布时间】:2009-12-12 02:23:21
【问题描述】:

我有一个奇怪的问题,我的机器和生产服务器上的字符串转换得到不同的结果,例如:

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;

在我的 WinXP 机器上的 Button1Click 结果为 '1.234' 不是有效的浮点值,而在 Win2K 机器上这工作得很好。

另一端的 Button2Click 在我的 WinXP 上运行,但确实导致 '1,234' is not a valid floating point value 错误。

两台机器的区域设置都设置为“German(Austria)” - 关于为什么会发生这种情况的任何想法,或者至少为什么区域设置对话框确实显示与 Delphi“DecimalSeparator”和“GetLocaleChar( GetThreadLocale, LOCALE_SDECIMAL, '.')?

问候, 莱因哈德

【问题讨论】:

    标签: delphi delphi-5


    【解决方案1】:

    DecimalSeparator 变量存储区域设置中定义的 Windows 小数分隔符的值。如果要使用 StrToFloat 函数转换的字符串中出现小数点,则它必须与当前的 DecimalSeparator 值匹配。我相信虽然区域设置匹配小数点分隔符在两个系统中一定是不同的。您可以使用此代码检查两个系统中设置的值。

    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;
    

    【讨论】:

    • thx,这也是我的想法,所以我打印了 DecimalSeparator,它显示的内容与区域设置中显示的内容不同,而不是“DecimalSeparator”或“GetLocaleChar(GetThreadLocale,LOCALE_SDECIMAL,'。” )" 无论如何,我已经设置并重新设置了从德语(奥地利)到英语(英国)的区域设置,反之亦然,你不会相信的,现在一切都好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 2016-07-16
    • 2018-07-06
    相关资源
    最近更新 更多