是否有一个.NET等价于C';s原子函数?

是否有一个.NET等价于C';s原子函数?,.net,atoi,.net,Atoi,如果我有一个字符串,比如: "26 things" 我想把它换成26。我只想要字符串开头的整数 Match oMatch = Regex.Match("26 things", @"^\s*(\d+)"); int i = oMatch.Success ? int.Parse(oMatch.Groups[1].Value) : -1; 如果我用的是C,我只会使用atoi函数。但我似乎在.NET中找不到任何类似的东西 从字符串开头获取整数的最简单方法是什么 编辑:对不起,我模棱两可。在字符串中查

如果我有一个字符串,比如:

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

Match oMatch = Regex.Match("26 things", @"^\s*(\d+)");
int i = oMatch.Success ? int.Parse(oMatch.Groups[1].Value) : -1;
如果我用的是C,我只会使用atoi函数。但我似乎在.NET中找不到任何类似的东西

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


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

直接等价物是int.Parse(string),但我不完全确定这是否只需要起始数字。

我可以这样想:

    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 ;
    }

您可以使用
Int32.Parse(stringVal.Substring(0,stringVal.indexOf(“”))
这应该可以工作(编辑为忽略字符串开头的空白)

如果您担心检查是否有值,那么如果字符串开头没有整数,您可以执行以下操作,为您提供-1值

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

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

您必须拆分字符串,然后对其进行解析:

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

这看起来太漂亮了:

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);
试试这个:

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

您可以在Microsoft.VisualBasic.Conversion命名空间中调用Val。在您的方案中,它应该打印“26”。不过,我不知道它在其他方案中是否100%兼容。这里是指向该规范的链接


如果只需要整数

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;
}
公共字符串GetNumber(字符串输入)
{
字符串结果=”;
for(Int32 i=0;i
我认为您可能需要自己编写一个特定的函数来获取数字部分,可能需要使用.NET字符串.Substring()函数。它会对非数字数据引发异常。是的,这正是我所怀疑的。@Jeremy Stein:使用int.TryParse() instead@Jasper贝克斯:特里帕斯会给我0。哦,拜托,对于这样一个琐碎的任务,没有正则表达式。@Noldorin-为什么不呢,这是正则表达式的一个非常有效的用法。我不知道为什么这需要一个否决票,仅仅因为你会做得不同?@Noldorin:为什么不?对于像这样的简单任务,正则表达式实际上很容易阅读。老实说,我觉得它很清楚比你的解决方案更简单。@Noldorin-在这种情况下,简单的文本操作既不能像正则表达式那样有效,也不能像正则表达式那样简单。我同意正则表达式可以被滥用,但这是使用正则表达式的一个很好的例子。为了匹配atoi,正则表达式应该是^\s*\d+对于像26这样的字符串,什么是?问题中没有指定这种格式。如果可能的话,这个问题需要澄清。这首先不在要求中。。使用ATOI的人也必须指定指针长度。这是一个有效的选项。@Noldorin-不是真的,他问“从字符串开头获取整数的最简单方法是什么?”26件事符合这个标准。这不是一个简单的选项字符串开头不是整数格式的n!好吧,我在标题中说了等同于atoi。我要澄清一下。我认为如果你要走这条路,那么你应该只使用正则表达式。好吧,你可能是对的……但无论如何,我的解决方案比使用.IndexOf(“”)的要好这对我来说是可行的。我想知道是否有一个更像atoi的答案,它不要求数字后面有空格。不适用于“26things”,这对atoiLame来说没有问题。请原谅,让我试试:这不是要求。它为字符串“26123”返回26123这不是atoi会做的。+1击败了我。Regex也很有效,但我一直在练习。也符合OPs澄清的要求。我喜欢这个答案。它符合atoi的精神。我只是觉得它有点难读,至少对我来说,所以我接受了Regex。+1。我更喜欢LINQ而不是Regex。你也可以通过添加SkipWhile以忽略数字前的任何文本(在“有26个东西”的情况下),它将更加健壮。为了完全匹配atoi功能,您应该首先修剪字符串。@C.B.您甚至可以将其缩短为
int.Parse(新字符串(str.trim().TakeWhile(char.IsDigit.ToArray()))
我很想知道如何使用ATOI()在有空格和没有空格的情况下实现这一点。你不能只调用ATOI(你的字符串)…因为函数首先丢弃尽可能多的空白字符,直到找到第一个非空白字符…我不理解您的问题。atoi将返回26个字符串。26没有空格的东西没有空格,所以atoi将尝试解析26个字符,而不是整个字符串?atoi将在第一个停止t非数字。所以26东西将解析为26。atoi只考虑空格,因为它跳过了初始空格。一旦找到数字,它将停止在任何非数字字符。26.9将解析为26。
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;
}