我知道一些方法来检查字符串是否只包含数字: 正则表达式,int。解析,tryparse,循环等等。

谁能告诉我最快的方法是什么?

我只需要检查值,不需要实际解析它。

通过“数字”,我是指具体的ASCII数字:0 1 2 3 4 5 6 7 8 9。

如果字符串是数字,这个问题与Identify不同,因为这个问题不仅是关于如何识别,而且是关于识别的最快方法是什么。


当前回答

public bool CheckforDigits(string x)
{    
    int tr;  
    return x.All(r=> int.TryParse(r.ToString(), out tr));
}

其他回答

这应该可以工作:

Regex.IsMatch("124", "^[0-9]+$", RegexOptions.Compiled)

int。解析或int。TryParse并不总是有效,因为字符串可能包含int类型所能容纳的更多数字。

如果你要做这个检查不止一次,使用一个编译过的正则表达式是有用的——第一次会花费更多的时间,但之后会更快。

下面是一些基于相同字符串的1000000次解析的基准测试:

更新发布数据:

IsDigitsOnly: 384588
TryParse:     639583
Regex:        1329571

下面是代码,看起来IsDigitsOnly更快:

class Program
{
    private static Regex regex = new Regex("^[0-9]+$", RegexOptions.Compiled);

    static void Main(string[] args)
    {
        Stopwatch watch = new Stopwatch();
        string test = int.MaxValue.ToString();
        int value;

        watch.Start();
        for(int i=0; i< 1000000; i++)
        {
            int.TryParse(test, out value);
        }
        watch.Stop();
        Console.WriteLine("TryParse: "+watch.ElapsedTicks);

        watch.Reset();
        watch.Start();
        for (int i = 0; i < 1000000; i++)
        {
            IsDigitsOnly(test);
        }
        watch.Stop();
        Console.WriteLine("IsDigitsOnly: " + watch.ElapsedTicks);

        watch.Reset();
        watch.Start();
        for (int i = 0; i < 1000000; i++)
        {
            regex.IsMatch(test);
        }
        watch.Stop();
        Console.WriteLine("Regex: " + watch.ElapsedTicks);

        Console.ReadLine();
    }

    static bool IsDigitsOnly(string str)
    {
        foreach (char c in str)
        {
            if (c < '0' || c > '9')
                return false;
        }

        return true;
    }
}

当然值得注意的是,TryParse确实允许前导/尾随空白以及区域性特定的符号。弦的长度也有限制。

我喜欢Linq,让它在第一次不匹配时退出,你可以这样做

string str = '0129834X33';
bool isAllDigits = !str.Any( ch=> ch < '0' || ch > '9' );

可能最快的方法是:

myString.All(c => char.IsDigit(c))

注意:如果你的字符串是空的,它将返回True,这是不正确的(如果你不认为空是有效的数字/数字)

public bool CheckforDigits(string x)
{    
    int tr;  
    return x.All(r=> int.TryParse(r.ToString(), out tr));
}