【问题标题】:delphi xe5 StrToFloat failure changing ThousandSeparator to ','delphi xe5 StrToFloat 将 ThousandSeparator 更改为 ',' 失败
【发布时间】:2014-09-13 22:10:03
【问题描述】:

我在这里做错了什么?我只是想将格式化字符串转换为双精度字符串,并使用作为参数传递给 StrToFloat 的 TFormatSettings。我得到以下异常:

  '3,332.1' is not a valid floating point value.  

千位分隔符和小数分隔符是 TFormatSettings 中的预期值(',' 和 '.')。

procedure TForm2.Button1Click(Sender: TObject);
var
  FS: TFormatSettings; 
  S: String;
  V: double;
begin
  FS:= TFormatSettings.Create; 
  codesite.Send('ThousandSeparator', FS.ThousandSeparator);  //correct ','
  codesite.Send('DecimalSeparator', FS.DecimalSeparator);    //correct '.'
  S := '3,332.1';
  try
    V := StrToFloat(S, FS);
  except on E: Exception do
    ShowMessage(e.Message);
  end;
  CodeSite.Send('S', S);
  CodeSite.Send('V', V);
end;

【问题讨论】:

    标签: delphi delphi-xe5


    【解决方案1】:

    此行为符合设计。来自documentation,我强调:

    使用 StrToFloat 将字符串 S 转换为浮点值。 S 必须包含一个可选的符号(+ 或 -)、带有可选小数点的数字字符串和可选的尾数。尾数由“E”或“e”后跟可选符号(+ 或 -)和整数组成。前导和尾随空格将被忽略。

    DecimalSeparator 全局变量或其等效的 TFormatSettings 定义用作小数点的字符。 字符串中不允许使用千位分隔符和货币符号。如果 S 不包含有效值,则 StrToFloat 会引发 EConvertError 异常。

    因此,将包含千位分隔符的字符串传递给此函数是错误的。

    【讨论】:

    • 为什么 FloatToStrF 放置千位分隔符?我认为这不是一个非常一致的设计......
    • 你可以就设计争论你喜欢的一切。个人觉得设计不错。但认为这是一个错误是错误的。
    • 而关于设计,匹配StrToFloat的函数不是FloatToStr吗?
    • 是的,它可能是。但是有匹配的 FloatToStrF 吗?
    • 如前所述,您认为它不应该被称为 BUG 是正确的,但我认为功能请求是有道理的。
    【解决方案2】:

    您在这里所做的事情是正确的,但是您偶然发现了 Delphi SysUtils 单元的 TextToFloat(它似乎忽略了 ThousandSeparator)内部函数的一个错误(如果不是错误,至少是一个不太一致的行为) (查看Q92265 以遵循决议)...

    作为一种解决方法,您可以尝试以这种方式删除组分隔符:

    StringReplace('3,332.1', ',', '', [rfReplaceAll])
    

    【讨论】:

    • 谢谢!我想知道这是否是一个错误,但很难相信它会存在于一个简单的函数中。我的解决方法是删除千位分隔符,转换按预期工作。
    • 这正是我所做的 (StringReplace)
    • 这不是错误。这是设计使然。文档很清楚。
    • @David Heffernan 如果您看到 Q92265,您会注意到 FloatToStrF 放置千位分隔符,而相反的 StrToFloat 不关心这一点......如果是设计使然,它不是非常一致的设计。这个案子还没有被 embarcadero 关闭,所以我认为他们认为这是一个 BUG
    • 这不是开放的 QC 报告的含义。 QC 报告实际上是一个功能请求。仔细阅读。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多