【问题标题】:Other causes for EConvertError with StrToFloat() in Delphi 6 application?Delphi 6 应用程序中使用 StrToFloat() 导致 EConvertError 的其他原因?
【发布时间】:2012-03-27 18:43:33
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: delphi internationalization type-conversion delphi-6


    【解决方案1】:

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

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

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


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

    【讨论】:

    • 再次感谢大卫。现在我只搜索和替换逗号并用小数点替换它们。
    • 是的,你是对的,这就是我正在做的。我只是在评论中输入了错误的答案。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-03
      • 2014-10-31
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 2012-07-20
      • 2014-04-30
      • 2011-05-04
      相关资源
      最近更新 更多