从字符串中提取双/十进制数?

时间:2011-11-04 00:19:42

标签: c# string parsing extract

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

"ABC(MAX)(33345.002)"

如何在C#中执行此操作?

我尝试在SQL中处理它但是也接受了(MAX)所以现在我要尝试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

2 个答案:

答案 0 :(得分:3)

这非常简单。 在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);
}

Ofcoarse可以增强(也许只是解析出第一个数字,或者返回一个解析所有数字的双精度数组) - 更不用说它会解析出多个小数,这并不是你想要的。

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

编辑:第二个想法     Regex.Match(输入,@“\ d +(。\ d +)?”) 将从字符串中提取双/小数然后你可以使用double.Parse如果找到匹配:)。

编辑2:顺便说一句愚蠢的理由'\。'被转义为'。'在Stack Overflow上。请注意,正则表达式中的小数被转义(只是。匹配任何东西) 快乐的编码!

答案 1 :(得分:0)

对于此SO J-16 SDiZ,您需要^作为首要答案提供的相同正则表达式(包括所提及的增强功能),但开头没有$且{{ 1}}在最后。

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