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

时间:2014-09-13 22:10:04

标签: delphi delphi-xe5

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

  '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;

2 个答案:

答案 0 :(得分:9)

此行为与设计完全相同。从documentation,我强调:

  

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

     

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

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

答案 1 :(得分:3)

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

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

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