首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >德尔福xe5 StrToFloat failure将ThousandSeparator更改为“,”

德尔福xe5 StrToFloat failure将ThousandSeparator更改为“,”
EN

Stack Overflow用户
提问于 2014-09-13 22:10:03
回答 2查看 2K关注 0票数 6

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

代码语言:javascript
复制
  '3,332.1' is not a valid floating point value.  

千位分隔符和十进制分隔符是期望值(',‘和'.')在TFormatSettings中。

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-13 22:45:51

您在这里所做的是正确的,但是您无意中发现了TextToFloat(似乎忽略了ThousandSeparator)的一个错误(如果不是一个错误,至少是一个不太一致的行为),它的内部功能(请看一下Q92265以遵循解决方案)……

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

代码语言:javascript
复制
StringReplace('3,332.1', ',', '', [rfReplaceAll])
票数 3
EN

Stack Overflow用户

发布于 2014-09-14 06:06:40

这种行为是按照设计的。来自文档,我的重点是:

使用StrToFloat将字符串S转换为浮点值.S必须由可选符号(+或-)、带有可选小数点的数字字符串和可选尾数组成。尾数由'E‘或'e’组成,后面跟着一个可选的符号(+或-)和一个整数。忽略前导和尾随空格。 DecimalSeparator全局变量或其TFormatSettings等效值定义用作小数点的字符。1000个分隔符和货币符号不允许在字符串中使用。如果S不包含有效值,StrToFloat将引发EConvertError异常。

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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25828219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档