La spécification de la méthode StringUtils.isNumeric () est-elle logiquement correcte?
Apache StringUtils.isNumeric()
méthode de spécification dit:
Vérifie si la Chaîne ne contient que de l'unicode des chiffres. Un point décimal n'est pas une unicode chiffres et retourne false
.
Null
sera de retour false
. Un vide String ("")
sera de retour true
.
Est cette logiquement droit?
Pourquoi font-ils voir la chaîne vide que le numérique?
source d'informationauteur Andriy Sholokh
Vous devez vous connecter pour publier un commentaire.
Le comportement est modifié dans la version 3.0. De Ce qui est nouveau dans Commons Lang 3.0?:
Conserver réponse ci-dessous, à titre de référence et pour le pré 3.0 utilisateurs.
Nous avons
Dans ce cas 1 et 2 de l'accord les uns avec les autres; Tous les caractères dans la chaîne vide unicode chiffres. (Ou, de manière équivalente, pas de caractères dans la chaîne vide sont pas unicode chiffres.) Ce que les logiciens appellent vacuously vrai et quelque peu contre-intuitif. C'est comme dire que tous les éléphants dans mon appartement vert. C'est vrai, car il y a pas d'éléphants dans mon appartement.
Point 3, en revanche (le nom de la méthode) est naturellement interprété comme une méthode qui retourne true si la chaîne de caractères représente un nombre.
Donc, soit c'est un lieu de documentation et de mise en œuvre de bug, ou c'est une appellation bug. Il n'y a pas de bonne ou de mauvaise réponse à cette question.
Un bug a été déposé ici. Les responsables de prendre le point de vue que c'est un comportement intentionnel.
Tandis que le nom de la méthode peut vous conduire à croire que la méthode doit retourner vrai que pour des chaînes de caractères qui représente un nombre, de la spec dit qu'il doit retourner true si la chaîne ne contient que de l'unicode chiffres.
Vous dire,
Noter que la chaîne vide ne contient rien d'autre que de l'unicode des chiffres. Par conséquent, la méthode renvoie la valeur true.
java.lang.Integer.parseInt("")
échouera.Ce n'est pas une question de logique. Ce n'est pas une question de bon sens - il n'y a pas un nombre qui est représentée par l'absence de ce symbole. Il n'y a aucun argument sérieux, pourquoi une chaîne vide devrait représenter 0.
Si le nom de la méthode est
containsOnlyNumeric()
il est naturel de se retourner true pour "" selon nos les manuels de mathématiques. Toutefois, le nom de la méthode estisNumeric()
le traitement de "" n'est pas naturel. Aussi, il n'y a aucune raison apparente pourquoinull
doit retourner false. Je voudrais jeter l'exception de la valeur null.Mais c'est ce qu'il est, il est bien documenté et que pouvez-vous demander?
Il n'y a pas que moi qui a posé cette question 🙂
Les gens étaient à l'ouverture de ce défaut dans le Jira:
https://issues.apache.org/jira/browse/LANG-428
Ils ont fermé, sans le fixer seulement pour assurer la compatibilité descendante (à suivre la méthode de spécification).
Mais tout le monde a convenu que le comportement actuel de la méthode est mauvaise.
vérifier l'état de la chaîne est vide() ou pas.
alors votre problème sera résolu.
mais encore un problème de plus est de vous transmettre des valeurs négatives comme
StringUtils.isNumeric(str)
il sera faux.Vous avez besoin pour prendre soin de cette condition.
Il y a une autre solution. NumberUtils.isNumber
Celui-ci vérifie si c'est un nombre en Long, Double, Entier.
Espérons que cette aide