gpt4 book ai didi

delphi - 为什么FloatToStr忽略ThousandSeparator?

转载 作者:行者123 更新时间:2023-12-03 15:08:26 25 4
gpt4 key购买 nike

我正在尝试将 Double 和/或货币转换为字符串以在 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() 删除。但由于 ThousandSeparator 是一个 char ,它实际上不能为空。

为了确定,我对 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 吗?

最佳答案

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

Can I always expect FloatToStr to ignore the ThousandSeparator?

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

<小时/>

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

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

关于delphi - 为什么FloatToStr忽略ThousandSeparator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24550702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com