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

时间:2015-03-31 07:50:08

标签: delphi variant decimal-point

我有几行简单的代码:

var
  vRecordValue:Double;
begin
  vRecordValue:= someVariant;

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

在生产系统上,我们有一个' 23.4'的变体。并且vRecordValue变为234.我只能重现这是我的系统分隔符是','。在我们的生产系统中,情况确实如此,但我们已经改变了设置,但仍然看到了这种情况。值得注意的是,除了调试模式之外我们无法重现这一点(不知道这里的关系是什么),并通过一个简单的测试。

我通过显式转换修复了此问题:

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

问题:

  1. 还有其他方法可以忽略小数点吗?
  2. 有人可以提供一个参考,说明如何执行从字符串到双精度的默认转换?我想了解其中的差异。
  3. 在首次运行代码时,是否有任何方法可以从值中缓存默认转换中使用的分隔符? ......怀疑但绝望地理解。
  4. 谢谢,

    韦恩。

2 个答案:

答案 0 :(得分:2)

这是您的区域设置

我已经制作了这个samall演示应用程序以便进行测试:

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;

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

答案 1 :(得分:1)

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

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

控制面板>地区和语言>行政>复制设置。

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