【isnumber函数】ISNUMBER函数的用法实例

更新时间:2024-02-15 22:46:01 阅读量: 经典范文大全 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

篇一:别误用IsDigit与IsNumber函数

Char.IsDigit与Char.IsNumber的区别

需要判断Char是否为数字,查看了下MSDN,发现有三种方法:

Char.IsDigit (aChar) 指示指定字符串中位于指定位置处的字符是否属于十进制数字类别

Char.IsNumber(aChar) 指示指定字符串中位于指定位置的字符是否属于数字类别

aChar>='0'&&aChar<='9' 判断aChar是否位于‘0’到‘9’之前 等同于第一种

用.NET Reflector 查看其实现代码:

1. {

2. if (!IsLatin1(c))

3. {

4.return CheckNumber(CharUnicodeInfo.GetUnicodeCategory(c));

5. }

6. if (!IsAscii(c))

7. {

8.return CheckNumber(GetLatin1UnicodeCategory(c));

9. }

10. return ((c >= '0') && (c <= '9'));

11. }

1. {

2. if (!IsLatin1(c))

3. {

4.return (CharUnicodeInfo.GetUnicodeCategory(c) ==

5. nicodeCategory.DecimalDigitNumber);

6. }

7. return ((c >= '0') && (c <= '9'));

8. }

篇二:别误用IsDigit与IsNumber函数

别误用IsDigit与IsNumber函数

1、起因

最近发现程序中有一段控制TextBox数字输入的代码,相信大家都不会太陌生,如下: void int_KeyPress(object sender, 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(char c)

{

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(char c)

{

if (!IsLatin1(c)) return CheckNumber(CharUnicodeInfo.GetUnicodeCategory(c));

if (!IsAscii(c)) return CheckNumber(GetLatin1UnicodeCategory(c)); return c >= '0' && c <= '9';

}

internal static bool CheckNumber(UnicodeCategory uc)

{

switch (uc)

{

case UnicodeCategory.DecimalDigitNumber:

case UnicodeCategory.LetterNumber:

case UnicodeCategory.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(object sender, KeyPressEventArgs e)

{

const char Delete = (char)8;

if (!(e.KeyChar >= '0' && e.KeyChar <= '9') && e.KeyChar != Delete)

{

e.Handled = true;

}

}

篇三:excel函数使用实例20170211

Excel函数使用实例

唱润刚

1 快捷输入

ALT+178 (M2),ALT+179(M3)

Alt+10(代表excel中alt+enter)

2 excel只能显示小数点后6位,多于6位会自动四舍五入到小数点后1位(0.0999999会显示成0.1)或整数位(0.9999999会显示成1)。

在自动筛选时,会按实际数据进行大小对比,比如,0.0999999,当筛选条件为大于等于0.1时,这个数据无法被筛选出来,按0.0999999<0.1对待。

3 引用单元格的各种方法对比

1) Indirect(ref_text,[a1])

[]内参数可以省略

函数只有一个参数(该参数可以再套用其他函数),该参数必须符合单元格表达法,因此函数的合法参数,必须同时含有列号(A、B、C、D等字母)和行号(1、2、3、4等数字)。具体参见以下三种方式;

前两种方式中,我们假设A1单元格的数据是e2,而E2单元格的数据是250。

(1) 简单引用,使用Indirect(a1);

该公式的返回值是250。

Indirect函数内的参数,最终结果只接受文本格式,如果参数是这种a1的引用格式,会先将该引用进行计算,所得的值再作为indirect的参数,也就是说,该引用单元格内的数据必须是一个类似“a1”、“b2”等这种样式的文本,否则的话,最后indirect函数会返回错误值。

顺便说一下,因为这里a1是个变量,所以当公式向左右或上下拖拉时,会自动改变,因此当需要固定参数的时候,需使用$a$1,即Indirect($a$1)。

(2) 列号和行号同时为文本时,使用Indirect(“a1”)

该公式的返回值是e2,而并非E2单元格内的数值。

(3) 以上两种方式的混合方式,列号和行号不同时为文本时,使用连字符&对列号和

行号进行连接;

比如一个是文本一个为引用(或函数),或者两者都是引用(或函数),可以用连字符&,

连接列号和行号,如”a”&b1;”a”&row();a1&”2”;a1&row()。

如:需要引用a1的值,则为=indirect(“a1”),如果需要使用a1单元格内的内容作为参数,则=indirect(a1&a2),其中,a1中应为a、b等字母,a2中应为数字,比如a1为c,a2为2,c2为500,则=indirect(a1&a2)返回值是500。

2) Index(array,row_num,[column_num]),Index(reference,row_num,[column_num],[area_num])

注意[]里的参数在某种条件下是可以省略的。

该函数有两种用法:

第一种是array参数给出一个区域,然后row_num给出行号,column_num给出列号,如果array参数提供的区域只有一列,那么该参数可以省略。

注意这里的行号和列号都是相对于给定区域而言的,都是相对引用。

=index(a:a,1)表示a1单元格。

=index(1:1,2)表示b1单元格。

=index(a:c,3,2)表示b3单元格。

其中a:a表示第一整列,也就是A整列,1:1表示第一整行,以此类推比如b:b,a:c,2:2,1:3等等。 第二种,Reference对一个或多个单元格区域的引用,格式为:(A1:B4,D1:E4,G1:H4),注意这里括号不能忘,然后利用area_num参数表示需要返回的区域数,用1、2、3等数字表示。

比如:=INDEX((A2:C8,A11:C14),3,2,2),最后返回的是第二个区域第二列第三行的数据,也就是B13的值,属于相对行号和列号。

3) Address(row_num,column_num,abs_num,[a1],[sheet_text])

第一个参数表示行号,第二个参数表示列号,第三个可以省略,默认为绝对引用,也就是第一、二两个参数表示的是绝对单元格的行号和列号。最后两个参数通常下省略。

abs_num:1或省略,绝对引用;2 绝对行号,相对列标;3 相对行号,绝对列标;4 相对引用

这里需要注意的是,address返回的是一个单元格表示,而不是该单元格的值,这和indirect函数恰好相反。比如=ADDRESS(1,1),它的返回结果是a1单元格的表示:$A$1,而并不是a1单元格的值。

根据第三个参数的改变,返回值可以如下变化:

=ADDRESS(1,2,2),它的返回值是B$1;

=ADDRESS(1,2,3),它的返回值是$B1;

=ADDRESS(1,2,4),它的返回值是B1;

indirect可以返回单一的单元格,没有数组功能

index函数的行号和列号是相对于引用范围而言的

address利用列号和行号就可以引用某个单元格,默认情况下,这里的行号和列号是相对于整个表格的 4 替换掉单元格内空格

1) 保留两个符号中间的一个,去掉前后的所有空格。

