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函数相关推荐

  1. 数据库创建函数_达梦数据库创建UUID函数

    数据库创建函数_达梦数据库创建UUID函数 接触达梦数据库有一段时间了,整理了一些资料,今天分享一下达梦数据UUID自定义函数 UUID函数定义 很多数据库都有提供UUID函数,可是接触达梦数据库后, ...

  2. c语言isnumber函数的使用方法,Excel中isnumber函数功能的使用方法

    你还在为Excel中isnumber函数的使用方法而苦恼吗,今天,学习啦小编就教大家在Excel中isnumber函数功能的使用方法,让你告别Excel中isnumber函数的使用方法的烦恼. Exc ...

  3. python变量后加点和函数_教你玩转Python函数和变量

    什么是函数? 一个程序可以包含多个模块,程序越复杂,包含的模块和功能就越多,模块细分里面包含多个类,类这个概念在任何一门面向对象语言里面都很重要,在类里面最主要的就是包含的函数,函数式实现某一个功能的 ...

  4. plsql 为空显示 0 的函数_记住这三个检测函数,彻底清除公式当中的0值

    一.检测单元格是否为空 在做一些表格计算的时候,我们需要下拉公式,但公式下拉之后会有很多0产生,如果我们不需要这个0,我们可以用ISBLANK函数,根据检测前面的关键单元格是否是空的,然后再用IF函数 ...

  5. 中的count函数_关于计数的5个函数都不掌握,那就真的Out了!

    提起计数,大家肯定会想到Count函数,但如果要附加条件完成计数任务,那还用Count函数吗?答案是No,Why?请看下文. 一.Count函数:统计数字单元格的个数. 方法: 在目标单元格中输入公式 ...

  6. python入门之函数调用内置函数_第九篇 python基础之函数,递归,内置函数

    阅读目录 一 数学定义的函数与python中的函数 二 为何使用函数 背景提要 三 函数和过程 四 函数参数 五 局部变量和全局变量 六 前向引用之'函数即变量' 七 嵌套函数和作用域 八 递归调用 ...

  7. exit函数_全面深入了解 Python 魔法函数

    (点击上方公众号,可快速关注一起学Python) 作者:浪子燕青       链接: http://www.langzi.fun/Python魔法函数.html 魔法函数概念 魔法函数是以双下划线开头 ...

  8. 未捕获typeerror: $形象。cropper不是函数_没有学不会的python--细说函数

    没有学不会的python 函数是什么? 老调常谈,还是那老一套,学习一个东西前,先搞懂是什么,再来学习怎么用. 函数函数,如果你是刚经历过高考肯定很熟悉,数学中就经常出现这个名词,比如什么sin函数, ...

  9. python fact函数_第5天:Python 函数

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段,所以我经常说函数是程序员规模化使用的基础. 函数能提高应用的模块性,和代码的重复利用率.在程序设计中,常将一些常用的功能模块编写成函数 ...

最新文章

  1. WebService using Spring throwed org.xml.sax.SAXException: Bad envelope tag: htm
  2. django Error: [Errno 10013]
  3. lua源代码分析01:lua源代码结构分析
  4. java中鼠标事件_java中检测鼠标事件动作
  5. 一些奇妙的线段树操作
  6. Vue.js基础体验(一)
  7. java中的lombok_如何在Java中使用Lombok删除样板设置器吸气剂
  8. 【Hbase】HBase界面简介
  9. html加入购物车的动画,关于购物车添加按钮的动画
  10. 0501 0503 模块区别_金川区西门子控制器模块CPU313C哪里有
  11. 【收藏版】长文详解基于并行计算的条件随机场
  12. android刷机教程 华为,华为的安卓手机该怎么刷机
  13. 华为发布鸿蒙Beta版公测,华为发布鸿蒙OS 2.0手机开发者Beta版:P40、Mate 30系列可申请公测...
  14. Java 8 Update 91 (8u91)
  15. 计算机术语 gc 是什么意思,GC是什么?为什么我们要去使用它
  16. window7中出现 你需要权限来执行此操作 的解决方法
  17. 地图php,php调用google地图
  18. matlab的udt,西门子PLC的UDT是干什么的?如何使用?终于讲清楚了
  19. 利用无线信号传输的远程红绿灯辨识系统
  20. 开一个水果店如何进货呢,水果店进货多少

热门文章

  1. shopee校招笔试考什么?如何准备笔试?
  2. linux之父进程使用kill函数杀死子进程
  3. Linux系统Tomcat无法启动问题解决办法
  4. 数据传输方式(零拷贝)
  5. Unity3d导入图片自动修改TextureType为Sprite(2D and UI)及设置Packing Tag为文件夹名。
  6. 【小程序源码】多分类经典语录下载支持一键复制带壁纸,王者改名等功能
  7. yum php5.3源,怎么使用yum安装php5.3
  8. linux 虚拟网卡 dpdk,dpdk学习
  9. c语言讨论学,看看大家都是如何谈论C语言的
  10. [ReentrantLock] 破坏死锁四个必要条件