3

我遇到了一个奇怪的问题,它至少影响了我的 Delphi 6 应用程序的一些国际用户。这是场景:

  • 我的程序定期从充当 HTTP 服务器的外部设备请求状态报告。
  • 设备将状态报告作为响应文档发回,该响应文档具有一系列字段,以名称值对格式的管道字符分隔(例如 - field1=-0.437)。
  • 我将报告字符串拆分为字段,然后再次获取每个字段名称和数值。
  • 我使用 StrToFloat() 将浮点字段值转换为字符串格式,并将该函数的结果分配给Variant变量。

这在大多数 PC 上都可以正常工作,但是当我尝试对数值使用 StrToFloat() 时,我的一些国际用户会遇到EConvertError 。这是我的日志中错误消息的具体示例:

EConvertError:“-0.685”不是有效的浮点值

如您所见,-0.685一个有效的浮点数,但我得到了 EConvertError 异常。通常我希望看到小数点所在的逗号,或者其他一些特定于语言环境的标点符号问题,但在这种情况下,数字看起来很好。此外,据我所知,外部设备甚至没有设置字符集的选项。

那么关于 Delphi 6 和国际字符集的细微差别可能会导致这个问题,可能与用户的 Windows XP/Win7 字符设置有关?请注意,我在整个程序中使用标准的 Delphi 6“字符串”转换字符串,所以我看不出多字节字符集问题如何成为根本原因。有没有人遇到过这个问题并且知道该怎么做?

4

2 回答 2

8

您的远程用户的机器需要,小数点分隔符。当它遇到异常时会引发.EConvertError在期望,作为小数分隔符的机器上(例如大多数欧洲和南美国家)-0.685确实不是有效的浮点值。

通常我希望看到小数点所在的逗号,或者其他一些特定于语言环境的标点符号问题,但在这种情况下,数字看起来很好。

您当前的问题只是上述问题的另一面。通常,由于您的语言环境.用作分隔符,因此您习惯于在使用 data with 时看到问题,。将自己置于一个使用,分隔符的国家/地区的人的位置。对于他们来说,他们将习惯于在.使用 data with 时看到异常。


您可以通过规范化输入以使用与机器语言环境相同的小数分隔符来解决该问题。在现代 Delphi 上,您可以通过使用StrToFloat接收TFormatSettings参数的重载并明确指定.用作此转换的小数分隔符来解决问题。不幸的是,该功能在 Delphi 6 中不可用。

于 2012-03-27T18:58:35.477 回答
1

我为比利时用户遇到了这个问题。我还必须手动替换“。” 或输入数据中的“,”。此外,如果您要将数据插入数据库 (sql),则必须将 ',' 替换为 '.' 在将数据插入数据库期间。

于 2012-03-28T11:12:20.003 回答