簡體   English   中英

從字符串值中提取數字

[英]Extract number from string value

我有一個總是采用這種格式的字符串:

"TM" + 多個前導 0 + 數字 + 非數字字符 + 字母數字。

例如:TM000013452S20548、PB000013452S3DVSF。

在這種情況下,如何解析(在 C# 代碼中)varchar 值以獲取“數字”(13452)?

您可以使用 Linq:

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

您可以使用 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));  

現場演示

如果所有字段都是固定寬度,並且您只關心第一個整數,那么這很容易; 只需使用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);
}

它給出了相同的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM