1055 Stimmen

Wie prüft man in Java, ob ein String numerisch ist?

Wie würden Sie prüfen, ob ein String eine Zahl ist, bevor Sie ihn parsen?

42 Stimmen

Alle Lösungen, die mit regulären Ausdrücken vorgeschlagen werden, funktionieren nicht für hexadezimale Zahlen.

0 Stimmen

Und die Übergabe einer Null-Zeichenkette in der Funktion matches(...) führt zur Ausnahme NullPointer.

0 Stimmen

In der Antwort von Max Malysh finden Sie eine prägnante Java 8-Lösung ohne Bibliotheken von Drittanbietern.

1037voto

CraigTP Punkte 42633

Dies geschieht in der Regel mit einer einfachen benutzerdefinierten Funktion (z. B. der Funktion "isNumeric" von Roll-your-own).

Etwa so:

public static boolean isNumeric(String str) { 
  try {  
    Double.parseDouble(str);  
    return true;
  } catch(NumberFormatException e){  
    return false;  
  }  
}

Wenn Sie diese Funktion jedoch häufig aufrufen und damit rechnen, dass viele der Überprüfungen fehlschlagen, weil es sich nicht um eine Zahl handelt, ist die Leistung dieses Mechanismus nicht sehr hoch, da Sie darauf angewiesen sind, dass bei jedem Fehler eine Ausnahme ausgelöst wird, was eine ziemlich teure Operation ist.

Eine andere Möglichkeit ist die Verwendung eines regulären Ausdrucks, um zu prüfen, ob es sich um eine Zahl handelt:

public static boolean isNumeric(String str) {
  return str.matches("-?\\d+(\\.\\d+)?");  //match a number with optional '-' and decimal.
}

Seien Sie jedoch vorsichtig mit dem obigen RegEx-Mechanismus, da er fehlschlägt, wenn Sie nicht-arabische Ziffern verwenden (d.h. andere Ziffern als 0 bis 9). Das liegt daran, dass die " \d "Teil des RegEx-Teils passt nur auf [0-9] und ist in der Tat international nicht numerisch. (Dank an OregonGhost für den Hinweis darauf!)

Eine weitere Alternative ist die Verwendung des in Java eingebauten java.text.NumberFormat-Objekts, um festzustellen, ob nach dem Parsen der Zeichenkette die Parserposition am Ende der Zeichenkette liegt. Ist dies der Fall, können wir davon ausgehen, dass die gesamte Zeichenkette numerisch ist:

public static boolean isNumeric(String str) {
  ParsePosition pos = new ParsePosition(0);
  NumberFormat.getInstance().parse(str, pos);
  return str.length() == pos.getIndex();
}

8 Stimmen

Hat \d in Java Regex nur mit lateinischen Ziffern übereinstimmen? Wenn es wie .NET Regexes ist, werden Sie in ein Problem mit anderen (z.B. arabischen) Ziffern laufen, wie hier erklärt: blogs.msdn.com/oldnewthing/archive/2004/03/09/86555.aspx

0 Stimmen

@OregonGhost - Oops.. Gut gefangen. Sie haben recht. \d passt nur auf lateinische Ziffern (d.h. 0 bis 9) und schlägt bei arabischen Ziffern fehl. Ich habe mein Posting bearbeitet, um dies zu verdeutlichen. Danke!

3 Stimmen

Die numberFormatter-Lösung ist wahrscheinlich nur unwesentlich besser als die NumberFormatException-Lösung. Ich vermute, der beste Weg ist, Regex ein zu verwenden.

789voto

palacsint Punkte 27290

Con Apache Commons Lang 3,5 und höher: NumberUtils.isCreatable o StringUtils.isNumeric .

Con Apache Commons Lang 3,4 und darunter: NumberUtils.isNumber o StringUtils.isNumeric .

Sie können auch Folgendes verwenden StringUtils.isNumericSpace die zurückgibt true für leere Zeichenketten und ignoriert interne Leerzeichen in der Zeichenkette. Eine andere Möglichkeit ist die Verwendung von NumberUtils.isParsable die im Wesentlichen prüft, ob die Zahl nach Java parsbar ist. (Die verlinkten Javadocs enthalten detaillierte Beispiele für jede Methode).

73 Stimmen

StringUtils.isNumeric() wäre hier wahrscheinlich nicht angebracht, da es nur prüft, ob die Zeichenkette eine Folge von Ziffern ist. Wäre in Ordnung für die meisten ints, aber nicht so für Zahlen mit Dezimalstellen, Gruppentrennzeichen, etc.

1 Stimmen

Ziemlich alte Frage, aber nur für alle, die für Hilfe lesen - StringUtils.isNumeric wird nicht funktionieren, auch wenn es leere String ist. Es wird true für leere String für StringUtils.isNumeric() zurückgeben.

