Jaka jest różnica między Char.IsDigit()
i Char.IsNumber()
w C #?
146
Char.IsDigit()
jest podzbiorem Char.IsNumber()
.
Niektóre znaki, które są „numeryczne”, ale nie są cyframi, to 0x00b2 i 0x00b3 z indeksem górnym 2 i 3 („²” i „³”) oraz glify, które są ułamkami, takie jak „¼”, „½” i „¾” ”.
Zwróć uwagę, że jest sporo znaków, które IsDigit()
powracają true
, które nie należą do zakresu ASCII od 0x30 do 0x39, na przykład te tajskie znaki cyfrowe: '๐' '๑' '๒' '๓' '๔' '๕' '๖ '' ๗ '' ๘ '' ๙ '.
Ten fragment kodu informuje, które punkty kodowe się różnią:
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
?Char.IsNumber()
zamiastChar.IsNumeric
w pierwszej linii?character >= '0' && character <= '9'
.Znalazłem odpowiedź:
Wniosek
Char.IsDigit
:Prawidłowe cyfry są tylko członkami
DecimalDigitNumber
kategorii.Char.IsNumber
:Poprawne numery są członkami
DecimalDigitNumber
,LetterNumber
lubOtherNumber
kategorii.źródło
IsNumber(x)
czasami zwracatrue
wyniki, których przeciętny człowiek nie uznałby za liczbę i oto dlaczego.C # grupuje znaki w
UnicodeCategory
miejscach, w których liczby nie należą do jednej, ale 3 różnych kategorii:Wszystko, co mieści się w jednym z wyżej powróci
true
doIsNumber()
. BoIsDigit()
to będzie tylkoUnicodeCategory.DecimalDigitNumber
.Napisałem ten fragment kodu, aby wskazać, który jest który: (Tabela nie jest pełna ze względu na dozwolony rozmiar postu, ale powinieneś być w stanie ją wygenerować i tak jest tylko na przykład)
Wynik wygląda następująco: Jak widać, są rzeczy, których nikt nie spodziewałby się być „liczbą”.
źródło