我在这里做错了什么?我只是想将格式化的字符串转换为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;
答案 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])