将字符串中的数字列表转换为数组

时间:2014-03-31 08:50:54

标签: delphi delphi-xe3

我在.txt文件中给出了21个y坐标(在Delphi读取的单个字符串中),这些坐标是在.txt文档中垂直写入的。如何将此字符串拆分为单个值并将其存储在数组中?#34; Farr"?文本文档内容如下所示:

-3
-2.5
-2
...

每个值都需要存储到0 ... 21的常规数组中,如下所示:

Farr:=[-3, -2.5, -2, ...]

谢谢!

3 个答案:

答案 0 :(得分:6)

试试这个:

var
  sl: TStringList;
  i: integer;
  s: string;
  arr: array of double;
begin
  sl := TStringList.Create;
  try
    sl.LoadFromFile(FilePath);
    SetLength(arr, sl.Count);
    for i := 0 to sl.Count - 1 do
      arr[i] := StrToFloat(sl[i]);
  finally
    sl.Free;
  end;
end;

答案 1 :(得分:2)

注意:当我写这个答案时,问题声称多个值出现在一行中,用空格分隔。显然这些信息是错误的。

这个问题有很多部分。请在阅读文档后阅读本答复。有关这方面的一些有用的提示可以在这里找到:How can I search for Delphi documentation?

阅读文件

有很多方法可以做到这一点。也许最简单和最常见的方法是使用TStringList。创建一个,并调用LoadFromFile传递文本文件的名称。

拆分字符串

同样,有很多选择。我可能会选择像StrUtils.SplitString这样的分割函数。

如果您的字符串str包含以空格分隔的值,则可以执行以下操作:

var
  Values: TStringDynArray;
....
Values := SplitString(str, ' ');

当然,现在看起来每行文件都有一个值。在这种情况下,您不需要拆分任何字符串。

将值从字符串转换为实际

请使用StrToFloat

var
  RealValue: Real;
....
RealValue := StrToFloat(StringValue);

这将使用本地用户的区域设置。如果与小数分隔符不匹配,这可能会让您头疼。如果小数分隔符总是,例如.,那么你需要指定它。

var
  RealValue: Real;
  FormatSettings: TFormatSettings;
....
FormatSettings := TFormatSettings.Create;
FormatSettings.DecimalSeparator := '.';
RealValue := StrToFloat(StringValue, FormatSettings);

如果StrToFloat因任何原因失败,则会引发异常。作为替代方案,您可以使用TryStrToFloat来表示使用其Boolean返回值失败。例如:

if not TryStrToFloat(StringValue, RealValue, FormatSettings) then
  .... deal with error

答案 2 :(得分:1)

您可以使用正则表达式来获取匹配数和匹配项。 这是执行此操作的代码,尽管您可能想要更改正则表达式:

MyRegexp := TRegEx.Create('[-+]?[0-9]*\.?[0-9]+');
with MyRegexp.Matches do
  if Count = 21 then //As you always want 21 items
    for i := 0 to 20 do
      FArr[i] := StrToFloat(Item[i]);

当然应该添加错误处理,但这是你想要的基础。此外,如果列表由空格,分号等分隔,则可以,这取决于您的正则表达式。