Pourquoi Apache Commons considère-t-il «१२३» comme numérique?


101

Selon la documentation d'Apache Commons Lang pour StringUtils.isNumeric(), la chaîne «१२३» est numérique.

Comme je pensais que cela pouvait être une erreur dans la documentation, j'ai exécuté des tests pour vérifier la déclaration. Je trouve que , selon Apache Commons , il est numérique.

Pourquoi cette chaîne est-elle numérique? Que représentent ces personnages?


61
Peut-être représentent-ils des chiffres dans une langue. Toutes les langues n'utilisent pas les symboles 0 à 9 pour représenter les chiffres.
Eran

165
ce sont 1, 2 et 3 en hindi
Blip

11
Vous pouvez obtenir la valeur entière par Integer.parseInt("१२३").
saka1029

9
@ dan04 Ce ne sont pas des nombres, ce sont des lettres populaires pour représenter des constantes particulières. Notez la différence entre ⅯⅭet MC.
gerrit

Réponses:


198

Parce que "CharSequence contient uniquement des chiffres Unicode" (citant votre documentation liée ).

Tous les caractères retournent vrai pour Character.isDigit:

Certaines plages de caractères Unicode contenant des chiffres:

  • '\ u0030' à '\ u0039', chiffres ISO-LATIN-1 ('0' à '9')
  • '\ u0660' à '\ u0669', chiffres arabes-indiens
  • '\ u06F0' à '\ u06F9', chiffres arabes-indiens étendus
  • '\ u0966' à '\ u096F', chiffres devanagari
  • '\ uFF10' à '\ uFF19', chiffres pleine largeur

De nombreuses autres plages de caractères contiennent également des chiffres.

१२३ sont des chiffres devanagari:


11
@Joker_vD bien, vous avez indiqué que la surcharge ne, donc oui, bien sûr: Integer.parseInt("222", 2).
Andy Turner

4
@Joker_vD Ce n'est même pas difficile; il existe de nombreuses langues non prises en charge. Même si c'est le cas, il y a le Chinise 亿, qui représente 10 ^ 8 -> cela à la puissance 3 provoquerait un débordement. Liste des systèmes numériques
Cedric Reichenbach

13
@CedricReichenbach: La principale distinction est que, bien que 亿 soit numérique (selon les normes d'avoir l'une des valeurs non-None de Numeric_Type, dans ce cas Numeric_Type = Numeric), ce n'est pas une sorte de chiffre . (Même si c'était le cas, vous ne le porteriez pas à la puissance 3; vous éleveriez la base à différentes puissances, pas aux chiffres .) parseIntNécessite des chiffres, et peut-être de manière déroutante, la isNumericméthode de cette question teste les caractères décimaux ( General_Category = Decimal_Number) au lieu de toute catégorie plus large de caractères numériques.
user2357112 prend en charge Monica

10
L'ensemble complet des chiffres Devangari est ०१२३४५६७८९.
dan04

2
@ v7d8dpo4 (s) il a demandé s'il y avait un moyen d'obtenir Integer.parseInt()une exception pour une chaîne d'entrée numérique à 3 caractères.
Andy Turner

59

Le symbole १२३ est le même que 123 pour la langue népalaise ou toute autre langue utilisant le script Devanagari tel que l'hindi, le gujarati, etc., et est donc un nombre pour Apache Commons.


3
Cette chose ressemble presque à "123" en chiffres arabes.
Panzercrisis

41
Les Arabes ont obtenu leurs chiffres des Indiens.

5
Les nombres arabes @rahul sont 1-9, pas not-٩ comme on le pense généralement.
Maroun

26

Vous pouvez utiliser Character#getTypepour vérifier la catégorie générale du personnage:

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

Cela imprimera true, ce qui est une "preuve" que '१' est un nombre de chiffres .

Examinons maintenant la valeur unicode du caractère '१':

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

Ce numéro est sur la plage des chiffres Devanagari - qui est: à \u0966travers \u096F.

Essayez aussi:

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

Devanagari est:

est un alphabet abugida (alphasyllabaire) de l'Inde et du Népal

"१२३" est un "123" (unicode latin de base).

En train de lire:


1
Il est plus significatif qu'ils soient de type DECIMAL_DIGIT_NUMBERque qu'ils soient dans le DEVANAGARIbloc. Il y a aussi des lettres non numériques dans ce bloc.
Andy Turner

23

Si jamais vous voulez connaître les propriétés d'un "caractère" particulier (et il y en a pas mal), allez directement à la source: Unicode.org . Ils ont des outils de recherche qui peuvent vous montrer presque tout ce que vous voudriez savoir.

GARDEZ À L'ESPRIT: Le Consortium Unicode produit une spécification, pas un logiciel. Cela signifie qu'il appartient à chaque éditeur de logiciel de mettre en œuvre la spécification aussi précisément que possible . Donc, tout comme HTML, JavaScript, CSS, SQL, etc., il existe des variations entre les différentes plates-formes, langages, etc. Par exemple, j'ai trouvé un bogue dans le .NET Framework de Microsoft dans lequel les lettres latines encerclées A-Zet a-z- les points de code 0x24B6 à 0x24E9 - ne s'enregistrent pas correctement char.IsLetter = true( rapport de bogue ici ). Et cela conduit à un comportement inattendu dans les fonctionnalités associées, comme lors de l'appel de la TextInfo.ToTitleCase()méthode ( rapport de bogue ici ).


1
Bonnes références! (Bien qu'ils me font me demander si Unicode est allé au-dessus!)
PJTraill

1
Si vous souhaitez avoir ce type de référence disponible localement, vous pouvez installer uniprops .
TRiG

2
@TRiG Merci d'avoir mentionné cela. Utilité intéressante. Il couvre certaines des fonctionnalités présentées dans les 3 premiers liens (l'ensemble d'origine), mais je viens de mettre à jour ma réponse pour inclure des liens supplémentaires qui montrent des requêtes plus avancées pouvant être effectuées sur Unicode.org que je ne vois pas possible via uniprops. En outre, il semble qu'il y unipropsait une version derrière la version 9.0 d'Unicode en juin dernier.
Solomon Rutzky

19

Les symboles '१२३' sont en fait dérivés de la langue hindi (essentiellement de la langue sanskrite, c'est-à-dire Devanagiri) qui représentent des valeurs numériques tout comme:

१ représente 1

२ représentent 2

et également


4
CORRECTION: Les symboles '१२३' sont en fait dérivés de la langue sanskrite (c'est-à-dire, l'écriture Devanagiri comme d'autres affiches l'ont noté)
Happy Green Kid Naps

J'ai été surpris d'apprendre à quel point le Devanāgarī a récemment pris sa forme actuelle - plusieurs siècles après la codification du sanscrit! Je suis donc sceptique quant à l'affirmation selon laquelle les chiffres appartiennent plus au sanscrit qu'à la culture indienne en général.
Anton Sherwood
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.