我试图将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()
.但既然ThousandSeparator
是char
,它实际上不是空白.
我运行了一些测试FloatToStr
并FloatToStrF
确定,此时我注意到它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
吗?
只有某些浮点格式记录了千位分隔符.FloatToStr
是一个函数,因为它使用枚举类型的ffGeneral
值.TFloatFormat
我是否可以一直期望FloatToStr忽略ThousandSeparator?
是的,千位分隔符始终被忽略FloatToStr
.
如果您希望显示千位分隔符,请使用ffNumber
.例如%n
数字格式字符串.
Writeln(Format('%n', [1234567.8901]));
Run Code Online (Sandbox Code Playgroud)