2010-10-20 16 views

Respuesta

3

No era no sólo me que hizo esta pregunta :) personas estaban abriendo este defecto en Jira de Apache: https://issues.apache.org/jira/browse/LANG-428

cerraron sin fijar solamente para mantener la compatibilidad hacia atrás (a seguir especificación del método).

Pero todos coincidieron en que el comportamiento actual del método es incorrecto.

+1

Cita del enlace que diste: "Una cadena vacía no tiene caracteres, por lo que no puede contener un carácter ilegal." ... por lo tanto, ¿por qué es un comportamiento aceptable? –

+1

Pero tampoco tiene carácter legal. Un hombre hizo una pregunta razonable en comentarios: "Tal vez el método podría llamarse mejor noNonNonNumeric()?" Estoy 100% de acuerdo con él. Mi punto es ... si escribir "17" + "256" - todo está claro ... pero "" + "256" ... bueno ... La cadena vacía no debe considerarse como un dígito, ya sea 0 o 1 o algo más. –

+0

Estoy de acuerdo. El nombre de la función es ligeramente engañoso y desafortunado. Podría, por ejemplo, haber sido llamado 'containsOnlyDigits' o' isNotNonNumeric' como usted sugiere. Hay algunas sorpresas como esta con respecto a la cuerda vacía. Por ejemplo, ¿dirías que una cadena vacía alguna vez contiene algo? Es decir, ¿debería '" ".contains (.....)' alguna vez evaluarse como verdadero? ¡Bien! (Lo dejaré como ejercicio para que descubras cómo;) Tendrás que acostumbrarte a esto, ¿diremos "propiedades contraintuitivas" de la cadena vacía? – aioobe

12

El comportamiento ha cambiado en 3.0. De What's new in Commons Lang 3.0?:

StringUtils.isAlpha, isNumeric y isAlphanumeric ahora todos return false cuando se pasa una cadena vacía. Anteriormente regresaron verdad.

manteniendo la respuesta anterior a continuación, para referencia y para los usuarios de pre 3.0.


¿Es esto lógicamente correcto?

Tenemos

  1. el comportamiento del método
  2. la documentación del método (que a menudo se ve como la especificación o contrato)
  3. el nombre del método

En este caso, 1 y 2 están de acuerdo entre sí; Todos los caracteres en la cadena vacía son dígitos Unicode. (O, de forma equivalente, no hay caracteres en la cadena vacía que no sean dígitos unicode). Esto es lo que los lógicos llaman al vacuously true y algo contrario a la intuición. Es como decir que todos los elefantes en mi apartamento son verdes. Es cierto, ya que no hay elefantes en mi apartamento.

Sin embargo, el elemento 3 (el nombre del método) se interpreta naturalmente como un método que devuelve verdadero si la cadena dada representa un número.

Entonces, o bien es un error de documentación e implementación, o es un error de nomenclatura. No hay una respuesta correcta o incorrecta para eso.

Se ha producido un error here. Los mantenedores toman el punto de vista de que es el comportamiento previsto.

¿Por qué ven cadena vacía como numérica?

Si bien el nombre del método que puede llevar a creer que el método debe devolver cierto sólo para las cadenas que representa un número, la especificación de hecho dice que debe devolver verdadero porque si la cadena contiene sólo dígitos Unicode.

Usted dice,

Estoy confundido porque especificación dice: "Comprueba si la cadena contiene sólo dígitos Unicode." No veo que "" contenga dígitos ....

Tenga en cuenta que la cadena vacía no contiene nada más que dígitos unicode. Por lo tanto, el método devuelve verdadero.

+3

También podría argumentar que ninguno de los caracteres en la cadena vacía son dígitos unicode. –

+0

¡Sí! ¡Exactamente! ¡No veo ningún dígito Unicode en una cadena vacía también! –

+1

Se me ocurre que es probablemente para validación de entrada: puede tener comprobaciones de validación separadas "es numérica" ​​y "está vacía" y según esta definición las dos son completamente ortogonales. – Rup

5

java.lang.Integer.parseInt("") fallarán.

No es una cuestión de lógica. Tampoco es una cuestión de sentido común: no hubo ningún número representado por ningún símbolo. No hay un argumento sólido sobre por qué una cadena vacía debería representar 0.

Si el nombre del método es containsOnlyNumeric(), es natural que se devuelva verdadero para "" de acuerdo con nuestros libros de texto de matemáticas. Sin embargo, el nombre del método es isNumeric(), el tratamiento de "" no es natural. Además, no hay ninguna razón aparente por la cual null debería devolver falso. Lanzaría una excepción para null.

Pero es lo que es, está bien documentado y ¿qué más se puede pedir?

3

primero compruebe la condición de que la cadena está vacía() o no.

if(StringUtils.isNotEmpty(str) && StringUtils.isNumeric(str)) { 

} 

entonces se solucionó el problema.

pero todavía es un problema más pasa valores negativos como

str = "-1"; 

StringUtils.isNumeric(str) será falsa.

Debe tener en cuenta esta condición.

+2

Quizás quieras usar ['isNotEmpty'] (https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringUtils.html#isNotEmpty%28java. lang.String% 29) en su primer fragmento? – aioobe

0

Hay otra solución. NumberUtils.isNumber Esto comprueba si se trata de un número ya sea largo, doble, entero.

Espero que esta ayuda

Cuestiones relacionadas