【问题标题】:Extracting double/decimal number from string? [closed]从字符串中提取双/十进制数? [关闭]
【发布时间】:2011-11-04 00:19:41
【问题描述】:

我需要从以下字符串中提取值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

【问题讨论】:

  • 你试过什么?你搜索过什么? -1,因为这个问题被问得如此频繁(并且有无数微妙的变化)。
  • 首先我尝试在 SQL 中执行此操作: Substring('ABC(MAX)(33345.002)',CHARINDEX('(','ABC(MAX)(33345.002)'),Len('ABC( MAX)(33345.002)')) 但它也抓住了 (MAX)

标签: c# string parsing extract


【解决方案1】:

这真的很简单。 在 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'。

编辑:重新考虑 正则表达式.Match(输入,@"\d+(.\d+)?") 将从字符串中提取双精度/小数,然后如果找到匹配项,您可以使用 double.Parse :)。

编辑 2:顺便说一句,出于某种愚蠢的原因 '\ .'被转义为 '.'关于堆栈溢出。请注意,正则表达式中的小数是转义的(只是 . 匹配任何内容) 编码愉快!

【讨论】:

    【解决方案2】:

    您需要与J-16 SDiZ 提供的与此 SO 的最佳答案相同的正则表达式(包括提到的增强功能):Regular expression for decimal number,但开头没有^,结尾没有$

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

    【讨论】:

    • 如果数字长度不固定怎么办,即C(MCX)(33.09992)
    • 是的,抱歉,忽略了这一点(在英国是就寝时间)。只需将 {1,3} 更改为 +。
    猜你喜欢
    • 2021-12-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多