Delphi 6应用程序中使用StrToFloat()出现EConvertError的其他原因是什么?

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“string”类型字符串,因此我不知道多字节字符集问题可能是根本原因。是否有人遇到过这个问题,并知道该怎么做?
2个回答

8
你的远程用户机器期望使用 , 作为十进制分隔符。当遇到 . 时,会引发 EConvertError 异常。对于期望使用 , 作为十进制分隔符的机器(例如大多数欧洲和南美洲国家),-0.685 确实不是有效的浮点值。

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

你当前的问题只是上述问题的反面。通常情况下,因为你的语言环境使用 . 作为分隔符,所以当使用 , 的数据时会出现问题。请想象一下来自使用 , 作为分隔符的国家的人的情况。对于他们来说,当使用 . 的数据时,他们将习惯于看到异常。
你可以通过将输入规范化为与机器语言环境相同的十进制分隔符来解决该问题。在现代 Delphi 中,你可以使用接收 TFormatSettings 参数并明确指定此转换要使用 . 作为十进制分隔符的 StrToFloat 重载来解决该问题。不幸的是,Delphi 6 中没有提供此功能。

再次感谢你,David。现在我只需要搜索并替换逗号为小数点。 - Robert Oschler
是的,你说得对,那就是我正在做的事情。我只是在评论中打错了答案。 - Robert Oschler

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接