java isdigit函数_别误用IsDigit与IsNumber函数
1、起因
最近发现程序中有一段控制TextBox数字输入的代码,相信大家都不会太陌生,如下:
void int_KeyPress(objectsender, KeyPressEventArgs e)
{const char Delete = (char)8;if (!Char.IsDigit(e.KeyChar) && e.KeyChar !=Delete)
{
e.Handled= true;
}
}
乍一看,好像没有啥问题,但是却出现了一个bug,能够输入全角的数字,如:0、1、2、3等。错误的根源就是上面代码中用到的IsDigit函数,于是就有了下面的一番探究,让我们来看看IsDigit函数的真面目。
2、IsDigit函数
查阅MSDN,告知该函数是判断字符是Unicode的十进制数字的函数。在查看其源代码
public static bool IsDigit(charc)
{if (!IsLatin1(c)) return CharUnicodeInfo.GetUnicodeCategory(c) ==UnicodeCategory.DecimalDigitNumber;return c >= '0' && c <= '9';
}
第一行的IsLatin1函数是判断字符是0~255的函数,而全角的0、1、2、3等的Unicode编码不在这个范围,于是就执行了下面这句代码:
CharUnicodeInfo.GetUnicodeCategory(c) == UnicodeCategory.DecimalDigitNumber;
而对于Unicode的分类中,半角的1,2,3和全角的0、1、2、3等都被归为了DecimalDigitNumber,所以对于全角的数字,这个函数返回了true。
还有一个函数IsNumber和IsDigit功能相似,我们是否可以用它来代替呢?看下面的分析
3、IsNumber函数又是何物?
先看看这个函数的定义
public static bool IsNumber(charc)
{if (!IsLatin1(c)) returnCheckNumber(CharUnicodeInfo.GetUnicodeCategory(c));if (!IsAscii(c)) returnCheckNumber(GetLatin1UnicodeCategory(c));return c >= '0' && c <= '9';
}
internal static boolCheckNumber(UnicodeCategory uc)
{switch(uc)
{caseUnicodeCategory.DecimalDigitNumber:caseUnicodeCategory.LetterNumber:caseUnicodeCategory.OtherNumber:return true;
}return false;
}
和IsDigit函数相比有3点区别:
1)多了一个UnicodeCategory.LetterNumber类型
2)多了一个UnicodeCategory.OtherNumber类型
3)多了一个IsAscii的判断(0~127)
很显然IsNumber的范围更广了。下面列举几种IsNumber认为是数字的字符
UnicodeCategory.LetterNumber:Ⅰ、Ⅱ、Ⅲ
UnicodeCategory.OtherNumber:①、②、③
128~255中有哪些字符会被IsNumber认为是数字,有兴趣的可以自己去测试。
测试的方法可以利用这个函数:System.Globalization.CharUnicodeInfo.GetUnicodeCategory(char c) ,返回的是一个UnicodeCategory类型,你可以看看是不是IsNumber的几个类型就知道了。
4、结论
搞清楚了上面这两个函数的内部实现,那么在判断是否是ASCII数字(0~9)的时候,我们就需要注意以下几点了。
1)不能用IsDigit和IsNumber函数判断是否是ASCII数字,这两个函数都有可能把ASCII以外的某些字符当做是数字。
2)尽量用这种方式判断: c >= '0' && c <= '9'(当然也可以用正则表达式)。
3)数字判断的严格性,从严到松依次是:
c >= '0' && c <= '9' ⇒IsDigit ⇒IsNumber
4)修改上面的bug函数作为结束
void int_KeyPress(objectsender, KeyPressEventArgs e)
{const char Delete = (char)8;if (!(e.KeyChar >= '0' && e.KeyChar <= '9') && e.KeyChar !=Delete)
{
e.Handled= true;
}
}
java isdigit函数_别误用IsDigit与IsNumber函数相关推荐
- 数据库创建函数_达梦数据库创建UUID函数
数据库创建函数_达梦数据库创建UUID函数 接触达梦数据库有一段时间了,整理了一些资料,今天分享一下达梦数据UUID自定义函数 UUID函数定义 很多数据库都有提供UUID函数,可是接触达梦数据库后, ...
- c语言isnumber函数的使用方法,Excel中isnumber函数功能的使用方法
你还在为Excel中isnumber函数的使用方法而苦恼吗,今天,学习啦小编就教大家在Excel中isnumber函数功能的使用方法,让你告别Excel中isnumber函数的使用方法的烦恼. Exc ...
- python变量后加点和函数_教你玩转Python函数和变量
什么是函数? 一个程序可以包含多个模块,程序越复杂,包含的模块和功能就越多,模块细分里面包含多个类,类这个概念在任何一门面向对象语言里面都很重要,在类里面最主要的就是包含的函数,函数式实现某一个功能的 ...
- plsql 为空显示 0 的函数_记住这三个检测函数,彻底清除公式当中的0值
一.检测单元格是否为空 在做一些表格计算的时候,我们需要下拉公式,但公式下拉之后会有很多0产生,如果我们不需要这个0,我们可以用ISBLANK函数,根据检测前面的关键单元格是否是空的,然后再用IF函数 ...
- 中的count函数_关于计数的5个函数都不掌握,那就真的Out了!
提起计数,大家肯定会想到Count函数,但如果要附加条件完成计数任务,那还用Count函数吗?答案是No,Why?请看下文. 一.Count函数:统计数字单元格的个数. 方法: 在目标单元格中输入公式 ...
- python入门之函数调用内置函数_第九篇 python基础之函数,递归,内置函数
阅读目录 一 数学定义的函数与python中的函数 二 为何使用函数 背景提要 三 函数和过程 四 函数参数 五 局部变量和全局变量 六 前向引用之'函数即变量' 七 嵌套函数和作用域 八 递归调用 ...
- exit函数_全面深入了解 Python 魔法函数
(点击上方公众号,可快速关注一起学Python) 作者:浪子燕青 链接: http://www.langzi.fun/Python魔法函数.html 魔法函数概念 魔法函数是以双下划线开头 ...
- 未捕获typeerror: $形象。cropper不是函数_没有学不会的python--细说函数
没有学不会的python 函数是什么? 老调常谈,还是那老一套,学习一个东西前,先搞懂是什么,再来学习怎么用. 函数函数,如果你是刚经历过高考肯定很熟悉,数学中就经常出现这个名词,比如什么sin函数, ...
- python fact函数_第5天:Python 函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段,所以我经常说函数是程序员规模化使用的基础. 函数能提高应用的模块性,和代码的重复利用率.在程序设计中,常将一些常用的功能模块编写成函数 ...
最新文章
- WebService using Spring throwed org.xml.sax.SAXException: Bad envelope tag: htm
- django Error: [Errno 10013]
- lua源代码分析01:lua源代码结构分析
- java中鼠标事件_java中检测鼠标事件动作
- 一些奇妙的线段树操作
- Vue.js基础体验(一)
- java中的lombok_如何在Java中使用Lombok删除样板设置器吸气剂
- 【Hbase】HBase界面简介
- html加入购物车的动画,关于购物车添加按钮的动画
- 0501 0503 模块区别_金川区西门子控制器模块CPU313C哪里有
- 【收藏版】长文详解基于并行计算的条件随机场
- android刷机教程 华为,华为的安卓手机该怎么刷机
- 华为发布鸿蒙Beta版公测,华为发布鸿蒙OS 2.0手机开发者Beta版:P40、Mate 30系列可申请公测...
- Java 8 Update 91 (8u91)
- 计算机术语 gc 是什么意思,GC是什么?为什么我们要去使用它
- window7中出现 你需要权限来执行此操作 的解决方法
- 地图php,php调用google地图
- matlab的udt,西门子PLC的UDT是干什么的?如何使用?终于讲清楚了
- 利用无线信号传输的远程红绿灯辨识系统
- 开一个水果店如何进货呢,水果店进货多少
热门文章
- shopee校招笔试考什么?如何准备笔试?
- linux之父进程使用kill函数杀死子进程
- Linux系统Tomcat无法启动问题解决办法
- 数据传输方式(零拷贝)
- Unity3d导入图片自动修改TextureType为Sprite(2D and UI)及设置Packing Tag为文件夹名。
- 【小程序源码】多分类经典语录下载支持一键复制带壁纸,王者改名等功能
- yum php5.3源,怎么使用yum安装php5.3
- linux 虚拟网卡 dpdk,dpdk学习
- c语言讨论学,看看大家都是如何谈论C语言的
- [ReentrantLock] 破坏死锁四个必要条件