¿Por qué Apache Commons considera '१२३' numérico?


101

Según la documentación de Apache Commons Lang para StringUtils.isNumeric(), la cadena '१२३' es numérica.

Como creí que esto podría ser un error en la documentación, realicé pruebas para verificar la declaración. Descubrí que según Apache Commons es numérico.

¿Por qué esta cadena es numérica? ¿Qué representan esos personajes?


61
Quizás representen dígitos en algún idioma. No todos los idiomas usan los símbolos del 0 al 9 para representar dígitos.
Eran

165
estos son 1, 2 y 3 en hindi
Blip

11
Puede obtener el valor entero mediante Integer.parseInt("१२३").
saka1029

9
@ dan04 Esos no son números, son letras que son populares para representar constantes particulares. Note la diferencia entre ⅯⅭy MC.
gerrit

Respuestas:


198

Porque ese "CharSequence contiene solo dígitos Unicode" (citando su documentación vinculada ).

Todos los caracteres devuelven verdadero para Character.isDigit:

Algunos rangos de caracteres Unicode que contienen dígitos:

  • '\ u0030' a '\ u0039', dígitos ISO-LATIN-1 ('0' a '9')
  • '\ u0660' a '\ u0669', dígitos árabe-índicos
  • '\ u06F0' a '\ u06F9', dígitos extendidos árabe-índicos
  • '\ u0966' a '\ u096F', dígitos Devanagari
  • '\ uFF10' a '\ uFF19', dígitos de ancho completo

Muchos otros rangos de caracteres también contienen dígitos.

१२३ son dígitos devanagari:


11
@Joker_vD así, no se ha especificado el cual sobrecarga, así que sí, claro: Integer.parseInt("222", 2).
Andy Turner

4
@Joker_vD Ni siquiera es difícil; hay muchos idiomas no admitidos. Incluso si es así, está el Chinise 亿, que representa 10 ^ 8 -> esto elevado a 3 provocaría un desbordamiento. Lista de sistemas numéricos
Cedric Reichenbach

13
@CedricReichenbach: La distinción clave es que si bien 亿 es numérico (según los estándares de tener uno de los valores distintos de Ninguno de Numeric_Type, en este caso Numeric_Type = Numeric), no es ningún tipo de dígito . (Incluso si lo fuera, no lo llevaría a la potencia de 3; elevaría la base a varias potencias, no a los dígitos ). parseIntRequiere dígitos, y quizás confusamente, el isNumericmétodo en esta pregunta prueba los caracteres de dígitos decimales ( General_Category = Decimal_Number) en lugar de cualquier categoría más amplia de caracteres numéricos.
user2357112 apoya a Monica

10
El conjunto completo de dígitos de Devangari es ०१२३४५६७८९.
dan04

2
@ v7d8dpo4 (s) preguntó si había una manera Integer.parseInt()de lanzar una excepción para una cadena de entrada numérica de 3 caracteres.
Andy Turner

59

El símbolo १२३ es el mismo que 123 para el idioma nepalí o cualquier otro idioma que use la escritura devanagari , como hindi, gujarati, etc., y por lo tanto es un número para Apache Commons.


3
Esa cosa casi parece "123" en números arábigos.
Panzercrisis

41
Los árabes obtuvieron sus números de los indios.

5
@rahul Los números arábigos son del 1 al 9, no ١-٩ como se piensa comúnmente.
Maroun

26

Puede utilizar Character#getTypepara comprobar la categoría general del personaje:

System.out.println(Character.DECIMAL_DIGIT_NUMBER == Character.getType('१'));

Esto se imprimirá true, lo que es una "evidencia" de que '१' es un número de dígito .

Ahora examinemos el valor Unicode del carácter '१':

System.out.println(Integer.toHexString('१'));
// 967

Este número está en el rango de dígitos Devanagari , que es: \u0966hasta \u096F.

Intenta también:

Character.UnicodeBlock block = Character.UnicodeBlock.of('१');
System.out.println(block.toString());
// DEVANAGARI

Devanagari es:

es un alfabeto abugida (alphasyllabary) de India y Nepal

"१२३" es un "123" (Unicode latino básico).

Leyendo:


1
Es más significativo que sean de tipo DECIMAL_DIGIT_NUMBERque que estén en el DEVANAGARIbloque. También hay letras que no son dígitos en ese bloque.
Andy Turner

23

Si alguna vez desea saber qué propiedades tiene un "carácter" en particular (y hay bastantes), vaya directamente a la fuente: Unicode.org . Tienen herramientas de investigación que pueden mostrarle casi todo lo que le gustaría saber.

TENGA EN CUENTA: Unicode Consortium produce una especificación, no un software. Esto significa que depende de cada proveedor de software implementar la especificación con la mayor precisión posible . Así que, al igual que HTML, JavaScript, CSS, SQL, etc., existe una variación entre diferentes plataformas, lenguajes, etc. Por ejemplo, encontré un error en .NET Framework de Microsoft en el que las letras latinas encerradas en un círculo A-Zy los a-zpuntos de código 0x24B6 a 0x24E9 no se registran correctamente como siendo char.IsLetter = true( informe de error aquí ). Y eso conduce a un comportamiento inesperado en la funcionalidad relacionada, como cuando se llama al TextInfo.ToTitleCase()método ( informe de error aquí ).


1
¡Grandes referencias! (¡Aunque me hacen preguntarme si Unicode se ha
excedido

1
Si desea tener este tipo de referencia disponible localmente, puede instalar uniprops .
TRiG

2
@TRiG Gracias por mencionar eso. Interesante utilidad. Cubre algunas de las funciones que se muestran en los primeros 3 enlaces (el conjunto original), pero acabo de actualizar mi respuesta para incluir algunos enlaces adicionales que muestran consultas más avanzadas que se pueden hacer en Unicode.org que no veo posibles vía uniprops. Además, parece que unipropsestá una versión atrás, ya que Unicode lanzó la versión 9.0 en junio pasado.
Solomon Rutzky

19

Los símbolos '१२३' en realidad se derivan del idioma hindi (básicamente del idioma sánscrito, es decir, Devanagiri) que representan valores numéricos como:

१ representa 1

२ representa 2

y de la misma manera


4
CORRECCIÓN: Los símbolos '१२३' en realidad se derivan del idioma sánscrito (es decir, la escritura devanagiri como han señalado otros carteles)
Happy Green Kid Naps

Me sorprendió saber cuán recientemente Devanāgarī tomó su forma actual, ¡muchos siglos después de que se codificara el sánscrito! Así que soy escéptico ante la afirmación de que los dígitos pertenecen más al sánscrito que a la cultura india en general.
Anton Sherwood
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.