从字符串c#中提取double值

问题描述 投票:0回答:3

我想从我的字符串中提取double。

buff = "VA VV_CELL1 3.55"

当我使用以下代码

private void GetLine(string msg, string buff, double numb)
{
    comPort.WriteLine(msg); 
    Thread.Sleep(50);
    buff = comPort.ReadExisting();
    Thread.Sleep(50);
    MatchCollection matches = Regex.Matches(buff, @".*?([-]{0,1} *\d+.\d+)");
    List<double> doubles = new List<double>();
    foreach (Match match in matches)
    {
        string value = match.Groups[1].Value;
        value = value.Replace(" ", "");
        doubles.Add(double.Parse(value));
        Thread.Sleep(200);
        numb = doubles[0];                
    } 
}

这段代码适用于我的其他字符串,但“CELL1”包含一个数字,所以我没有得到想要的值“3.55”任何想法?

c# regex
3个回答
5
投票

为什么你不简单地拆分这个字符串并采取最后一部分?

string numberPart = buff.Split().Last();
double num;
bool validNum = double.TryParse(numberPart, NumberStyles.Any, CultureInfo.InvariantCulture, out num);

另一种方法是使用SubstringLastIndexOf(如果没有空间则会失败):

string numberPart = buff.Substring(buff.LastIndexOf(' ')).Trim();

要帮助your comment

我将使用一个返回double?的方法(double可以为null):

double? GetNumber(string buff)
{
    string numberPart = buff.Split().Last();
    double num;
    bool validNum = double.TryParse(numberPart, NumberStyles.Any, CultureInfo.InvariantCulture, out num);
    if (validNum)
        return num;
    else
        return null;
}

现在您可以使用该方法,甚至可以知道该数字是否可以成功解析:

double? result = GetNumber("VA VV_CELL1");
bool wasValid = result.HasValue;
if(wasValid)
{
   double value = result.Value;
}

0
投票

试试,这个正则表达式:\s+\d+(.)?\d+


0
投票

我假设你想捕获双打和整数,否则你可以写\d+\.\d+。这个 :

Regex.Matches("VA VV_CELL1 3.55",@"\d+\.\d+")[0]

返回3.55但无法捕获355。

您可以使用\s+\d+(\.\d+)?捕获以空格开头的整数或小数。

Regex.Matches("VA VV_CELL1 3.55",@"\s+\d+(\.\d+)?")[0]

当时返回3.55

Regex.Matches("VA VV_CELL1 355",@"\s+\d+(\.\d+)?")[0]

返回355

如果您只想捕获最后一个字段,可以使用\s+\d+(\.\d+)?$,例如:

Regex.Matches("VA VV_CELL1 3.54 3.55",@"\s+\d+(\.\d+)?$")[0]

返回3.55

你不需要修剪空格,因为double.Parse忽略了它。您可以通过用括号括起数字来更改模式以在单独的组中捕获数字:

Regex.Matches("VA VV_CELL1 3.54 3.55",@"\s+(\d+(\.\d+)?)$")[0].Groups[1]

你需要使用Groups[1],因为第一组总是返回整个捕获

© www.soinside.com 2019 - 2024. All rights reserved.