在C#中,Char.IsDigit()和Char.IsNumber()之间的区别
在C#中,Char.IsDigit()是Char.IsNumber()的一个子集。
一些被认为是“数字”但不是数字字符的字符包括0x00b2和0x00b3,它们是上标2和3('²'和'³'),以及分数的字形,如'¼'、'½'和'¾'。
需要注意的是,Char.IsDigit()返回true的字符有很多不在ASCII范围(0x30到0x39)内,比如泰语数字字符:'๐' '๑' '๒' '๓' '๔' '๕' '๖' '๗' '๘' '๙'。
下面的代码片段可以告诉你哪些字符存在差异:
static private void test() { for (int i = 0; i <= 0xffff; ++i) { char c = (char) i; if (Char.IsDigit( c) != Char.IsNumber( c)) { Console.WriteLine( "Char value {0:x} IsDigit() = {1}, IsNumber() = {2}", i, Char.IsDigit( c), Char.IsNumber( c)); } } }
所以,归根结底,如何确定一个字符是否是0123456789
中的一个呢?
尝试将其解析为一个int类型
如果 ("0123456789".Contains(c))
不需要解析,使用BradleyUffner的解决方法,一个字符就像一个整数。
你的意思是第一行应该是Char.IsNumber()
而不是Char.IsNumeric
吗?
我认为在示例代码中使用Char.MinValue
和Char.MaxValue
更易读。
新手程序员可能会因为字符文字使用双引号而不是单引号而陷入困境。以下是代码,以防有人需要:character >= '0' && character <= '9'
。
该算法跳过了许多Unicode数字码点,因为它将UTF-16码点范围作为BMP中的码点进行评估。例如,'AEGEAN NUMBER ONE'(U+10107)。而应该对码点使用Char.IsNumber String, Int32。
使用c >= '0' && c <= '9'
代替。这样更简洁高效。
哇,Haskell中的`Data.Char.isDigit`和`Data.Char.isNumber`也有类似的区别。
C#中的Char.IsDigit()
和Char.IsNumber()
两个方法之间的区别是什么?
在C#中,Char.IsDigit()
方法用于判断一个字符是否是一个数字字符。它只返回true,当一个字符是Unicode分类中的“DecimalDigitNumber”类别时。
而Char.IsNumber()
方法则稍微复杂一些。C#将字符分组到UnicodeCategory中,其中数字不仅属于一个类别,而是属于3个不同的类别:
1. UnicodeCategory.DecimalDigitNumber:从0到9的字符。Unicode标识为“Nd”(数字,十进制数字)。值为8。
2. UnicodeCategory.OtherNumber:既不是十进制数字也不是字母数字的数字,例如分数1/2。Unicode标识为“No”(数字,其他)。值为10。
3. UnicodeCategory.LetterNumber:用字母表示的数字,而不是十进制数字,例如罗马数字“V”。Unicode标识为“Nl”(数字,字母)。值为9。
Char.IsNumber()
方法将返回true,对于任何属于上述任何一个类别的字符。而Char.IsDigit()
方法只有当字符属于“DecimalDigitNumber”类别时才返回true。
以下是一个示例代码,用于演示这两个方法的区别:
[Test] public void IsNumberTest() { var numberLikes = new[] { UnicodeCategory.DecimalDigitNumber, UnicodeCategory.OtherNumber, UnicodeCategory.LetterNumber }; for (var i = 0; i < 0xffff; i++) { var c = Char.ConvertFromUtf32(i).ToCharArray()[0]; if (numberLikes.Contains(Char.GetUnicodeCategory(c))) { Console.WriteLine(string.Format("{0},{1},{2},{3},{4},{5}", i, c, Char.GetUnicodeCategory(c), i, Char.IsNumber(c), Char.IsDigit(c))); } } }
运行上述代码,将输出以下结果:
int | symbol | UnicodeCategory | IsNumber | IsDigit ----------------------------------------------------- ... 49 | 1 | DecimalDigitNumber | True | True 50 | 2 | DecimalDigitNumber | True | True 51 | 3 | DecimalDigitNumber | True | True 52 | 4 | DecimalDigitNumber | True | True ... 178 | ² | OtherNumber | True | False 179 | ³ | OtherNumber | True | False ... 1632| ٠ | DecimalDigitNumber | True | True 1633| ١ | DecimalDigitNumber | True | True 1634| ٢ | DecimalDigitNumber | True | True ... 2406| ० | DecimalDigitNumber | True | True 2407| १ | DecimalDigitNumber | True | True 2408| २ | DecimalDigitNumber | True | True ...
从输出可以看出,Char.IsNumber()
方法返回true的字符包括十进制数字、其他数字(如分数)和用字母表示的数字(如罗马数字)。而Char.IsDigit()
方法只返回true的字符是十进制数字。
Char.IsNumber()
和Char.IsDigit()
之间的区别是Char.IsNumber()
方法会返回一些人们不认为是数字的字符,因为它们属于Unicode分类中的其他数字和字母数字类别。解决这个问题的方法是根据具体需求选择使用Char.IsDigit()
或Char.IsNumber()
方法。
在C#中,Char.IsDigit()和Char.IsNumber()有着不同的功能。Char.IsDigit()用于判断一个字符是否是十进制数字字符,而Char.IsNumber()用于判断一个字符是否是任何数字Unicode类别的字符。
根据UnicodeCategory的定义,在Unicode字符中,有效的数字字符可以属于以下几个类别:
1. DecimalDigitNumber:十进制数字字符,即范围在0到9之间的字符(Unicode标识为"Nd")。对应的值为8。
2. LetterNumber:用字母表示的数字字符,而不是十进制数字,例如罗马数字中的五,表示为"V"(Unicode标识为"Nl")。对应的值为9。
3. OtherNumber:既不是十进制数字字符,也不是用字母表示的数字字符,例如分数1/2(Unicode标识为"No")。对应的值为10。
总结一下:
- Char.IsDigit()只能判断属于DecimalDigitNumber类别的字符是否是数字字符。
- Char.IsNumber()可以判断属于DecimalDigitNumber、LetterNumber或OtherNumber类别的字符是否是数字字符。
代码示例:
char c = '5'; bool isDigit = Char.IsDigit(c); bool isNumber = Char.IsNumber(c); Console.WriteLine($"IsDigit: {isDigit}"); // 输出:IsDigit: True Console.WriteLine($"IsNumber: {isNumber}"); // 输出:IsNumber: True
通过以上代码示例和解释,我们可以清楚地了解Char.IsDigit()和Char.IsNumber()之间的区别。