因为在trim公式中,两个字符之间有一个空格的ASCII码值为160,而其他普通空格是32。

=trim()。

2) 替换掉单元格内所有空格

=clean(substitute(a1,char(32),char(7)))

需使用substitute函数,先替换出里面的保留空格。

char(32)普通空格

char(160)特殊空格

CLEAN 函数被设计为删除文本中7位ASCII码的前32个非打印字符(值为 0 到 31)。在Unicode字符集(Unicode:Unicode Consortium 开发的一种字符编码标准。该标准采用多个字节代表每一字符,实现了使用单个字符集代表世界上几乎所有书面语言)中,有附加的非打印字符(值为 127、129、141、143、144 和 157)。CLEAN函数自身不删除这些附加的非打印字符。

clean可以清除0到31的非打印符号,所以可用以下公式替换单元格中所有的空格变成非打印符号以清除空格。其中的7可以换成0到31中的任意数。

5 替换函数有两个:

1) replace()替换掉指定位置的任意字符,将“001-107”数字1加上2。 =REPLACE(D2,FIND("-",D2)-1,1,MID(D2,FIND("-",D2)-1,1)+2)。

2) substitute()替换掉指定字符:=SUBSTITUTE(A1,"123","456",3)。第三个参数用来确定替换掉第几次出现的指定字符,例中指第三次123,用456替换。如不指定,将替换所有的123。

6 Replace和substitute的区别

例如:随机生成身份证号码中的月、日

=REPLACE(A1,IF(LEN(A1)=15,9,11),4,TEXT(INT(RAND()*("12-31"-"1-1")),"MMDD"))

利用文本函数得日期格式,返回由rand函数随机产生日期,由替换函数replace替换原来的日期数据。

REPLACE(old_text,start_num,num_chars,new_text)

第二个参数确定从原文本的第几个字符开始搜索。

