从 Variant String 转换为 Double 会忽略小数点

Cast from Variant String to Double ignores decimal point

我有几行简单的代码:

var
  vRecordValue:Double;
begin
  vRecordValue:= someVariant;

其中 someVariant 是一个字符串(类型 256)。

在生产系统上,我们有一个变体“23.4”,vRecordValue 变为 234。我只能重现这个,因为我的系统分隔符是“,”。在我们的生产系统中就是这种情况,但我们已经更改了设置并且仍然看到这种情况发生。有趣的是,除了在调试模式下(不知道这里有什么关系)和通过简单测试,我们根本无法重现这一点。

我通过显式转换解决了这个问题:

vRecordValue:= StrToFloatDef(VarToStrDef(someVariant, '0'), 0);

问题:

  1. 有没有其他方法可以忽略小数点?
  2. 有人可以提供有关如何执行从 string 到 double 的默认转换的参考吗?我想了解其中的区别。
  3. 有没有什么方法可以从代码第一次 运行 时的值中缓存默认转换中使用的分隔符? ... 有疑问但又急于了解。

谢谢,

韦恩。

这是你的区域设置

我制作了这个小型演示应用程序以便对其进行测试:

procedure TForm60.FormCreate(Sender: TObject);
var
  vRecordValue: Double;
  sRecordValue: Variant;
begin
  sRecordValue:= '23.4';
  vRecordValue:= StrToFloatDef(VarToStrDef(sRecordValue, '0'), 0);
  ShowMessage(FloatToStr(vRecordValue));

  sRecordValue:= '23,4';
  vRecordValue:= StrToFloatDef(VarToStrDef(sRecordValue, '0'), 0);
  ShowMessage(FloatToStr(vRecordValue));
end;

在丹麦(我住的地方),我们使用 , 作为十进制分隔符,所以最后一个给了我正确的结果

关于我的第三个问题。这个问题本周再次出现。我没有意识到 locale/regional 设置只是为当前用户设置的。

要复制系统用户的设置,我们需要使用:

控制面板 > 区域和语言 > 管理 > 复制设置。

这就是我在测试时出现不一致的原因。这取决于我的应用程序是 运行 的用户,以及用户设置。