从具有尾随垃圾的字符串中解析整数

fin*_*nnw 13 .net c# parsing

我需要解析出现在字符串开头的十进制整数.

十进制数字后面可能有尾随垃圾.这需要被忽略(即使它包含其他数字.)

例如

"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)

  • 你为什么打电话给ToCharArray?String已经实现了`IEnumerable <char>`. (3认同)
  • 这是非常低效的,为一个可以用零完成的操作创建至少四个中间对象。 (2认同)

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)


Jon*_*eet 5

这样做没有标准的.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).

  • @Yuriy:恐怕我不明白你的评论。我总是喜欢听听为什么我被否决了,以便我可以改进我的答案。@finnw:是的,这个答案可以很容易地简化为正则表达式 - 我不是根据你在问题中表达的不喜欢正则表达式来这样做的:) 如果你想让我把它放在答案中,请告诉我。 (2认同)
  • 除非你编辑了你的问题,否则他很可能无法移除downvote.有时这个系统是不幸的. (2认同)

Mar*_*man 5

我喜欢@Donut 的方法。

我想,虽然补充一点,char.IsDigitchar.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)