2010-10-20 10 views

Antwort

3

Es war mir nicht nur, die diese Frage gestellt :) Menschen diesen Mangel in Apaches Jira Eröffnung wurden: https://issues.apache.org/jira/browse/LANG-428

Sie ohne Festsetzung es Abwärtskompatibilität zu halten nur geschlossen (Methode Spezifikation zu folgen).

Aber alle waren sich einig, dass das aktuelle Verhalten der Methode falsch ist.

+1

Zitat von der Verbindung, die Sie gaben: "Eine leere Schnur hat keine Charaktere, also kann kein ungültiges Zeichen enthalten." .... deshalb warum es ein annehmbares Verhalten ist. –

+1

Aber es enthält auch keinen rechtlichen Charakter. Ein Typ fragte eine vernünftige Frage in Kommentaren: "Vielleicht könnte die Methode besser isNotNonNumeric() heißen?" Ich stimme 100% mit ihm überein. Mein Punkt ist ... Wenn "17" + "256" geschrieben werden soll - alles ist klar ... aber "" + "256" ... naja ... Leere Zeichenkette sollte nicht als irgendeine Ziffer betrachtet werden, entweder 0 oder 1 oder etwas anderes. –

+0

Ich stimme zu. Der Name der Funktion ist leicht irreführend und unglücklich. Es könnte zum Beispiel 'containsOnlyDigits' oder' isNotNonNumeric' heißen, wie Sie vorschlagen. Es gibt einige Überraschungen wie diese in Bezug auf die leere Zeichenfolge. Würden Sie zum Beispiel sagen, dass eine leere Zeichenfolge jemals etwas enthält? Das heißt, sollte "" (.....) 'jemals als wahr gelten? Nun, das tut es! (Ich werde es als eine Übung für Sie überlassen, um herauszufinden, wie;) Sie müssen sich nur daran gewöhnen, sollen wir "nicht intuitive Eigenschaften" der leeren Saite sagen. – aioobe

12

Das Verhalten wurde in 3.0 geändert. Von What's new in Commons Lang 3.0?:

StringUtils.isAlpha, isNumeric und isAlphanumeric jetzt alle return false, wenn ein leerer String übergeben. Zuvor waren sie wieder wahr.

Halten alte Antwort unten, als Referenz und für Benutzer vor 3.0.


Ist das logisch nicht wahr?

Wir haben

  1. das Verhalten der Methode
  2. die Dokumentation der Methode
  3. den Namen der Methode (die oft als die Spezifikation oder Vertrag betrachtet wird)

In diesem Fall stimmen 1 und 2 überein; Alle Zeichen in der leeren Zeichenfolge sind Unicode-Ziffern. (Oder äquivalent, keine Zeichen in der leeren Zeichenfolge sind nicht Unicode-Ziffern.) Das, was Logiker vacuously true aufrufen und etwas entgegengesetzte intuitiv. Es ist, als ob man sagt, dass alle Elefanten in meiner Wohnung sind grün. Es stimmt, denn in meiner Wohnung gibt es keine Elefanten.

Item 3 jedoch (der Name der Methode) wird natürlich als eine Methode interpretiert, die wahr zurückgibt, wenn die angegebene Zeichenfolge eine Zahl darstellt.

Also, entweder ist es ein Dokumentations- und Implementierungsfehler, oder es ist ein Namensfehler. Darauf gibt es keine richtige oder falsche Antwort.

Ein Fehler wurde here eingereicht. Die Betreuer nehmen den Standpunkt ein, dass das Verhalten beabsichtigt ist.

Warum sehen sie leere Zeichenfolge als numerisch?

Während der Name des Verfahrens Sie führen zu glauben, sollte die Methode nur für Strings true zurück, die eine Zahl darstellt, sagt der spec es tatsächlich für wahr zurückgeben sollte, wenn die Zeichenfolge enthält nur Unicode-Zeichen.

Sie sagen,

Ich bin verwirrt, weil Spezifikation sagt: "Prüft, ob der String nur Unicode-Ziffern enthält." Ich sehe nicht, dass „“ Ziffern enthält ....

Beachten Sie, dass die leere Zeichenkette nichts anderes als Unicode-Ziffern enthält. Daher gibt die Methode true zurück.

+3

Sie könnten ebenso argumentieren, dass keine der Zeichen in der leeren Zeichenfolge Unicode-Ziffern sind. –

+0

Ja! Genau! Ich sehe auch keine Unicode-Ziffern in leeren Strings! –

+1

Es kommt mir vor, es ist wahrscheinlich für die Eingabe-Validierung: Sie können getrennte "ist numerisch" und "ist leer" Validierungsprüfungen und durch diese Definition die beiden sind vollständig orthogonal. – Rup

5

java.lang.Integer.parseInt("") wird fehlschlagen.

Es ist keine Frage der Logik. Es ist auch keine Frage des gesunden Menschenverstands - es gab keine Zahl, die durch kein Symbol repräsentiert wird. Es gibt kein starkes Argument, warum eine leere Zeichenkette 0 darstellen sollte.

Wenn der Methodenname containsOnlyNumeric() lautet, ist es natürlich, für "" gemäß unseren Mathelehrbüchern true zurückzugeben. Der Methodenname lautet jedoch isNumeric(), die Behandlung von "" ist nicht natürlich. Außerdem gibt es keinen ersichtlichen Grund, warum null false zurückgeben sollte. Ich würde Ausnahme für null werfen.

Aber es ist was es ist, es ist gut dokumentiert und was kann man mehr verlangen?

3

Überprüfen Sie zunächst, ob die Zeichenfolge leer ist() oder nicht.

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

} 

dann wird Ihr Problem gelöst werden.

aber ein noch weiteres Problem ist, dass Sie negative Werte wie

str = "-1"; 

StringUtils.isNumeric(str) es falsch sein wird passieren.

Sie müssen auf diesen Zustand achten.

+2

Vielleicht möchten Sie ['isNotEmpty'] (https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringUtils.html#isNotEmpty%28java verwenden. lang.String% 29) in Ihrem ersten Snippet? – aioobe

0

Es gibt eine andere Lösung. NumberUtils.isNumber Dies überprüft, ob es sich um eine Zahl handelt, entweder Long, Double, Integer.

Hoffe diese Hilfe