.net你怎么判断字符串是否全是数字
今天在写代码时突然想起测试经常用Microsoft.VisualBasic.Information.IsNumeric判断 url参数是否为数字时的这个方法的效率
因为数字是字符串是直接使用的,所以不需要转型,也就没有用tryparse
结果一测试吓一跳,这个方法的效率是如此的低,再测试了下tryparse还不错,正则的也比较差,
没什么技术含量,看结果吧:
先拓展下字符串:
code
public static class Common { //isDigit public static bool isNumberic1(this string _string) { if (string.IsNullOrEmpty(_string)) return false; foreach (char c in _string) { if (!char.IsDigit(c)) return false; } return true; } //vb isnumberic public static bool isNumberic2(this string _string) { return !string.IsNullOrEmpty(_string) && Microsoft.VisualBasic.Information.IsNumeric(_string); } //try parese public static bool isNumberic3(this string _string) { if (string.IsNullOrEmpty(_string)) return false; int i = 0; return int.TryParse(_string, out i); } //try catch public static bool isNumberic4(this string _string) { if (string.IsNullOrEmpty(_string)) return false; int i = 0; try { int.Parse(_string); } catch { return false; } return true; } //regex public static bool isNumberic5(this string _string) { return !string.IsNullOrEmpty(_string) && Regex.IsMatch(_string, "^\\d+$"); } } class Program
{
static void Main(string[] args)
{
Test("1234");
Test("1234a");
Test("a1234");
Test("");
Test(null);
}
static void Test(string str)
{
bool res1 = false, res2 = false, res3 = false, res4 = false, res5 = false;
Stopwatch wat = new Stopwatch();
wat.Start();
for (int i = 1; i < 100000; i++)
{
res1 = str.isNumberic1();
}
wat.Stop();
Console.WriteLine("isDigit {0}:{1},{2}", str, wat.ElapsedMilliseconds, res1);
wat.Reset();
wat.Start();
for (int i = 1; i < 100000; i++)
{
res2= str.isNumberic2();
}
wat.Stop();
Console.WriteLine("isNumberic {0}:{1},{2}", str, wat.ElapsedMilliseconds, res2);
wat.Reset();
wat.Start();
for (int i = 1; i < 100000; i++)
{
res3 = str.isNumberic3();
}
wat.Stop();
Console.WriteLine("try parse {0}:{1},{2}", str, wat.ElapsedMilliseconds, res3);
wat.Reset();
wat.Start();
for (int i = 1; i < 100000; i++)
{
res4 = str.isNumberic4();
}
wat.Stop();
Console.WriteLine("try catch {0}:{1},{2}", str, wat.ElapsedMilliseconds, res4);
wat.Reset();
wat.Start();
for (int i = 1; i < 100000; i++)
{
res5 = str.isNumberic5();
}
wat.Stop();
Console.WriteLine("regex {0}:{1},{2}", str, wat.ElapsedMilliseconds, res5);
Console.WriteLine();
}
}
[解决办法]
果然快,指针也比不上,我的测试代码如下:
static unsafe bool isNumeric6(this string _string) { if (string.IsNullOrEmpty(_string)) return false; short ch; fixed (void* src = _string) { short* p = (short*)src; while (true) { ch = *p++; if (ch == 0) break; if (ch > 0x39 || ch < 0x30) return false; } } return true; }
[解决办法]
谢谢楼主,分享经验!
[解决办法]
Study
[解决办法]
楼主比较细心
char.IsDigit 处理过程直接透明,其它是封装的函数。
[解决办法]
学习了,呵呵
[解决办法]
Thank you!
[解决办法]
我是进来学习的。
[解决办法]
up
[解决办法]
学习,感谢分享
[解决办法]
我一般直接用val转成数字了。
[解决办法]
up
[解决办法]
顶一个
[解决办法]
很多MS的封装的方法,其实考虑的是很多的情况,当需要满足我们一种特例的需求的时候,肯定效率是低的。
public static bool TryParse(string s, out int result){ return Number.TryParseInt32(s, NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out result);}internal static unsafe bool TryParseInt32(string s, NumberStyles style, NumberFormatInfo info, out int result){ byte* stackBuffer = stackalloc byte[1 * 0x72]; NumberBuffer number = new NumberBuffer(stackBuffer); result = 0; if (!TryStringToNumber(s, style, ref number, info, false)) { return false; } if ((style & NumberStyles.AllowHexSpecifier) != NumberStyles.None) { if (!HexNumberToInt32(ref number, ref result)) { return false; } } else if (!NumberToInt32(ref number, ref result)) { return false; } return true;}private static unsafe bool HexNumberToUInt32(ref NumberBuffer number, ref uint value){ int scale = number.scale; if ((scale > 10) || (scale < number.precision)) { return false; } char* digits = number.digits; uint num2 = 0; while (--scale >= 0) { if (num2 > 0xfffffff) { return false; } num2 *= 0x10; if (digits[0] != '\0') { uint num3 = num2; if (digits[0] != '\0') { if ((digits[0] >= '0') && (digits[0] <= '9')) { num3 += digits[0] - '0'; } else if ((digits[0] >= 'A') && (digits[0] <= 'F')) { num3 += (uint) ((digits[0] - 'A') + 10); } else { num3 += (uint) ((digits[0] - 'a') + 10); } digits++; } if (num3 < num2) { return false; } num2 = num3; } } value = num2; return true;}//考虑了很多很多的情况。//例如环境、是不是十六进制、是不是允许货币表示等。。。//因此效率自然就低了很多例如这个函数可以这样用: string strForParse = "123A"; //十六进制 int dawdwa = 0; bool isOk = Int32.TryParse(strForParse, System.Globalization.NumberStyles.AllowHexSpecifier, System.Globalization.NumberFormatInfo.CurrentInfo, out dawdwa);//转换成功
[解决办法]
谢谢分享
[解决办法]
hello!~
[解决办法]
好贴,该顶
[解决办法]
学习,谢谢!
[解决办法]
学习
[解决办法]
谢谢分享!!!
[解决办法]
我采用的方法是将字符串中的字符一个一个读出来,然后比较ASCII码,只要发现有一个在数字哪个范围之外的就得出“不全是数字”结论,否则直到读完得出“全为数字”
[解决办法]
细心的人能成大事
[解决办法]
不错,收藏下!
[解决办法]
每日一贴
[解决办法]
呵呵,确实很不错,但是每次isDigit的结果值都是0,似乎和其他的方法运行时间没有可比较性,要是能在
Stopwatch wat = new Stopwatch();后面加一句:
wat.Start();
就更能说明这些方法执行的数量级关系了
[解决办法]
谢谢分享,学习了!!
[解决办法]
占楼看看~
[解决办法]
不错·· 分享
[解决办法]
bucuo
[解决办法]
谢谢楼主分享
[解决办法]
谢谢分享经验
[解决办法]
ding
[解决办法]
很感谢,能看出都是强人啊,谢谢
[解决办法]
up
[解决办法]
谢谢分享!!!!
[解决办法]
学习。。。只会用Try/catch...
[解决办法]
恩学习啦, 不错不错啊
[解决办法]
学习
[解决办法]
一直以为 try catch 是最好的,原来我错了!
[解决办法]
nba
顺便谢谢csdn
[解决办法]
07年整理过一个类似的
几种验证字符串是否全为数字方法的比较
没有考虑楼主那么多情况,不过结论基本上是一致的
1、正则表达式
优点:可以验证字符串的格式,比如为正整数、只带2位小数、是否为手机号码等,这是其它方法做不到的,而且需求改变时,只需要修改一下正则表达式就可以了
缺点:效率不是最高的,需要对正则表达式有一定程度的了解
2、VB.NET IsNumeric方法
优点:是现成的方法,用起来方便,且参数为object,并不局限于string
缺点:只能判断所给的参数是否是数值(boolean/byte/int6/int/int6/single/double/decimal),无法作进一步的判断,比如是否为正整数
3、Catch Exception 方法
相对于其它方法而言,这是最应该避免使用的一种方法,在有Exception抛出的时候,消耗大量系统资源
4、Char.IsNumber 方法
优点:C#自带的方法,用起来方便,效率高
缺点:需要自己写方法,同样只能判断是否全为数字,无法作进一步判断
5、比较ASCII码
优点:效率高
缺点:需要自己写方法,同样只能判断是否全为数字,无法作进一步判断
正则适用于带格式,并且不是很频繁的调用中,如果判断是否全是数字,那正则绝不是首选
[解决办法]
学习了.
[解决办法]
up
[解决办法]
学习学习
[解决办法]
顶
[解决办法]
up
[解决办法]
up
[解决办法]
up
[解决办法]
顶下赚点分。。。感觉好久都没赚分了先。。
[解决办法]
赚分来了!
[解决办法]
jf 的
[解决办法]
mark
[解决办法]
顶一下。
[解决办法]
呵呵,谢谢分享哦。
不过我对.net不是很熟。
[解决办法]
谢谢分享
[解决办法]
楼主好有爱,佩服一个
[解决办法]
mark
[解决办法]