5

我知道有一个FormatSettings可用的全局变量,它在启动时使用当前的区域操作系统设置进行初始化。这意味着,当您将字符串转换为数字和签证时,例如在一个 xml 文件中,并且您与其他 PC 交换该文件。可能会发生无法加载此类文件的情况,因为字符串无法再转换回数字。它依赖于DecimaleSeparator.

所以我的问题是:是否有另一个FormatSettings可用的全局变量,可用于将持久数据存储到文本文件中?

例子:

FloatToStr(Value, PersistentFormatSettings);
4

3 回答 3

1

不,没有这样的变量。不过,欢迎您自己定义一个。在一个单元中声明它,然后在需要与语言环境无关的设置的任何地方使用该单元。

于 2013-07-03T13:26:33.060 回答
1

在现代 Delphi 版本中,FormatSettings不推荐使用全局变量(主要是因为它们不是线程安全的)。每个使用格式化变量的 RTL 函数都已被重载以将可选TFormatSettings记录作为输入。这使您不仅可以使用特定于线程的格式设置,还可以在每次使用的基础上自定义格式设置,而不会影响任何其他格式使用。例如:

var
  Fmt: TFormatSettings;
  S: String;
begin
  Fmt := TFormatSettings.Create; // get default settings
  //
  // or:
  // Fmt := TFormatSettings.Create(SomeLocaleID); // get locale-specific settings
  //
  // or:
  // Fmt := TFormatSettings.Create(SomeLocaleName); // get locale-specific settings
  //

  // customize its fields to use whatever you want...
  Fmt.DecimalSeparator := ...;
  Fmt.ThousandSeparator := ...;

  // now format it...
  S := FloatToStr(Value, Fmt);
end;
于 2013-07-03T20:12:50.983 回答
0

使用SysUtils中的FormatSettings变量。因此,您可以节省大量时间(参见 TFormatSettings 构造函数),并且每次转换浮点数时不要初始化这个大记录 - 您不需要创建新的 TFormatSettings 记录。顺便说一句,您可以使用简单的 FloatToStr(val)。

FormatSettings标记为已弃用,但不是线程安全的。您可以从任何线程读取此变量(= 您可以从任何并行线程使用 FloatToStr),但只能从一个线程写入 FormatSettings(例如,在 Core 或主 Form 构造函数中更改分隔符)并且在其他线程开始读取它之前(=使用 FloatToStr)。

于 2018-06-22T19:29:29.720 回答