102 votes

Pourquoi Apache Commons considère-t-il que '' est numérique ?

D'après la documentation d'Apache Commons Lang pour le logiciel StringUtils.isNumeric() la chaîne '' est numérique.

Comme je pensais qu'il s'agissait d'une erreur dans la documentation, j'ai effectué des tests pour vérifier cette affirmation. J'ai constaté que, selon Apache Commons, il est possible de est numérique.

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

61 votes

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

166 votes

Il s'agit de 1, 2 et 3 en hindi

11 votes

Vous pouvez obtenir la valeur entière par Integer.parseInt("") .

198voto

Andy Turner Points 13883

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

Tous les caractères renvoient la valeur "vrai" pour Character.isDigit :

Certaines plages de caractères Unicode contenant des chiffres :

  • ' \u0030 ' jusqu'à ' \u0039 ', chiffres ISO-LATIN-1 ('0' à '9')
  • ' \u0660 ' jusqu'à ' \u0669 ', chiffres arabes-indiques
  • ' \u06F0 ' jusqu'à ' \u06F9 ', Chiffres arabes-indiques étendus
  • ' \u0966 ' jusqu'à ' \u096F ', chiffres Devanagari
  • ' \uFF10 ' jusqu'à ' \uFF19 ', chiffres en largeur

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

sont des chiffres Devanagari :

11 votes

@Joker_vD Vous n'avez pas précisé de quelle surcharge il s'agit, donc oui, bien sûr : Integer.parseInt("222", 2) .

4 votes

@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 la Chinise qui représente 10^8 -> cette puissance de 3 provoquerait un débordement. _Liste des systèmes numéraux_

1 votes

Integer.parseInt() échouera probablement si les chiffres ne sont pas censés être consécutifs (comme les chiffres japonais 1, 2, 3, ...).

59voto

Le symbole est identique à 123 pour la langue népalaise ou toute autre langue utilisant le système Devanagari script comme l'hindi, le gujarati, etc., et est donc un numéro pour Apache Commons.

3 votes

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

42 votes

Les Arabes se sont inspirés des Indiens pour leurs chiffres.

5 votes

@rahul Les chiffres arabes sont compris entre 1 et 9, et non pas entre - comme on le pense généralement.

26voto

Maroun Maroun Points 31217

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

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

Ceci imprimera true 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 nombre se situe dans la fourchette de Chiffres Devanagari - qui est : \u0966 à travers \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).

Lecture :

1 votes

Il est plus important qu'ils soient du type DECIMAL_DIGIT_NUMBER que le fait qu'ils soient dans la DEVANAGARI bloc. Ce bloc contient également des lettres sans chiffre.

23voto

srutzky Points 3766

Si vous voulez savoir quelles sont les propriétés d'un "personnage" particulier (et il y en a beaucoup), allez directement à la source : Unicode.org . Ils disposent d'outils de recherche qui peuvent vous montrer presque tout ce que vous souhaitez savoir.

GARDER À 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 le plus précisément possible . Ainsi, tout comme HTML, JavaScript, CSS, SQL, etc., il existe des variations entre les différentes plates-formes, les différents langages, etc. Par exemple, j'ai trouvé un bogue dans le .NET Framework de Microsoft qui fait que les lettres latines encerclées A-Z et a-z -- Les points de code 0x24B6 à 0x24E9 -- ne sont pas correctement enregistrés comme étant char.IsLetter = true ( rapport de bug ici ). Cela entraîne des comportements inattendus dans les fonctionnalités connexes, par exemple lors de l'appel de la fonction TextInfo.ToTitleCase() méthode ( rapport de bug ici ).

1 votes

D'excellentes références ! (Bien qu'elles me fassent me demander si Unicode n'a pas dépassé les limites !)

1 votes

Si vous souhaitez que ce type de référence soit disponible localement, vous pouvez installer uniprops .

2 votes

@TRiG Merci de le mentionner. Un utilitaire intéressant. Il couvre certaines des fonctionnalités présentées dans les 3 premiers liens (l'ensemble original), mais je viens de mettre à jour ma réponse pour inclure quelques liens supplémentaires qui montrent des requêtes plus avancées qui peuvent être faites sur Unicode.org et que je ne vois pas possible via uniprops . Il apparaît également que uniprops est en retard d'une version, Unicode ayant publié la version 9.0 en juin dernier.

19voto

Nayan Katkani Points 755

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

représenter 1

représenter 2

et de la même manière

4 votes

CORRECTION : Les symboles '' sont en fait dérivés de Sanskrit langue (c'est-à-dire, Devanagiri script comme d'autres affiches l'ont noté)

0 votes

J'ai été surpris d'apprendre que Devanagari n'a pris sa forme actuelle que très récemment, plusieurs siècles après la codification du sanskrit ! Je suis donc sceptique quant à l'affirmation selon laquelle les chiffres appartiennent davantage au sanskrit qu'à la culture indienne en général.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X