C# 从字符串c中提取双精度值#
我想从字符串中提取doubleC# 从字符串c中提取双精度值#,c#,regex,C#,Regex,我想从字符串中提取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
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];
}
}
private void GetLine(字符串msg、字符串buff、双重numb)
{
复合书写线(味精);
睡眠(50);
buff=comPort.ReadExisting();
睡眠(50);
MatchCollection matches=Regex.matches(buff,@.*?([-]{0,1}*\d+。\d+);
List doubles=新列表();
foreach(匹配中的匹配)
{
字符串值=匹配。组[1]。值;
值=值。替换(“,”);
doubles.Add(double.Parse(value));
睡眠(200);
麻木=双倍[0];
}
}
这段代码适用于我的其他字符串,但“CELL1”包含一个数字,因此我无法获得想要的值“3.55”。有什么想法吗?为什么不简单地拆分此字符串并获取最后一部分
string numberPart = buff.Split().Last();
double num;
bool validNum = double.TryParse(numberPart, NumberStyles.Any, CultureInfo.InvariantCulture, out num);
另一种方法是使用Substring
和LastIndexOf
(如果没有空格,则失败):
要在以下方面提供帮助: 我将使用一个方法返回一个
double?
(double可以为null):
现在,您可以使用该方法,甚至可以知道是否可以成功解析该数字:
double? result = GetNumber("VA VV_CELL1");
bool wasValid = result.HasValue;
if(wasValid)
{
double value = result.Value;
}
你为什么不简单地把这根绳子分开,取最后一部分
string numberPart = buff.Split().Last();
double num;
bool validNum = double.TryParse(numberPart, NumberStyles.Any, CultureInfo.InvariantCulture, out num);
另一种方法是使用Substring
和LastIndexOf
(如果没有空格,则失败):
要在以下方面提供帮助: 我将使用一个方法返回一个
double?
(double可以为null):
现在,您可以使用该方法,甚至可以知道是否可以成功解析该数字:
double? result = GetNumber("VA VV_CELL1");
bool wasValid = result.HasValue;
if(wasValid)
{
double value = result.Value;
}
Try,这个正则表达式:
\s+\d+(.)?\d+
Try,这个正则表达式:\s+\d+(.)?\d+
我假设您想要捕获双精度和整数,否则您可以编写\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]
,因为第一个组总是返回整个捕获我假设您想要捕获双精度和整数,否则您可以编写\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]
,因为第一组总是返回整个捕获我不理解线程的目标。在foreach
循环中,睡眠
只需测试任何非数字字符的值(不包括小数分隔符)在解析之前,您总是希望从字符串中提取最后一个数字?我假设您希望捕获双精度和整数,否则您可以编写\d+\.\d+
。您可以使用\s+\d+(\.\d+)
捕获前面带有空格的十进制数。如果您只想捕获最后一个字段,\s+\d+(\.\d+)$
我不明白线程的目标。在foreach
循环中,睡眠
只需测试任何非数字字符的值(十进制分隔符除外)在解析之前,您总是希望从字符串中提取最后一个数字?我假设您希望捕获双精度和整数,否则您可以编写\d+\.\d+
。您可以使用\s+\d+(\.\d+)
捕获前面带有空格的十进制数。如果只想捕获最后一个字段,\s+\d+(\.\d+)?$
拆分会生成大量临时字符串,在解析大量记录时,这些字符串可能会非常昂贵。如果记录长度固定,行短或记录数少,则可以使用正则表达式overkill@PanagiotisKanavos:在OP的示例中,它生成3个临时字符串。我不认为这是太多的开销。但是,您也可以使用buff.Substring(buff.LastIndexOf(“”)).Trim()。一般来说,regex要贵得多,它帮了大忙@TimSchmelter`private void GetGet(string msg,string buff,double var){comPort.WriteLine(msg);Thread.Sleep(200);buff=comPort.ReadLine();Thread.Sleep(200);string numberPart=buff.Split().Last();double num;bool validNum=double.TryParse(numberPart,NumberStyles.Any,CultureInfo.InvariantCulture,out num);var=num;}`当我调用我的方法GetGet(“VA VV_CELL1”,buff1,var1)时,var1是0,为什么?@xBehemoth:你要么返回num
,要么使参数var
ref
。我更喜欢双GetValue方法(字符串msg,字符串buff,双变量){…返回num;}
spliting生成大量临时字符串,在解析大量记录时,这些字符串的开销可能非常大。但是,如果记录长度固定,行短或记录数少,则可以使用正则表达式overkill@PanagiotisKanavos:在OP的示例中,它生成3个临时字符串。我认为这不会带来太多开销。但是,您也可以使用buff.Substring(buff.LastIndexOf(“”)).Trim()
。通常,正则表达式的费用要高得多,它帮助了很多!@TimSchmelter`private void GetGet(string msg,string buff,double var)