在Delphi 6应用程序中使用StrToFloat()的EConvertError的其他原因?

时间:2012-03-27 18:43:33

标签: delphi internationalization type-conversion delphi-6

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

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

这在大多数PC上运行良好,但是当我尝试对数值使用StrToFloat()时,我的一些国际用户正在获得 EConvertError 。以下是我的日志中的错误消息的具体示例:

  

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

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

那么Delphi 6和国际字符集的细微差别可能会导致这个问题,可能与用户的Windows XP / Win7字符设置有关?注意,我在整个程序中使用标准的Delphi 6“ string ”强制转换字符串,因此我没有看到多字节字符集问题是如何成为根本原因的。有谁有这个问题,知道该怎么办吗?

2 个答案:

答案 0 :(得分:8)

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

  

通常情况下,我希望看到小数点所在的逗号,或其他一些特定于区域设置的标点符号问题,但在这种情况下,数字似乎正常。

您当前的问题只是上述问题的另一面。通常,由于您的区域设置使用.作为分隔符,因此您习惯于在使用,的数据时遇到问题。把你自己置于一个使用,作为分隔符的国家的位置。对于他们来说,当使用.的数据时,他们将习惯于看到异常。


您可以通过规范化输入以使用与计算机区域设置相同的小数分隔符来解决问题。在现代Delphi上,您可以通过使用接收StrToFloat参数的TFormatSettings重载来解决问题,并明确指定.将用作此转换的小数分隔符。遗憾的是,该设施在Delphi 6中不可用。

答案 1 :(得分:1)

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