我正在尝试将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
'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));
我希望每个结果都是'1W234W567.8901',但它只是'1234567.8901'。所以我想知道这是预期的行为还是奇怪的。
因为即使我无法避免TFormatSettings
,如果我至少可以忽略ThousandSeparator
,我想我会保存两行代码(不是我认为那么重要),但这样做会安全吗?我是否可以始终期望FloatToStr
忽略ThousandSeparator
?
答案 0 :(得分:8)
只有某些浮点格式会记录千位分隔符。 FloatToStr
是一个函数,因为它使用TFloatFormat
enumerated type的ffGeneral
值。
我是否可以一直期望FloatToStr忽略ThousandSeparator?
是的,FloatToStr
始终忽略千位分隔符。
如果您希望显示千位分隔符,请使用ffNumber
。例如%n
number format string。
Writeln(Format('%n', [1234567.8901]));