2 Stimmen

@JUG: Vielen Dank für die Vorwarnung. Seltsamerweise sagt das verlinkte Dokument das Gegenteil, vielleicht wegen einer neueren Version (beachten Sie, dass die Antwort nur ein paar Tage nach der Veröffentlichung Ihres Kommentars bearbeitet wurde)

203voto

Max Malysh Punkte 25480

Java 8-Lambda-Ausdrücke.

String someString = "123123";
boolean isNumeric = someString.chars().allMatch( Character::isDigit );

4 Stimmen

Sie können auch einen Methodenverweis verwenden: someString.chars().allMatch(Character::isDigit)

3 Stimmen

Schön, aber es ist immer noch das Rad neu zu erfinden, wie fast alle "Lösungen" hier. Auch scheitert an "null" (wie fast alle anderen).

12 Stimmen

Diese Antwort ist kurz, einfach und lesbar. Man kann sie fast wie Englisch lesen - "chars all match digits". Sie erfordert keine Bibliotheken von Drittanbietern. Sie verwendet keine Ausnahmen in nicht außergewöhnlichen Fällen. Dies sollte die akzeptierte Antwort werden.

173voto

Ahmed Alejo Punkte 2229

Wenn Sie Android verwenden, sollten Sie die Funktion nutzen:

android.text.TextUtils.isDigitsOnly(CharSequence str)

Die Dokumentation ist hier zu finden

es einfach halten . fast jeder kann "umprogrammieren" (das Gleiche).

5 Stimmen

@kape123 :) sicher, dass "123.456" keine Ziffern enthält.

10 Stimmen

Hinweis: Dies führt zu NPE bei Nulleingabe. Funktioniert auch nicht mit negativen Zahlen oder Dezimalzahlen.

2 Stimmen

Ich mag es!! Ich denke, das ist absolut für Ziffern. Nicht für . , -

133voto

Ibrahim Arief Punkte 8216

Wie @CraigTP in seiner ausgezeichneten Antwort erwähnt hatte, habe ich auch ähnliche Leistungsprobleme bei der Verwendung von Exceptions zum Testen, ob die Zeichenfolge numerisch ist oder nicht. Also teile ich die Zeichenkette auf und verwende java.lang.Character.isDigit() .

public static boolean isNumeric(String str)
{
    for (char c : str.toCharArray())
    {
        if (!Character.isDigit(c)) return false;
    }
    return true;
}

Nach Angaben von die Javadoc , Character.isDigit(char) erkennt nicht-lateinische Ziffern korrekt. In Bezug auf die Leistung denke ich, dass eine einfache Anzahl von N-Vergleichen, wobei N die Anzahl der Zeichen in der Zeichenfolge ist, rechnerisch effizienter wäre als ein Regex-Matching.

UPDATE: Wie von Jean-François Corbett in einem Kommentar erwähnt, würde der obige Code nur positive Ganzzahlen validieren, was den Großteil meines Anwendungsfalls abdeckt. Im Folgenden finden Sie den aktualisierten Code, der Dezimalzahlen entsprechend dem in Ihrem System verwendeten Standardgebietsschema korrekt validiert, wobei davon ausgegangen wird, dass das Dezimaltrennzeichen nur einmal in der Zeichenfolge vorkommt.

public static boolean isStringNumeric( String str )
{
    DecimalFormatSymbols currentLocaleSymbols = DecimalFormatSymbols.getInstance();
    char localeMinusSign = currentLocaleSymbols.getMinusSign();

    if ( !Character.isDigit( str.charAt( 0 ) ) && str.charAt( 0 ) != localeMinusSign ) return false;

    boolean isDecimalSeparatorFound = false;
    char localeDecimalSeparator = currentLocaleSymbols.getDecimalSeparator();

    for ( char c : str.substring( 1 ).toCharArray() )
    {
        if ( !Character.isDigit( c ) )
        {
            if ( c == localeDecimalSeparator && !isDecimalSeparatorFound )
            {
                isDecimalSeparatorFound = true;
                continue;
            }
            return false;
        }
    }
    return true;
}

2 Stimmen

Versagt das Vorzeichen diese Funktion?

1 Stimmen

Ich denke, dies sollte die akzeptierte Antwort sein, weil es die leichteste Lösung ist. Die Verwendung einer Ausnahme oder eines Regex sind beide sehr schwer, um zu prüfen, ob eine Zeichenfolge numerisch ist. Das Iterieren über die Zeichen ist schön und einfach!

2 Stimmen

Der obige Code akzeptiert ein einzelnes '-' als Zahl und gibt true zurück. change first if zu etwas wie: boolean isMinus = str.charAt(0) == localeMinusSign; if ((isMinus && str.length() < 2) || ((!isMinus) && !Character.isDigit(str.charAt(0)))) { return false; }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X