Warum betrachtet Apache Commons '१२३' als numerisch?


101

Gemäß der Dokumentation von Apache Commons Lang für StringUtils.isNumeric()ist der String '१२३' numerisch.

Da ich glaubte, dass dies ein Fehler in der Dokumentation sein könnte, führte ich Tests durch, um die Aussage zu überprüfen. Ich fand , dass nach Apache Commons es ist numerisch.

Warum ist dieser String numerisch? Was repräsentieren diese Charaktere?


61
Vielleicht repräsentieren sie Ziffern in einer Sprache. Nicht alle Sprachen verwenden die Symbole 0 bis 9, um Ziffern darzustellen.
Eran

165
Dies sind 1, 2 und 3 in Hindi
Blip

11
Sie können den ganzzahligen Wert von erhalten Integer.parseInt("१२३").
Saka1029

9
@ dan04 Das sind keine Zahlen, das sind Buchstaben, die beliebt sind, um bestimmte Konstanten darzustellen. Beachten Sie den Unterschied zwischen ⅯⅭund MC.
Gerrit

Antworten:


198

Denn diese "CharSequence enthält nur Unicode-Ziffern" (unter Angabe Ihrer verknüpften Dokumentation ).

Alle Zeichen geben true zurück für Character.isDigit:

Einige Unicode-Zeichenbereiche, die Ziffern enthalten:

  • '\ u0030' bis '\ u0039', ISO-LATIN-1-Ziffern ('0' bis '9')
  • '\ u0660' bis '\ u0669', arabisch-indische Ziffern
  • '\ u06F0' bis '\ u06F9', erweiterte arabisch-indische Ziffern
  • '\ u0966' bis '\ u096F', Devanagari-Ziffern
  • '\ uFF10' bis '\ uFF19', Ziffern mit voller Breite

Viele andere Zeichenbereiche enthalten ebenfalls Ziffern.

१२३ sind Devanagari-Ziffern:


11
@Joker_vD Nun, Sie haben nicht angegeben, welche Überlastung, also ja, sicher : Integer.parseInt("222", 2).
Andy Turner

4
@Joker_vD Es ist nicht einmal schwer; Es gibt viele nicht unterstützte Sprachen. Selbst wenn ja, gibt es die Chinise 亿, die 10 ^ 8 darstellt -> dies hoch 3 würde einen Überlauf verursachen. Liste der Zahlensysteme
Cedric Reichenbach

13
@CedricReichenbach: Der Hauptunterschied besteht darin, dass 亿 zwar numerisch ist (nach den Standards eines der Nicht-None-Werte von Numeric_Type, in diesem Fall Numeric_Type = Numeric), aber keine Ziffer ist . (Selbst wenn es so wäre, würden Sie es nicht auf die Potenz 3 bringen; Sie würden den Radix auf verschiedene Potenzen erhöhen , nicht auf die Ziffern .) parseIntErfordert Ziffern, und möglicherweise verwirrt die isNumericMethode in dieser Frage auf Dezimalstellenzeichen ( General_Category = Decimal_Number) anstelle einer breiteren Kategorie numerischer Zeichen.
user2357112 unterstützt Monica

10
Der vollständige Satz von Devangari-Ziffern ist ०१२३४५६७८९.
Dan04

2
@ v7d8dpo4 (s) fragte er, ob es eine Möglichkeit gebe Integer.parseInt(), eine Ausnahme für eine 3- stellige numerische Eingabezeichenfolge auszulösen.
Andy Turner

59

Das Symbol १२३ ist dasselbe wie 123 für die nepalesische Sprache oder eine andere Sprache, die die Devanagari-Schrift verwendet, wie z. B. Hindi, Gujarati usw., und ist daher eine Zahl für Apache Commons.


3
Das Ding sieht in arabischen Ziffern fast wie "123" aus.
Panzercrisis

41
Araber erhielten ihre Ziffern von Indern.

