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

Rob*_*ler 3 delphi type-conversion internationalization 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" 字符串 "强制转换字符串,因此我没有看到多字节字符集问题是如何成为根本原因的.有谁有这个问题,知道该怎么办吗?

Dav*_*nan 8

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

通常情况下,我希望看到小数点所在的逗号或其他一些特定于区域设置的标点问题,但在这种情况下,数字看起来很好.

您目前的问题只是上述问题的另一面.通常,因为您的语言环境.用作分隔符,所以您习惯于在使用数据时遇到问题,.把你自己置于一个,用作分隔符的国家的位置.对于他们来说,他们习惯于在使用数据时看到异常..


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