为什么FloatToStr会忽略ThousandSeparator?

时间:2014-07-03 10:04:22

标签: delphi

我正在尝试将Double和/或Currency转换为字符串,以便在SQL调用中使用。这意味着我始终对ThousandSeparator无所事事和DecimalSeparator成为'。'。

感兴趣

当然,由于我的机器的语言环境配置为丹麦语,Windows将返回'。'适用于ThousandSeparator和','适用于DecimalSeparator。因此,我需要补偿语言环境错误的可能情况。

此外,我的代码需要在D2007(由于遗留原因)和XE3中工作。因此代码看起来像这样:

{$IF CompilerVersion>=19}
fms := TFormatSettings.Create(LOCALE_SYSTEM_DEFAULT);
{$ELSE}
GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, fms);
{$IFEND}
fms.ThousandSeparator := '?';
fms.DecimalSeparator := '.';
Result := FloatToStr(Val, fms);
Result := StringReplace(Result, '?', '', [rfReplaceAll]);

当然,有人可能会争辩说,因为我们假设FloatToStr只能使用TFormatSettings'ThousandSeparatorDecimalSeparator使用任何语言环境创建它都是毫无意义的无论如何我们都会覆盖它们。

尽管如此,我认为这是一个非常简单的操作的代码。我也不是ThousandSeparator存在'的粉丝?'然后被StringReplace()删除。但由于ThousandSeparatorchar,因此实际上不能为空。

我在FloatToStrFloatToStrF上进行了一些测试以确定,此时我注意到TFormatSettings.ThousandSeparator被完全忽略了:

fms := TFormatSettings.Create;
fms.ThousandSeparator := 'W';
fms.DecimalSeparator := '.';
Writeln(FloatToStr(1234567.8901, fms));
Writeln(FloatToStrF(1234567.8901, ffFixed, 18, 4, fms));

我希望每个结果都是'1W234W567.8901',但它只是'1234567.8901'。所以我想知道这是预期的行为还是奇怪的。

因为即使我无法避免TFormatSettings,如果我至少可以忽略ThousandSeparator,我想我会保存两行代码(不是我认为那么重要),但这样做会安全吗?我是否可以始终期望FloatToStr忽略ThousandSeparator

1 个答案:

答案 0 :(得分:8)

只有某些浮点格式会记录千位分隔符。 FloatToStr是一个函数,因为它使用TFloatFormat enumerated typeffGeneral值。

  

我是否可以一直期望FloatToStr忽略ThousandSeparator?

是的,FloatToStr始终忽略千位分隔符。


如果您希望显示千位分隔符,请使用ffNumber。例如%n number format string

Writeln(Format('%n', [1234567.8901]));