这里用replace就是因为,它利用旧数据在原文本中的相对位置为依据,替换掉指定数目的数据,符合本题只能确定替换文本的相对位置的要求。

SUBSTITUTE(text,old_text,new_text,instance_num)

SUBSTITUTE函数是利用查找到的文本出现的次数为依据来替换的,比如a在abcabc中出现两次,那么如果只替换第二次出现的a为d,那么函数可以用=SUBSTITUTE("abcabc","a","d",2),返回值为abcdbc。当确切知道要替换的旧数据出现的次数时,用此函数。当然,如果不指定第四个参数,那么它将替换掉所有符合条件的数据。

7 Countif应用,统计两列单元格中的不同

在C1中输入下面公式,找出b中有a中也有的,每有一个重复增加1。

=countif(a:a,b1)

注:countif第一个参数没法对直接输入或者通过引用计算得到的数组进行操作,必须是单元格区域才行。

Countif第二个参数可以设置通配符,但是查找范围内的格式就必须设置成非数字格式。

8 Match函数

最后一个参数为0时,可以设置通配符查找。默认为1,这时需对查找区域排序,否则可能出现错误。 9 将数字进行舍入

1) 将数字向上舍入

要执行此任务,请使用 ROUNDUP、EVEN 或 ODD 函数。

ROUNDup(number,num_digits) 远离零值,向上(绝对值增加的方向)舍入数字。

EVEN 或 ODD都是向上舍入到最接近的偶数或奇数。即返回沿绝对值增大方向取整后最接近的偶数(奇数)。

2) 将数字向下舍入

ROUNDDOWN(number,num_digits) 靠近零值,向下(绝对值减小的方向)舍入数字。

与int功能类似,区别在于,(1)负数时,int远离0舍入,rounddown接近0舍入;(2)它功能更强大一点,可以指定舍入的位数,即规定舍入到小数点前后几位。

INT(number)将数字向下舍入到最接近的整数。

注意,负数舍入时也是向下,即远离0的方向,而正数时是接近0的方向。

3) 将数字舍入到最接近的数字,即四舍五入法

ROUND(number,num_digits) 返回某个数字按指定位数取整后的数字。按绝对值四舍五入。

4) 将数字的小数部分截去,返回整数

TRUNC(number,num_digits) 函数 TRUNC 直接去除数字的小数部分,而函数 INT 则是依照给定数的小数部分的值,将其四舍五入到最接近的整数。函数 INT 和函数 TRUNC 在处理负数时有所不同:TRUNC(-4.3) 返回 -4,而 INT(-4.3) 返回 -5,因为 -5 是较小的数。

5) 将数字舍入到 0 以上的有效位

要执行此任务,请使用 ROUND、ROUNDUP、ROUNDDOWN、LEN 和 INT 函数。

6) 将数字舍入为指定的倍数

MROUND(number,multiple)将第一个参数四舍五入到最接近第二个参数倍数的数,如果数值 number 除以基数的余数大于或等于基数的一半,则函数 MROUND 向远离零的方向舍入。

CEILING(number,significance) 将参数 Number 向上舍入(沿绝对值增大的方向)为最接近的 significance 的倍数。无论数字符号如何,都按远离 0 的方向向上舍入,但是第一个参数和第二个参数的符号必须保持一致,与他相反的函数是FLOOR(number,significance)。

10 统计一列数据(a列)中出现相同次数的数据的个数

=SUMPRODUCT(--(COUNTIF($A$1:$A$10,$A$1:$A$10)=COLUMN(A:A)))/COLUMN(A:A)

输入到b1,向右拖拉,依次能够得到出现1、2、3次等等的数据统计。这里,用COLUMN(A:A)来控制统计的次数,以便实现向右拖拉时可以自动增加。

11 统计一列数据中数字出现的频率

比如1234,和4567,其中在出现一次一栏中显示123567等几个数字。

需借助辅助列,在e:l行里面输入公式

=MID($A2,COLUMN(A:A),1)

拖拉到所有区域,最大可以统计8位数据。

然后下面为主公式。

=SUMPRODUCT(LARGE(IF(FREQUENCY(LARGE(IF(COUNTIF($E$1:$L$1000,$E$1:$L$1000)=COLUMN(A:A),1,

本文来源:https://www.bwwdw.com/article/a22b.html

Top