Qual é a diferença entre Char.IsDigit()
e Char.IsNumber()
em c #?
146
Char.IsDigit()
é um subconjunto de Char.IsNumber()
.
Alguns caracteres 'numéricos', mas sem dígitos, incluem 0x00b2 e 0x00b3, que são sobrescritos 2 e 3 ('²' e '³') e os glifos que são frações como '¼', '½' e '¾ '
Observe que existem muitos caracteres IsDigit()
retornados true
que não estão no intervalo ASCII de 0x30 a 0x39, como esses caracteres de dígito tailandês: '๐' '๑' '๒' '๓' '๔' '๕' '๖ '' ๗ '' ๘ '' ๙ '.
Este trecho de código informa quais pontos de código diferem:
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()
vez deChar.IsNumeric
na primeira linha?character >= '0' && character <= '9'
.Eu encontrei a resposta:
Conclusão
Char.IsDigit
:Dígitos válidos são apenas membros da
DecimalDigitNumber
categoria.Char.IsNumber
:Os números válidos são membros da
DecimalDigitNumber
,LetterNumber
ouOtherNumber
categoria.fonte
IsNumber(x)
às vezes retornarátrue
para resultados que as pessoas comuns não considerariam um número e aqui está o porquê.O C # agrupa caracteres nos
UnicodeCategory
quais os números não se enquadram em uma única, mas em 3 categorias diferentes:Qualquer coisa que cai para um acima voltará
true
paraIsNumber()
. Pois éIsDigit()
que será apenasUnicodeCategory.DecimalDigitNumber
.Eu escrevi este código para indicar qual é qual: (A tabela não está cheia devido ao tamanho permitido da postagem, mas você deve poder gerá-la e é apenas para fins de exemplo)
O resultado é o seguinte: Como você pode ver, existem coisas que não se espera que sejam 'número'.
fonte