Perché Apache Commons considera "१२३" un valore numerico?


101

Secondo la documentazione di Apache Commons Lang per StringUtils.isNumeric(), la stringa "१२३" è numerica.

Poiché credevo che questo potesse essere un errore nella documentazione, ho eseguito dei test per verificare l'istruzione. Ho scoperto che in base alla Apache Commons si è numerico.

Perché questa stringa è numerica? Cosa rappresentano quei personaggi?


61
Forse rappresentano cifre in qualche lingua. Non tutte le lingue utilizzano i simboli da 0 a 9 per rappresentare le cifre.
Eran

165
questi sono 1, 2 e 3 in hindi
Blip

11
È possibile ottenere il valore intero Integer.parseInt("१२३").
saka1029

9
@ dan04 Quelli non sono numeri, sono lettere popolari per rappresentare costanti particolari. Nota la differenza tra ⅯⅭe MC.
gerrit

Risposte:


198

Perché "CharSequence contiene solo cifre Unicode" (citando la documentazione collegata ).

Tutti i caratteri restituiscono true per Character.isDigit:

Alcuni intervalli di caratteri Unicode che contengono cifre:

  • Da "\ u0030" a "\ u0039", cifre ISO-LATIN-1 (da "0" a "9")
  • Da "\ u0660" a "\ u0669", cifre arabo-indiane
  • Da '\ u06F0' a '\ u06F9', cifre estese arabo-indiane
  • Cifre da "\ u0966" a "\ u096F" in devanagari
  • Da "\ uFF10" a "\ uFF19", cifre a larghezza intera

Molti altri intervalli di caratteri contengono anche cifre.

१२३ sono cifre Devanagari:


11
@Joker_vD bene, non avete specificato che il sovraccarico, quindi sì, certo: Integer.parseInt("222", 2).
Andy Turner

4
@Joker_vD Non è nemmeno difficile; ci sono molte lingue non supportate. Anche se è così, c'è il cinese 亿, che rappresenta 10 ^ 8 -> questo alla potenza di 3 provocherebbe un overflow. Elenco dei sistemi numerici
Cedric Reichenbach,

13
@CedricReichenbach: La distinzione chiave è che mentre 亿 è numerico (per gli standard di avere uno dei valori non Nessuno di Numeric_Type, in questo caso Numeric_Type = Numeric), non è un qualsiasi tipo di cifra . (Anche se lo fosse, non lo porteresti alla potenza di 3; aumenteresti la radice a vari poteri, non le cifre .) parseIntRichiede cifre e, forse in modo confuso, il isNumericmetodo in questa domanda verifica i caratteri decimali ( General_Category = Decimal_Number) invece di qualsiasi categoria più ampia di caratteri numerici.
user2357112 supporta Monica

10
Il set completo di cifre Devangari è ०१२३४५६७८९.
dan04

2
@ v7d8dpo4 (s) ha chiesto se c'era un modo per ottenere Integer.parseInt()un'eccezione per una stringa di input numerica di 3 caratteri.
Andy Turner

59

Il simbolo १२३ è lo stesso di 123 per la lingua nepalese o qualsiasi altra lingua che utilizza lo script Devanagari come hindi, gujarati e così via, ed è quindi un numero per Apache Commons.


3
Quella cosa sembra quasi "123" in numeri arabi.
Panzercrisis

41
Gli arabi hanno ottenuto i loro numeri dagli indiani.

5
I numeri arabi di @rahul sono 1-9, non ١-٩ come si pensa comunemente.
Maroun

26

Puoi usare Character#getTypeper controllare la categoria generale del personaggio:

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

Questo stamperà true, che è una "prova" che '१' è un numero di cifre .

Ora esaminiamo il valore Unicode del carattere '१':

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

Questo numero è sulla gamma di cifre Devanagari - che è: \u0966attraverso \u096F.

Prova anche:

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

Devanagari è:

è un alfabeto abugida (alfa-sillabario) dell'India e del Nepal

"१२३" è un "123" (Unicode latino di base).

Lettura:


1
È più significativo che siano di tipo DECIMAL_DIGIT_NUMBERpiuttosto che nel DEVANAGARIblocco. Ci sono anche lettere non numeriche in quel blocco.
Andy Turner

23

Se vuoi sapere quali proprietà ha un particolare "carattere" (e ce ne sono parecchie), vai direttamente alla fonte: Unicode.org . Hanno strumenti di ricerca che possono mostrarti quasi tutto ciò che vorresti sapere.

TIENI A MENTE: L'Unicode Consortium produce una specifica, non un software. Ciò significa che spetta a ciascun fornitore di software implementare le specifiche nel modo più accurato possibile . Quindi, proprio come HTML, JavaScript, CSS, SQL, ecc., Esistono variazioni tra diverse piattaforme, linguaggi e così via. Ad esempio, ho trovato un bug in .NET Framework di Microsoft in base al quale le lettere latine cerchiate A-Ze i a-zpunti di codice da 0x24B6 a 0x24E9 non vengono registrati correttamente come tali char.IsLetter = true( segnalazione di bug qui ). E questo porta a comportamenti inaspettati nelle funzionalità correlate, come quando si chiama il TextInfo.ToTitleCase()metodo ( segnalazione di bug qui ).


1
Ottimi riferimenti! (Anche se mi chiedono se Unicode abbia
esagerato

1
Se vuoi avere questo tipo di riferimento disponibile localmente, puoi installare uniprops .
TRiG

2
@TRiG Grazie per averlo detto. Utilità interessante. Copre alcune delle funzionalità mostrate nei primi 3 collegamenti (il set originale), ma ho appena aggiornato la mia risposta per includere alcuni collegamenti aggiuntivi che mostrano query più avanzate che possono essere fatte su Unicode.org che non vedo possibili via uniprops. Inoltre, sembra che unipropssia una versione indietro poiché Unicode ha rilasciato la versione 9.0 lo scorso giugno.
Solomon Rutzky

19

I simboli '१२३' derivano in realtà dalla lingua hindi (fondamentalmente dalla lingua sanscrita, cioè Devanagiri) che rappresentano valori numerici proprio come:

१ rappresenta 1

२ rappresentano 2

e come un saggio


4
CORREZIONE: I simboli "१२३" derivano in realtà dalla lingua sanscrita (cioè, la scrittura Devanagiri come hanno notato altri poster)
Happy Green Kid Naps

Sono stato sorpreso di apprendere quanto recentemente Devanāgarī abbia assunto la sua forma attuale - molti secoli dopo la codificazione del sanscrito! Quindi sono scettico sull'affermazione che le cifre appartengono più al sanscrito che alla cultura indiana in generale.
Anton Sherwood,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.