5
@rahul Arabische Zahlen sind 1-9, nicht commonly-٩ wie allgemein angenommen.
Maroun

26

Sie können verwenden Character#getType, um die allgemeine Kategorie des Charakters zu überprüfen:

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

Dies wird gedruckt true, was ein "Beweis" dafür ist, dass '१' eine Ziffernzahl ist .

Untersuchen wir nun den Unicode-Wert des Zeichens '१':

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

Diese Zahl liegt im Bereich der Devanagari-Ziffern - das heißt: \u0966durch \u096F.

Probiere auch:

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

Devanagari ist:

ist ein abugida (alphasyllabary) Alphabet aus Indien und Nepal

"१२३" ist ein "123" (Basic Latin Unicode).

Lesen:


1
Es ist wichtiger, dass sie vom Typ sind DECIMAL_DIGIT_NUMBERals dass sie im DEVANAGARIBlock sind. In diesem Block befinden sich auch nichtstellige Buchstaben.
Andy Turner

23

Wenn Sie jemals wissen möchten, welche Eigenschaften ein bestimmter "Charakter" hat (und es gibt einige), gehen Sie direkt zur Quelle: Unicode.org . Sie haben Recherchetools, die Ihnen fast alles zeigen können, was Sie wissen möchten.

BEACHTEN SIE: Das Unicode-Konsortium erstellt eine Spezifikation, keine Software. Dies bedeutet, dass es Sache jedes Softwareanbieters ist, die Spezifikation so genau wie möglich umzusetzen . Genau wie bei HTML, JavaScript, CSS, SQL usw. gibt es Unterschiede zwischen verschiedenen Plattformen, Sprachen usw. Zum Beispiel habe ich in .NET Framework von Microsoft einen Fehler gefunden, bei dem lateinische Buchstaben eingekreist A-Zund a-z- Codepunkte 0x24B6 bis 0x24E9 - nicht ordnungsgemäß als solche registriert wurden char.IsLetter = true( Fehlerbericht hier ). Dies führt zu unerwartetem Verhalten in verwandten Funktionen, z. B. beim Aufrufen der TextInfo.ToTitleCase()Methode ( Fehlerbericht hier ).


1
Tolle Referenzen! (Obwohl sie mich fragen lassen, ob Unicode
übertrieben wurde

1
Wenn Sie diese Art von Referenz lokal verfügbar haben möchten, können Sie Uniprops installieren .
TRiG

2
@ TRiG Danke, dass du das erwähnt hast. Interessanter Nutzen. Es behandelt einige der Funktionen, die in den ersten drei Links (dem ursprünglichen Satz) gezeigt werden, aber ich habe gerade meine Antwort aktualisiert, um einige zusätzliche Links aufzunehmen, die erweiterte Abfragen zeigen, die auf Unicode.org ausgeführt werden können und die ich nicht für möglich halte über uniprops. Es scheint auch, dass unipropseine Version dahinter steckt, da Unicode im vergangenen Juni Version 9.0 veröffentlicht hat.
Solomon Rutzky

19

Die Symbole '१२३' stammen tatsächlich aus der Hindi-Sprache (im Grunde aus der Sanskrit-Sprache, dh Devanagiri) und repräsentieren numerische Werte wie:

१ repräsentieren 1

२ repräsentieren 2

und ebenfalls


4
KORREKTUR: Die Symbole '१२३' stammen tatsächlich aus der Sanskrit- Sprache (dh Devanagiri-Schrift, wie andere Poster festgestellt haben)
Happy Green Kid Naps

Ich war überrascht zu erfahren, wie kürzlich Devanāgarī seine heutige Form angenommen hat - viele Jahrhunderte nachdem Sanskrit kodifiziert wurde! Daher bin ich skeptisch gegenüber der Behauptung, dass die Ziffern mehr zum Sanskrit als zur indischen Kultur im Allgemeinen gehören.
Anton Sherwood
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.