【问题标题】:Delphi decimal separator issueDelphi小数分隔符问题
【发布时间】:2017-10-17 18:25:51
【问题描述】:

我的应用程序在具有区域设置的系统上运行,其中小数分隔符是逗号。 (德尔福 10.1)

我已将点设置为我的应用程序的小数分隔符。

  Application.UpdateFormatSettings := false;
  FormatSettings.DecimalSeparator := '.';
  Application.UpdateFormatSettings := true;

这对我来说很好。

我使用了format('%6.3f', 125.365]) 函数。 exe在系统上24*7开启..

在初始阶段,如 1 或 2 小时格式函数以点作为小数点分隔符正确返回数据,但后来它更改为本地设置逗号

12,365

点如何突然变成逗号?

【问题讨论】:

  • 你看过documentation for UpdateFormatSettings吗? 指定当用户更改系统配置时是否自动更新格式设置。我将其保留为 False
  • 不要依赖FormatSettings的全局设置。程序的任何部分都可以更改设置。也不是线程安全的。在您传递自己的 FormatSettings 记录时使用重载版本的格式化浮点数。
  • 或者,顺其自然,让您的用户以他们期望的形式看到数字。
  • @LURD:谢谢...我会这样做的..它只发生在Delphi更高版本中吗?
  • 我认为是从 Delphi-7 开始的。

标签: delphi format decimal


【解决方案1】:

如果您不想让别人弄乱您的东西,请使用 kragle。
在这种情况下,它是接受 FormatSettings 记录的 Format 的重载版本。

像这样创建一个单元:

unit DecimalPoint;

interface

uses
  System.SysUtils;

var fs: TFormatSettings;

implementation
initialization
  fs:= FormatSettings;
  fs.ThousandSeparator:= ' ';  <<-- don't forget
  fs.DecimalSeparator:= '.'
end.

并在需要的地方将此单元添加到uses

现在像这样使用它:

Str:= Format('%6.3f', 125.365],fs);

【讨论】:

  • 停止将乐高积木拼在一起! (虽然我知道在乐高乐园,他们也这样做)。
  • const cMyFormatSettings : TFormatSettings = (DecimalSeparator : '.'); 更简单。为千位分隔符提供 #0,当不需要这样的字符时有效。
【解决方案2】:

不要依赖全局FormatSettings。使用Format 的第二个重载,它允许您指定自己的TFormatSettings

如果你有更新版本的Delphi,可以直接使用TFormatSettings.Invariant

S := Format('%6.3f', [125.365], TFormatSettings.Invariant)

或者你创建一个新的TFormatSettings:

S := Format('%6.3f', [125.365], TFormatSettings.Create('en-US'));

或者,例如在没有InvariantCreate 方法的版本中,您当然可以“手动”设置值。但是将它们设置在您自己的FormatSettings 中,而不是全局的。

【讨论】:

    【解决方案3】:

    获取本地格式设置并更改它。

    var
      fs:TFormatSettings;
    begin
        fs:=TFormatSettings.Create(GetThreadLocale());
        GetLocaleFormatSettings(GetThreadLocale(),fs);
        fs.DecimalSeparator:='.';
    end
    

    【讨论】:

    • 不,“你必须”不是一个好的措辞。此外,您的示例毫无意义(您创建线程区域设置的新实例,获取默认区域设置,修改它们,仅此而已)。 [没有投票]
    • 我使用了这个并且它有效(在delphi 10.3中)-以前的版本不需要这个
    • 你的例子没有意义。你可以坚持,但没有任何意义。 [我不会在这里投票]
    • 为什么不在 Delphi 10.3 中测试这个?
    • OP 应该如何处理 fs 设置(我知道,但我在你的回答中遗漏了这个)?此外,我会说this answer以适当的方式说同样的话。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2021-09-14
    • 2011-04-15
    相关资源
    最近更新 更多