最近在检测字符是否为数字的时候用到了Char.IsDigit(),测试的时候误操作输入了全角字符,以致在做类型转换的时候报了个大大的异常。我忽如其来的好奇心想知道是什么原因?!!!

于是我十指大动用度娘解开了Char.IsDigit()的“神秘面纱”。

判断Char是否为数字有三种方法:

  1. Char.IsDigit (aChar)              指示指定字符串中位于指定位置处的字符是否属于十进制数字类别
  2. Char.IsNumber(aChar)        指示指定字符串中位于指定位置的字符是否属于数字类别
  3. aChar>='0'&&aChar<='9'     判断aChar是否位于‘0’到‘9’之前  等同于第一种

为了更好的学习,我们查看源码可以看到

public static bool IsNumber(char c)
{  if (!IsLatin1(c))  {  return CheckNumber(CharUnicodeInfo.GetUnicodeCategory(c));  }  if (!IsAscii(c))  {  return CheckNumber(GetLatin1UnicodeCategory(c));  }  return ((c >= '0') && (c <= '9'));
}   
public static bool IsDigit(char c)
{  if (!IsLatin1(c))  {  return (CharUnicodeInfo.GetUnicodeCategory(c) == UnicodeCategory.DecimalDigitNumber);  }  return ((c >= '0') && (c <= '9'));
}  

可以看出IsDigit和IsNumber之间有什么区别呢?

从表面上看Char.IsNumber 多了一步检查ASCII码

那可能有好奇心重的小伙伴就要想了:

  • IsLatin1()这个方法是干什么的呢?
  • IsNumber里的CheckNumber()具体是干什么?

下面我们一个一个来说

  • IsLatin1方法是判断字符是0~255的函数,值得注意的是:全角的0、1、2、3、4、5等的Unicode编码不在这个范围
  • CheckNumber方法看一下源码就明白了
 internal static bool CheckNumber(UnicodeCategory uc)
{switch (uc){case UnicodeCategory.DecimalDigitNumber:case UnicodeCategory.LetterNumber:case UnicodeCategory.OtherNumber:return true;}return false;
}

这就能看出IsNumber和IsDigit方法相比有3点区别:
1)多了一个UnicodeCategory.LetterNumber类型

2)多了一个UnicodeCategory.OtherNumber类型

3)多了一个IsAscii的判断(0~127)

显然IsNumber的适用范围更大。

下面列举几种IsNumber认为是数字的字符

UnicodeCategory.LetterNumber:Ⅰ、Ⅱ、Ⅲ

UnicodeCategory.OtherNumber:①、②、③

IsDigit方法在判断全角数字时,因为全角的0、1、2、3等的Unicode编码不在字符是0~255的范围,于是就执行了下面这句代码:

CharUnicodeInfo.GetUnicodeCategory(c) == UnicodeCategory.DecimalDigitNumber;

对于Unicode的分类中,半角的1,2,3和全角的0、1、2、3等都被归为了DecimalDigitNumber,所以对于全角的数字,这个方法返回了true。

结论

有了上面的了解,我们在判断字符是否是数字的时候就需要注意了。

在判断是否是ASCII数字(0~9)的时候,我们需要注意以下几点了。

1)不能用IsDigit和IsNumber函数判断是否是ASCII数字,这两个函数都有可能把ASCII以外的某些字符当做是数字。

2)尽量用这种方式判断: c >= '0' && c <= '9'(当然也可以用正则表达式)。

3)数字判断的严格性,从严到松依次是:

c >= '0' && c <= '9' ⇒IsDigit ⇒IsNumber

小伙伴们,你们会判断字符是否是数字了吗?

