¿Cuál es la diferencia entre Char.IsDigit()
y Char.IsNumber()
en C #?
146
Char.IsDigit()
es un subconjunto de Char.IsNumber()
.
Algunos de los caracteres que son 'numéricos' pero no dígitos incluyen 0x00b2 y 0x00b3, que están en superíndice 2 y 3 ('²' y '³') y los glifos que son fracciones como '¼', '½' y '¾ '.
Tenga en cuenta que hay bastantes caracteres que IsDigit()
regresantrue
que no están en el rango ASCII de 0x30 a 0x39, como estos caracteres de dígitos tailandeses: '๐' '๑' '๒' '๓' '๔' '๕' '๖ '' ๗ '' ๘ '' ๙ '.
Este fragmento de código le indica qué puntos de código difieren:
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()
lugar deChar.IsNumeric
en la primera línea?character >= '0' && character <= '9'
.Encontré la respuesta:
Conclusión
Char.IsDigit
: Losdígitos válidos son miembros de la
DecimalDigitNumber
categoría solamente.Char.IsNumber
:Los números válidos son miembros de la
DecimalDigitNumber
,LetterNumber
oOtherNumber
categoría.fuente
IsNumber(x)
a veces regresarátrue
para obtener resultados que la persona promedio no consideraría un número y aquí está la razón.C # agrupa caracteres en
UnicodeCategory
donde los números caen no en una sola, sino en 3 categorías diferentes:Todo lo que se encuentre en uno de los anteriores volverá
true
porIsNumber()
. Porque esIsDigit()
solo seráUnicodeCategory.DecimalDigitNumber
.Escribí este bit de código para indicar cuál es cuál: (La tabla no está llena debido al tamaño de publicación permitido, pero debería poder generarla y de todos modos solo tiene fines de ejemplo)
El resultado se ve a continuación: Como puede ver, hay cosas que uno no esperaría que fueran 'números'.
fuente