我需要解析出现在字符串开头的十进制整数.
十进制数字后面可能有尾随垃圾.这需要被忽略(即使它包含其他数字.)
例如
"1" => 1
" 42 " => 42
" 3 -.X.-" => 3
" 2 3 4 5" => 2
Run Code Online (Sandbox Code Playgroud)
.NET框架中是否有内置方法来执行此操作?
int.TryParse()
不适合.它允许尾随空格但不允许其他尾随字符.
实现这个很容易,但如果它存在,我宁愿使用标准方法.
Don*_*nut 23
您可以使用Linq执行此操作,不需要正则表达式:
public static int GetLeadingInt(string input)
{
return Int32.Parse(new string(input.Trim().TakeWhile(c => char.IsDigit(c) || c == '.').ToArray()));
}
Run Code Online (Sandbox Code Playgroud)
这适用于您提供的所有示例:
string[] tests = new string[] {
"1",
" 42 ",
" 3 -.X.-",
" 2 3 4 5"
};
foreach (string test in tests)
{
Console.WriteLine("Result: " + GetLeadingInt(test));
}
Run Code Online (Sandbox Code Playgroud)
Yur*_*ich 17
foreach (var m in Regex.Matches(" 3 - .x. 4", @"\d+"))
{
Console.WriteLine(m);
}
Run Code Online (Sandbox Code Playgroud)
每条评论更新
不确定为什么你不喜欢正则表达式,所以我只发布我认为最短的解决方案.
获得第一个int:
Match match = Regex.Match(" 3 - .x. - 4", @"\d+");
if (match.Success)
Console.WriteLine(int.Parse(match.Value));
Run Code Online (Sandbox Code Playgroud)
这样做没有标准的.NET方法 - 虽然我不会惊讶地发现VB在Microsoft.VisualBasic程序集中有一些东西(随.NET一起提供,所以即使从C#中使用它也不是问题).
结果总是非负的(这会使事情变得更容易)吗?
说实话,正则表达式是最简单的选择,但......
public static string RemoveCruftFromNumber(string text)
{
int end = 0;
// First move past leading spaces
while (end < text.Length && text[end] == ' ')
{
end++;
}
// Now move past digits
while (end < text.Length && char.IsDigit(text[end]))
{
end++;
}
return text.Substring(0, end);
}
Run Code Online (Sandbox Code Playgroud)
然后你只需要调用int.TryParse
结果RemoveCruftFromNumber
(不要忘记整数可能太大而无法存储int
).
我喜欢@Donut 的方法。
我想,虽然补充一点,char.IsDigit
并char.IsNumber
还允许一些Unicode字符这是在其他语言和文字(数字见这里)。
如果您只想检查数字 0 到 9,您可以使用"0123456789".Contains(c)
.
三个示例实现:
要删除尾随的非数字字符:
var digits = new string(input.Trim().TakeWhile(c =>
("0123456789").Contains(c)
).ToArray());
Run Code Online (Sandbox Code Playgroud)
要删除前导非数字字符:
var digits = new string(input.Trim().SkipWhile(c =>
!("0123456789").Contains(c)
).ToArray());
Run Code Online (Sandbox Code Playgroud)
删除所有非数字字符:
var digits = new string(input.Trim().Where(c =>
("0123456789").Contains(c)
).ToArray());
Run Code Online (Sandbox Code Playgroud)
当然:int.Parse(digits)
或int.TryParse(digits, out output)