【问题标题】:Is there a .NET equivalent to C's atoi function?是否有与 C 的 atoi 函数等效的 .NET?
【发布时间】:2010-11-09 01:42:11
【问题描述】:

如果我有这样的字符串:

"26 things"

我想把它转换成26。我只想要字符串开头的整数。

如果我使用的是 C,我只会使用 atoi 函数。但我似乎在 .NET 中找不到任何等价物。

从字符串开头获取整数的最简单方法是什么?

编辑:对不起,我模棱两可。在字符串中寻找空格字符的答案在许多情况下都有效(甚至可能是我的)。我希望在 .NET 中有一个 atoi 等效项。答案也应该适用于像“26things”这样的字符串。谢谢。

【问题讨论】:

  • 我很想知道你是如何使用 ATOI() 和空格来做到这一点的。您不能只调用 ATOI(yourString)... 因为该函数首先会根据需要丢弃尽可能多的空白字符,直到找到 first 非空白字符...
  • 我不明白你的问题。 atoi 将返回 26 与任一字符串。
  • 26things without a space 就没有空格,所以 ATOI 不仅会尝试解析 26 而不是整个字符串?
  • atoi 将在第一个非数字处停止。因此 26things 将解析为 26。 atoi 仅考虑空格,因为它跳过了初始空格。一旦找到数字,它将停在任何非数字字符处。 26.9 将解析为 26。

标签: .net atoi


【解决方案1】:

直接等效的是 int.Parse(string) 但我不完全确定它是否只取起始数字。

【讨论】:

  • 我认为您可能必须自己编写一个特定的函数来获取数字部分,也许使用.NET String.Substring() 函数..?
  • 对非数字数据抛出异常。
  • 是的 - 我就是这么怀疑的。
  • @Jeremy Stein:使用 int.TryParse() 代替
  • @Jasper Bekkers:TryParse 会给我 0。
【解决方案2】:

我可以这样想:

    public static string Filter(string input, string validChars) {
        int i;
        string result = "";
        for (i = 0; i < input.Length; i++) {
            if (validChars.IndexOf(input.Substring(i, 1)) >= 0) {
                result += input.Substring(i, 1);
            } else break;
        }
        return result ;
    }

并称之为:

Filter("26 things", "0123456789");

【讨论】:

  • 我认为如果你要走那条路,那么你应该只使用正则表达式。
  • 好吧,你也许是对的......但无论如何我的解决方案比使用 .IndexOf(" ") 的解决方案要好
【解决方案3】:

你可以使用Int32.Parse(stringVal.Substring(0, stringVal.indexOf(" "))

【讨论】:

  • 这对我有用。我想知道是否有更类似于 atoi 的答案,不需要数字后跟空格。
【解决方案4】:

这应该可以工作(编辑为忽略字符串开头的空格)

int i = int.Parse(Regex.Match("26 things", @"^\s*(\d+)").Groups[1].Value);

如果您担心检查是否有值,如果字符串的开头没有整数,您可以执行以下操作以给您一个 -1 值。

Match oMatch = Regex.Match("26 things", @"^\s*(\d+)");
int i = oMatch.Success ? int.Parse(oMatch.Groups[1].Value) : -1;

【讨论】:

  • 哦,拜托,这样一个微不足道的任务没有正则表达式。
  • @Noldorin - 为什么不呢,这是对正则表达式的完全有效使用。我不知道为什么仅仅因为你会做不同的事情就需要投反对票?
  • @Noldorin:为什么不呢?对于像这样的简单任务,正则表达式实际上很容易阅读。老实说,我发现它比您的解决方案更清晰。
  • @Noldorin - 在这种情况下,简单的文本操作不会像正则表达式那样有效或简单。我同意正则表达式可以被滥用,但这是使用正则表达式的好例子。
  • 要匹配atoi,正则表达式应该是^\s*\d+
【解决方案5】:

一种方法是

string sample = "26 things";
int x = int.Parse(sample.Substring(0, sample.IndexOf(" ")));

【讨论】:

  • 不适用于“26things”,这对 atoi 来说没问题
  • 蹩脚的借口,但让我试试:这不是要求。
【解决方案6】:

你必须拆分字符串然后解析它:

var str = "26 things";
var count = int.Parse(str.Split(' ')[0]);

【讨论】:

  • 像 26things 这样的字符串是什么?
  • 问题中没有指定这种格式。如果可能,问题需要澄清。
  • 这首先不是要求.. 使用 ATOI 的人也必须指定指针长度。这是一个有效的选项。
  • @Noldorin - 不正确,他问“从字符串开头获取整数的最简单方法是什么?”,26things 符合这个标准。字符串开头没有提到除整数以外的格式!
  • 好吧,我确实在标题中说过相当于atoi。我会澄清的。
【解决方案7】:

这看起来太漂亮了:

string str = "26 things";
int x = int.Parse(str.TakeWhile(ch => char.IsDigit(ch)).Aggregate("", (s, ch) => s + ch));

而且,对于真正想要 atoi 的人来说,这是一个无聊的解决方案:

[System.Runtime.InteropServices.DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int atoi(string str);

【讨论】:

  • +1 击败了我。正则表达式也可以,但我打算用这个来练习。也符合 OP 明确的要求。
  • 我喜欢这个答案。它符合atoi的精神。我只是觉得这有点难读,至少对我来说是这样,所以我接受了这个正则表达式。
  • +1。我更喜欢 LINQ 而不是正则表达式。您还可以通过添加 SkipWhile 来改进这一点,以忽略数字前的任何文本(如果是“有 26 件事”),它会更加健壮。
  • 要完全匹配atoi功能,首先要修剪字符串。
  • @C.B.您甚至可以将其缩短为 int.Parse(new string(str.Trim().TakeWhile(char.IsDigit).ToArray()))
【解决方案8】:

试试这个:

int i = int.Parse("26 things".Split(new Char[] {' '})[0]);

【讨论】:

    【解决方案9】:

    您可以在 Microsoft.VisualBasic.Conversion 命名空间中调用 Val。在您的场景中,它应该打印“26”。我不知道它在她的场景中是否 100% 兼容。这是规范的链接。

    http://msdn.microsoft.com/en-us/library/k7beh1x9%28VS.71%29.aspx

    【讨论】:

    • 它为字符串“26 123”返回 26123,这不是 atoi 会做的。
    【解决方案10】:

    如果你只想要整数

    public String GetNumber (String input)
    {
        String result = "";
        for (Int32 i = 0; i < input.Length; i++)
        {
            if (Char.IsNumber(input[i]))
            {
                result += input[i];
            }
            else break;
        }
        return result;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-08-06
      • 2015-12-26
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-29
      • 1970-01-01
      • 2012-06-05
      相关资源
      最近更新 更多