【问题标题】:Unable to convert scientific notation value to decmial无法将科学计数值转换为十进制
【发布时间】:2015-08-06 07:56:47
【问题描述】:

我遵循了Delphi Basic 的示例。我复制了它并且能够在我的 Delphi 2007 中很好地运行它。

所以我构建了自己的程序并使用了上面提到的这种方法,但遇到了错误。错误声明“...引发异常类 EConvertError,消息为“9.702827253E+003”不是有效的浮点值”。

抓挠我的头.....

var
readResult2:WideString;
strSN:String;
strSN2:String;
floatSN:Extended;

readResult2 被读取为'+9.702827253E+003'#$A 时,如手表所示,

strSN := readResult2;  
Delete(strSN,1,1);   
floatSN := StrToFloat(strSN);  //This line created an error
freqSformat.Text := FloatToStr(floatSN);

知道为什么会这样吗?我还是被难住了……

【问题讨论】:

  • 要考虑的另一件事是点,如果您的程序可能会在其他国家/地区运行(或从其他国家/地区获取日期),则可能会有逗号或其他字符而不是点

标签: delphi delphi-2007


【解决方案1】:

问题在于结尾的 #$A 字符。我看不到你的文字来自哪里,但你需要删除那个杂散字符。

StrToFloat('+9.702827253E+003'); // succeeds
StrToFloat('+9.702827253E+003'#$A); // raise EConvertError

调用Trim 将删除它。

StrToFloat(Trim('+9.702827253E+003'#$A)); // succeeds

但您最好还是正确删除它。为了知道如何做到这一点,您首先需要知道它来自哪里。我们不知道。你会的。

【讨论】:

  • 此值是从仪器中捕获的。这就解释了原因。
  • 您需要注意的另一件事是语言环境。如果您在具有使用, 作为小数分隔符的语言环境的机器上执行代码,并且仪器提供以. 作为小数分隔符的文本,那么您将再次陷入困境。
  • System.Val() 始终使用点作为分隔符。所以可以考虑用它代替StrToFloat()
  • @David:确实,如果字符串在我的德语设置中不包含逗号作为小数分隔符,那么它会因 EConvertError 而失败。它不接受句号。但是,正如 LU RD 所说,Val 只接受句号。
  • 大卫,是的,格式设置记录过载,function StrToFloat(const S: string; const AFormatSettings: TFormatSettings): Extended; 是你通常使用的。
猜你喜欢
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
相关资源
最近更新 更多