解析双字符串

时间:2018-01-09 16:26:04

标签: c# string parsing double

我需要解析它包含的双精度字符串并将其存储在双精度列表中,以便稍后我可以获取值并将它们存储在变量中。

enter image description here

你可以在richtextbox的图片上看到我现在有字符串内容我试图像这样解析它

public void GetAll()
{       
   List<double> doubles = new List<double>();
   MatchCollection matches = Regex.Matches(buff, @"(([-]|[+])?\d+[.]\d+)");         
   foreach (Match match in matches)
   {
       string val = match.Groups[1].Value;
       doubles.Add(double.Parse(val));        
   }
}

它并没有将双打存储在列表中 我需要存储它们,以便它们显示doubles[0] = vv_in的值,doubles[1] = vv_out的值等等。

4 个答案:

答案 0 :(得分:4)

您想要存储可能位于字符串末尾的double吗?我使用这种方法:

List<double> doubles = new List<double>();
string[] lines = yourTextBox.Lines;
foreach(string line in lines)
{
    int lastSpaceIndex = line.LastIndexOf(' ');
    string doubleToken = line.Substring(++lastSpaceIndex);
    double d;
    if(double.TryParse(doubleToken, out d))
        doubles.Add(d);
}

答案 1 :(得分:1)

如果没有您的数据,无法真正测试它,但这值得一试:

var doubles = from line in buff.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
              from item in line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
              where double.TryParse(item, out var _)
              select double.Parse(item);

正如评论中所提到的,这使用了丢弃物,这是一种C#7功能。

答案 2 :(得分:0)

实际上你的代码工作得很好。你唯一需要调整的是,Parse需要考虑文化。我改变你的正则表达式,以便它可以处理可选的十进制数字:

List<double> doubles = new List<double>();

MatchCollection matches = Regex.Matches(buff, @"(([-]|[+])?\d+(.\d+)?)");  
foreach (Match match in matches)
{
    string val = match.Groups[1].Value;
    doubles.Add(double.Parse(val, System.Globalization.CultureInfo.InvariantCulture));

}

答案 3 :(得分:-1)

首先应将值拆分为单行,然后将每行划分为空格。最后尝试将获得的数组的第二部分解析为double:

public void GetAll()
{

   List<double> doubles = new List<double>();
   foreach(var line in buff.Split('\n')
   {
       var parts = line.Split();
       if(parts.Length == 3)
       {
           double d;
           if(double.TryParse(parts[2], out d)
               doubles.Add(d);
       }
    }
}