从字符串值中提取数字
Extract number from string value
我有一个总是采用这种格式的字符串:
"TM" + 多个前导 0 + 数字 + 非数字字符 + 字母数字。
例如:TM000013452S20548、PB000013452S3DVSF。
在这种情况下,如何解析(在 C# 代码中)varchar 值以获得 "Number" (13452)?
您可以使用 Linq:
var number = new String(
yourString.Skip(2)
.SkipWhile(s => s == '0')
.TakeWhile(s => Char.IsDigit(s))
.ToArray()
);
您可以使用正则表达式:
(?: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
如果不知道您描述的"Non-Number Character"的位置,请自行查找:
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);
}
它给出了相同的结果。
我有一个总是采用这种格式的字符串:
"TM" + 多个前导 0 + 数字 + 非数字字符 + 字母数字。
例如:TM000013452S20548、PB000013452S3DVSF。
在这种情况下,如何解析(在 C# 代码中)varchar 值以获得 "Number" (13452)?
您可以使用 Linq:
var number = new String(
yourString.Skip(2)
.SkipWhile(s => s == '0')
.TakeWhile(s => Char.IsDigit(s))
.ToArray()
);
您可以使用正则表达式:
(?: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
如果不知道您描述的"Non-Number Character"的位置,请自行查找:
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);
}
它给出了相同的结果。