【问题标题】:Extract number from string value从字符串值中提取数字
【发布时间】:2019-12-06 21:54:38
【问题描述】:

我有一个总是采用这种格式的字符串:

“TM”+多个前导0+数字+非数字字符+字母数字。

例如:TM000013452S20548、PB000013452S3DVSF。

在这种情况下,如何解析(在 C# 代码中)varchar 值以获取“数字”(13452)?

【问题讨论】:

  • 迭代字符串的每个字符,看是否是数字..追加到str..然后最后解析。
  • int number = int.Parse(string.Concat(input.SkipWhile(c => !char.IsDigit(c) || c == '0').TakeWhile(char.IsDigit)));

标签: c# visual-studio parsing numbers data-extraction


【解决方案1】:

您可以使用 RegualarExpressions:

(?:TM|PB)0{0,}(\d+)

像这样:

string input = "For example: TM000013452S20548, PB000013452S3DVSF.";
var matches = Regex.Matches(input, @"(?:TM|PB)0{0,}(\d+)");
foreach(Match m in matches)
    Console.WriteLine(int.Parse(m.Groups[1].Value));  

Live Demo

【讨论】:

  • 这不起作用,因为 OP 指定输入也可以是 PB000013452S3DVSF。请确保修复正则表达式。
【解决方案2】:

你可以使用 Linq:

var number = new String(
       yourString.Skip(2)
                 .SkipWhile(s => s == '0')
                 .TakeWhile(s => Char.IsDigit(s))
                 .ToArray()
          );

【讨论】:

  • 或者您可以将new String 替换为string.Concat,然后您可以删除.ToArray()(但不确定这有什么不同)
【解决方案3】:

如果所有的字段都是固定宽度的,而你只关心第一个整数,那么这很容易;只需使用string.Substring 提取您关心的部分,然后解析它。

以下是提取和解析的方法(注意我使用int.TryParse - 您正在解析可能损坏的字符串):

private bool TryExtractFirstNumber(string input, out int result)
{
    var resultString = input.Substring(2, 9);
    return int.TryParse(resultString, out result);
}

你可以这样称呼:

var inputs = new[]
{
    "TM000013452S20548",
    "PB000013452S3DVSF",
};
foreach (var inp in inputs)
{
    if (TryExtractFirstNumber(inp, out var result))
    {
        Debug.WriteLine(result);
    }
}

输出是:

13452
13452

如果你描述的“非数字字符”的位置不知道,那就去寻找吧:

private int FindIndexOfFirstNonNumeric(string toScan, int startIndex = 0)
{
    for (var index = startIndex; index < toScan.Length; ++index)
    {
        if (!char.IsNumber(toScan[index]))
        {
            return index;
        }
    }

    return toScan.Length;
}

然后修改TryExtractFirstNumber函数进行查找:

private bool TryExtractFirstNumber(string input, out int result)
{
    var length = FindIndexOfFirstNonNumeric(input, 2) - 2;
    var resultString = input.Substring(2, length);
    return int.TryParse(resultString, out result);
}

它给出了相同的结果。

【讨论】:

    猜你喜欢
    • 2012-02-12
    • 2020-10-06
    • 1970-01-01
    • 2020-07-25
    • 2023-02-07
    • 2021-04-14
    • 1970-01-01
    相关资源
    最近更新 更多