为什么FloatToStr会忽略ThousandSeparator?

Svi*_*vip 5 delphi

我试图将Double和/或Currency转换为字符串,以便在SQL调用中使用.这意味着我总是对ThousandSeparator什么都没有感兴趣并且DecimalSeparator是'.'.

当然,由于我的机器的语言环境配置为丹麦语,Windows将返回'.' for ThousandSeparator和','for 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]);
Run Code Online (Sandbox Code Playgroud)

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

尽管如此,我认为这是一个非常简单的操作的代码.我也不是那个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));
Run Code Online (Sandbox Code Playgroud)

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

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

Dav*_*nan 8

只有某些浮点格式记录了千位分隔符.FloatToStr是一个函数,因为它使用枚举类型ffGeneral值.TFloatFormat

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

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


如果您希望显示千位分隔符,请使用ffNumber.例如%n 数字格式字符串.

Writeln(Format('%n', [1234567.8901]));
Run Code Online (Sandbox Code Playgroud)