是否可以使用DecimalSeparator强制Floattostr/Strtofloat函数使用小数点

And*_*y k 10 delphi

目前,我将DecimalSeparator设置为'.' 在每个使用这些功能的程序中.

在程序开始时全局设置它会容易得多,但我发现Delphi似乎会定期将其设置回当前的语言环境.

无论程序使用哪个国家/地区,我都需要确保所有转换都使用小数点,因为这是此类程序的标准,所有文件结构和通信协议,表单/编辑中的数字显示等都是必需的以这种方式格式化.

我在另一个帖子中被告知使用decimalseparator不是正确的方法,但我没有给出任何替代方案.我读过的关于这个主题的其他主题似乎没有提供任何形成性指导或过于复杂.

有一个简单的"正确"方法吗?

And*_*and 20

是的,DecimalSeparatorRTL在运行时可能会改变全局变量,这在几年前引起了很多人的不安,直到我意识到这一点.

问题是,DecimalSeparator由RTL当Windows小数点分隔符改变更新,例如,使用控制面板.这似乎是一个相当小的问题.实际上,最终用户多久更改一次系统的小数分隔符?

最大的问题是每次切换用户(在Windows中)时都会DecimalSeparator更新变量(根据系统设置).这对我来说是一个惊喜.也就是说,如果您的系统设置使用逗号()作为小数点分隔符,并且您在应用程序启动时设置,则在切换用户时将恢复为逗号(当您切换回时,您会注意到).','DecimalSeparator := '.'DecimalSeparator

您可以告诉RTL不要更新小数分隔符

Application.UpdateFormatSettings := false;
Run Code Online (Sandbox Code Playgroud)

无论如何,还有更好的替代方案DecimalSeparator,正如其他答案和评论中所讨论的那样.


NGL*_*GLN 13

我/假设DecimalSeperatorRTL不会触及全局变量.如果没有,那么所有这些例程都有一个FormatSettings可以使用的可选参数.Globaly声明一个TFormatSettings变量并将其用于这些例程的每次出现.

它的一个小好处可能是,当您指定自己的格式设置时,例程是线程安全的.

  • @NGLN:嗯,RTL感动了它.看我的回答. (3认同)

mar*_*kli 7

为了安全起见,我会使用TFormatSettings,这有两个好处:

  1. 格式化是线程安全的,其他代码/库不能影响您的功能.
  2. 您不会影响可能依赖于某些设置的其他代码.

这是一个可能的实现:

function FloatToStrWithDecimalPoint(const Value: Extended; const Format: String = '0.###'): String;
var
  myFormatSettings: TFormatSettings;
begin
  GetLocaleFormatSettings(GetThreadLocale, myFormatSettings);
  myFormatSettings.DecimalSeparator := '.';
  Result := FormatFloat(Format, Value, myFormatSettings);
end;
Run Code Online (Sandbox Code Playgroud)