从字符串值中提取数字

时间:2019-12-06 21:54:38

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

我有一个总是以这种格式出现的字符串:

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

例如:TM000013452S20548,PB000013452S3DVSF。

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

3 个答案:

答案 0 :(得分:1)

您可以使用Linq:

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

答案 1 :(得分: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

答案 2 :(得分:0)

如果所有字段的宽度都是固定的,并且您关心的只是第一个整数,那么这很容易;只需使用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);
}

它给出相同的结果。

相关问题