C# 从字符串中提取双精度/十进制数?

C# 从字符串中提取双精度/十进制数?,c#,string,parsing,extract,C#,String,Parsing,Extract,我需要从以下字符串中提取值33345.002: "ABC(MAX)(33345.002)" 如何在C#中执行此操作 我试着用SQL处理它,但也得到了(最大值),所以现在我要试试C。 谢谢 . . 这是迄今为止最接近的一次: string temp = "YYY(33345.002)(gg)YYYY"; temp = Regex.Replace(temp, "[^.0-9]", ""); double num; bool success = Double.TryParse(temp, out

我需要从以下字符串中提取值
33345.002

"ABC(MAX)(33345.002)"
如何在C#中执行此操作

我试着用SQL处理它,但也得到了(最大值),所以现在我要试试C。 谢谢 . .

这是迄今为止最接近的一次:

string temp = "YYY(33345.002)(gg)YYYY";
temp = Regex.Replace(temp, "[^.0-9]", "");
double num;
bool success = Double.TryParse(temp, out num);

if (success)
{
//do what ever to the number}
但有一个问题,一些数字前面有零。例如:00033.33

您需要与
J-16 SDiZ
为此SO:提供的顶部答案相同的正则表达式(包括提到的增强),但开头没有
^
,结尾没有
$

下次可能值得在SO或Google上先搜索一下:)

您需要与
J-16 SDiZ
为该SO:提供的顶级答案相同的正则表达式(包括提到的增强功能),但开头没有
^
,结尾没有
$


下次可能值得在SO或Google上搜索一下:)

这真的很简单。 在C中声明要将[0-9]/“0123456789”作为常量绘制的字符# 循环遍历字符串,例如:

public bool TryParseDouble(string input, out double value){
  if(string.IsNullorWhiteSpace(input)) return false;
  const string Numbers = "0123456789.";
  var numberBuilder = new StringBuilder();
  foreach(char c in input) {
    if(Numbers.IndexOf(c) > -1)
      numberBuilder.Append(c);
  }
  return double.TryParse(numberBuilder.ToString(), out value);
}
当然,这可以得到增强(可能只是解析出第一个数字,或者返回一个双倍数组解析出所有数字)——更不用说它将解析出多个小数,这并不是您想要的

在T-SQL中也可以使用相同的技术在字符串上循环,声明有效值,然后使用“in”

编辑:再三考虑 Regex.Match(输入@“\d+(.\d+)?) 将从字符串中提取double/decimal,然后只要使用double.Parse(如果找到匹配项:)

编辑2:顺便说一句,由于某些愚蠢的原因,“\”在堆栈溢出时被转义为“.”。只需注意正则表达式中的小数是转义的(Just.匹配任何内容)
快乐编码

这真的很简单。 在C中声明要将[0-9]/“0123456789”作为常量绘制的字符# 循环遍历字符串,例如:

public bool TryParseDouble(string input, out double value){
  if(string.IsNullorWhiteSpace(input)) return false;
  const string Numbers = "0123456789.";
  var numberBuilder = new StringBuilder();
  foreach(char c in input) {
    if(Numbers.IndexOf(c) > -1)
      numberBuilder.Append(c);
  }
  return double.TryParse(numberBuilder.ToString(), out value);
}
当然,这可以得到增强(可能只是解析出第一个数字,或者返回一个双倍数组解析出所有数字)——更不用说它将解析出多个小数,这并不是您想要的

在T-SQL中也可以使用相同的技术在字符串上循环,声明有效值,然后使用“in”

编辑:再三考虑 Regex.Match(输入@“\d+(.\d+)?) 将从字符串中提取double/decimal,然后只要使用double.Parse(如果找到匹配项:)

编辑2:顺便说一句,由于某些愚蠢的原因,“\”在堆栈溢出时被转义为“.”。只需注意正则表达式中的小数是转义的(Just.匹配任何内容)
快乐编码

你试过什么?你找了什么-1因为这是经常被问到的(并且有无数细微的变化)。首先,我试着用SQL:Substring('ABC(MAX)(33345.002')、CHARINDEX('(','ABC(MAX)(33345.002')、Len('ABC(MAX)(33345.002'))来做这件事,但它抓住了(MAX)的位置。你尝试过什么?你搜索过什么?-1因为这是经常被问到的(还有无数微妙的变化)首先我试着用SQL:Substring('ABC(MAX)(33345.002')、CHARINDEX('(','ABC(MAX)(33345.002))、Len('ABC(MAX)(33345.002'))来做,但是它抓住了(MAX)这个数字,如果数字的长度不是固定的,例如C(MCX)(33.09992)是的,对不起,忽略了那个位(在英国这里是就寝时间)。只需更改{1,3}到+。如果数字的长度不是固定的,即C(MCX)(33.09992)是的,对不起,忽略了该位(在英国是就寝时间)。只需将{1,3}更改为+。