从字符串c#中提取double值

时间:2017-12-19 12:20:00

标签: c# regex

我想从字符串中提取双精度。

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”任何想法?

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

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

答案 2 :(得分: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],因为第一组始终返回整个捕获