delphi xe5 StrToFloat故障将ThousandSeparator更改为','

Mik*_*son 6 delphi delphi-xe5

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

  '3,332.1' is not a valid floating point value.  
Run Code Online (Sandbox Code Playgroud)

千位分隔符和小数分隔符是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;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 9

此行为是设计的.从文档中,我强调:

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

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

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

  • 在我看来,StrToFloat 函数选择性地允许传递 formatsettings 参数似乎很愚蠢。我想您可能会说该函数想知道哪个字符是小数点,但随后完全忽略千位分隔符。因此,这不是文档中的错误,但在我看来,这是一个令人困惑的设计。 (2认同)

ale*_*oot 3

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

作为解决方法,您可以尝试删除组分隔符,方法如下:

StringReplace('3,332.1', ',', '', [rfReplaceAll])
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个错误。这是设计使然。文档非常清楚。 (5认同)