【问题标题】:Why does my program keep raising EConvertError when using StrtoFloat() in Delphi 2007 for Win32?为什么我的程序在 Delphi 2007 for Win32 中使用 StrtoFloat() 时不断引发 EConvertError?
【发布时间】:2015-11-18 18:28:42
【问题描述】:

当用户在表单上使用 file>open 提示时,我的程序会获取一个包含 3 列数据的文本文件。但是,我只需要文本文件中的中间数据列来绘制图形(使用TeeChart)。因此,文本文件的中间列存储在字符串数组中

为了绘制图表,我需要使用addXY() 函数。因此,我使用for..do 循环将字符串类型数组的内容转换为浮点类型,然后将其存储到一个名为 display 的新数组中。

但是,当我点击一个按钮(在表单上)来显示图表时,我不断得到

"....引发异常类 EConvertError,消息为 "0.160 '不是有效的浮点值。'"

我查看了之前的问题并尝试将TFormatSettings 成员DecimalSeparator 修改为'.',然后将TFormatSettings 变量传递给StrtoFloat()。我不确定我是否正确实施了这一点,因为它似乎不起作用。如有任何帮助,我将不胜感激。

我对 Delphi 比较陌生,但有使用 C 的经验。

我在下面列出了我的程序:

var
 Form1     : TForm1;
 ft        : text;
 data      : Array[1..10000] of string;
 FS        : TFormatSettings;

implementation
{$R *.dfm}

{Open and store textfile}
procedure TForm1.Open_fileClick(Sender: TObject);
var
 col_1   : String[18];
 col_2   : String[7];
 col_3   : String[10];         //size of each column
 n       : smallint;

 begin
  if OpenDialog1.execute then
  n:=1;
  assignfile(ft,OpenDialog1.FileName);
  reset(ft);
  try
  while not Eof(ft) do
   begin
   Readln(ft, col_1, col_2,col_3);
   data[n]:= col_2;
   inc(n);
   end;

  Showmessage(data[3]); //check if correct value displayed

  finally
  CloseFile(ft);

end;
end;

{Display on TChart}
procedure TForm1.Display_dataClick(Sender: TObject);
var
 n: smallint;
 display : Array[1..10000] of single;
begin
 series1.clear;
 chart1.Title.Text.Clear;
 chart1.Title.Text.add('Output Data, y[n]');   //set up graph


 FillChar(FS, SizeOf(FS), 0);
 FS.DecimalSeparator := '.';      //is this correct?
 for n:=1 to 10000-1 do display[n]:= strtofloat(data[n+2],FS); 

 for n:=0 to 10000-1 do series1.addxy(n/10000,display[n]);
end;
end.

【问题讨论】:

  • 字符串中可能有空格或其他标点符号吗?错误消息似乎表明了这一点。如果有空格,请尝试在 StrToFloat 之前应用 TRIM。
  • 不要使用FillChar() 来初始化TFormatSettings 变量。请改用静态TFormatSettings.Create() 方法之一,例如:FS := TFormatSettings.Create; 无参数Create() 使用默认系统区域设置中的设置进行初始化。其他 Create() 重载允许您通过 ID 或名称指定特定的语言环境。
  • ShowMessage(Data[3]) 应该是 Data[n] 大概。您可能会在列表的稍后部分出现错误。您确定至少有 1000 个非空行吗?
  • 使用不推荐使用的长短字符串的大错误。使用原生字符串类型。
  • @Dsm 哦,对不起,我忘了提到文本文件是三列数字,前两行作为列的标题。这就是为什么我想查看数据[3],以测试它是否读取了列中的正确数字。是的,我想阅读的文本文件中大约有 8000-10000 行。

标签: delphi delphi-2007


【解决方案1】:

您很可能在解析的字符串数据中有一个杂散的回车或换行。避免这种情况的最简单方法是Trim您的条目

data[n]:= Trim(col_2);

这会删除任何杂散的空白(包括 CR/LF)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 2012-07-20
    • 2016-01-22
    相关资源
    最近更新 更多