Char.IsDigit()或Char.IsNumber判断字符是否为数字,你真的对吗?相关推荐

  1. Java常用方法:StringUtils工具类、去除空格的函数、手机号中间4位换成*、判断字符是否为数字

    isEmpty系列 StringUtils.isEmpty() 是否为空. 可以看到 " " 空格是会绕过这种空判断,因为是一个空格,并不是严格的空值,会导致 isEmpty(&q ...

  2. 【Python系列】之判断字符是否为数字

    序   python下,有个str.isdigit()可能被常用来判断字符是否为数字,但是其只能判断字符型整数.不能判断float型字符例如"12.333".下面给出另外的代码,以 ...

  3. Char.IsDigit与Char.IsNumber的区别[转]

    需要判断Char是否为数字,查看了下MSDN,发现有三种方法: Char.IsDigit (aChar)              指示指定字符串中位于指定位置处的字符是否属于十进制数字类别 Char ...

  4. java char是否为数字_java判断字符是否为数字

    java中判断字符是否数字的方法:(推荐:java视频教程) 方法一:用JAVA自带的函数public static boolean isNumeric(String str){ for (int i ...

  5. python判断字符是否为数字或字母

    str_1 = "1234" str_2 = "Abcd" str_3 = "123Abdc" #用isdigit函数判断是否数字 prin ...

  6. python判断字符是否是数字和字母_python判断字符是否为字母和数字

    在使用python语言中的字符串方法时,可以使用它们判断字符串中是否有字母或数字或其他的构成.下面利用几个实例说明字符串方法的用法,操作如下:云海天教程网,大量的免费python教程,欢迎在线学习!s ...

  7. C语言判断字符是否为数字 如果是输出yes 如果为字母 则大写转换小写 小写转换大写

    #include <stdio.h>int main(void) {char ch;printf("input a char:");ch=getchar();//判断c ...

  8. php 判断字符是否是数字_php判断输入是否是纯数字,英文,汉字的方法

    本文实例讲述了php判断输入是否是纯数字,英文,汉字的方法.分享给大家供大家参考.具体分析如下: 这里利用php的mb_strlen和strlen函数就可以轻松得知字符串的构成是全英文.英汉混合.还是 ...

  9. JS判断字符是否为数字类型

    js有个函数 isNaN(val)//如果是数字则返回 false 使用时候  if(!isNaN(val)){    alert("是数字"); }else{    alert( ...

最新文章

  1. 计算机网络OSI架构详细图
  2. 【Python学习系列二十九】scikit-learn库实现天池平台智慧交通预测赛
  3. Android中解析XML
  4. BZOJ2169 连边(动态规划)
  5. 用workbench给表重命名_MySQL Workbench的使用方法(图文)
  6. excel删除空行_教你简单小妙招将Excel里重复的数据筛选出来!
  7. 【报告分享】2019年中国智能门锁发展与应用白皮书.pdf
  8. 光纤跳线的交叉连接注意点?
  9. 【PID优化】基于matlab天牛须算法PID控制器优化设计【含Matlab源码 1312期】
  10. TensorFlow 莫烦python
  11. layui表单验证,表单提交的若干个方法
  12. 苹果园助力爱奇艺各业务协同作战,视频平台的战争将走向何方?
  13. Java_167_Thread_线程安全synchronized_模拟选座_List「Integer」
  14. CH341A及XTW 2两种SPI FLASH烧录器的硬件使用说明_20220920【可用于升级主板BIOS】
  15. 2022年贵州二级建造师建设工程法规及相关知识模拟题及答案
  16. CSI笔记【5】:Widar2.0: Passive Human Tracking with a Single Wi-Fi Link论文阅读
  17. RapidScada免费开源Scada组态软件系列教程5-系统进阶
  18. eclipse中进行java编程时,CTRL+左键时,看不到源码的解决方法。
  19. WINME/WIN2000/LINUX多重启动详解(4年前写的,不知道现在还有没有用)
  20. 听说你想面对监狱编程,你,够格吗?

热门文章

  1. 【从零开始】PythonOCC
  2. 挑战:对目前所有过图掉线情况和CPU负荷,网络负载的原因分析
  3. Last.fm数据集主要属性:artist,album, and track name
  4. linux桌面环境安装
  5. 飞翼布局短垂起降飞机概念设计--“彩鸿22”舰载无人机
  6. Windows系统安装使用Redis教程
  7. 安卓基本控件与布局的使用
  8. java 开源 server_simplewebserver: SimpleWebServer 是一款使用Java基于NIO编写的超轻量级开源Web Application Server...
  9. 数字化转型人才队伍建设数字化模型-数字化转型网
  10. 【编译原理】学习笔记1 词法分析