我在这里做错什么了?我只想将格式化的字符串转换为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;发布于 2014-09-13 22:45:51
您在这里所做的是正确的,但是您无意中发现了TextToFloat(似乎忽略了ThousandSeparator)的一个错误(如果不是一个错误,至少是一个不太一致的行为),它的内部功能(请看一下Q92265以遵循解决方案)……
作为解决办法,您可以尝试删除组分隔符,方法如下:
StringReplace('3,332.1', ',', '', [rfReplaceAll])发布于 2014-09-14 06:06:40
这种行为是按照设计的。来自文档,我的重点是:
使用StrToFloat将字符串S转换为浮点值.S必须由可选符号(+或-)、带有可选小数点的数字字符串和可选尾数组成。尾数由'E‘或'e’组成,后面跟着一个可选的符号(+或-)和一个整数。忽略前导和尾随空格。 DecimalSeparator全局变量或其TFormatSettings等效值定义用作小数点的字符。1000个分隔符和货币符号不允许在字符串中使用。如果S不包含有效值,StrToFloat将引发EConvertError异常。
因此,将包含数千个分隔符的字符串传递给此函数是错误的。
https://stackoverflow.com/questions/25828219
复制相似问题