我想从字符串中提取双精度。
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”任何想法?
答案 0 :(得分:5)
为什么你不简单地拆分这个字符串并取最后一部分?
string numberPart = buff.Split().Last();
double num;
bool validNum = double.TryParse(numberPart, NumberStyles.Any, CultureInfo.InvariantCulture, out num);
另一种方法是使用Substring
和LastIndexOf
(如果没有空格则会失败):
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]
,因为第一组始终返回整个捕获