Bestimmen Sie, ob ein String in Java eine ganze Zahl ist [duplicate]

Lesezeit: 10 Minuten

Bestimmen Sie ob ein String in Java eine ganze Zahl
Nick Coelius

Ich versuche festzustellen, ob ein bestimmtes Element in einem Array von Zeichenfolgen eine Ganzzahl ist oder nicht.

Ich bin .split(" ")einen Infix-Ausdruck einfügen String form, und dann versuchen, das resultierende Array in zwei Arrays aufzuteilen; eine für ganze Zahlen, eine für Operatoren, während Klammern und andere verschiedene Elemente verworfen werden. Was wäre der beste Weg, dies zu erreichen?

Ich dachte, ich könnte vielleicht eine finden Integer.isInteger(String arg) Methode oder so etwas, aber kein solches Glück.

  • Ich verstehe nicht, dass bei mehreren Java-Updates solche einfachen Hilfsmethoden nicht in das Kit integriert werden.

    – tony9099

    30. September 2013 um 14:08 Uhr


  • @tony9099 Es ist eine Art Grenzfallsituation und nach dem, was ich gesehen habe, die Tatsache, dass diese Frage immer noch Ansichten erhält, ziemlich einzigartig. Die akzeptierte Problemumgehung (die ich als Antwort akzeptiert habe) ist wahrscheinlich besser, als sie zum Java-Standard zu machen.

    – Nick Coelius

    2. Oktober 2013 um 22:59 Uhr

  • @Nick Um Ihr Argument zu untermauern, dass es nicht notwendig ist, in Java zu sein, hat sich nur etwa einer von 772 Besuchern entschieden, meine Antwort abzustimmen, obwohl es drei nützliche Lösungen gibt (zugegebenermaßen jede besser als die vorherige). Ich denke, das ist ein klarer Hinweis darauf, dass dies ein Randfall ist, bei dem es in den meisten Fällen besser ist, die Art und Weise, wie Sie das Problem lösen, so zu ändern, dass Sie meine Lösung nicht benötigen, anstatt sie tatsächlich zu verwenden.

    – corsiKa

    4. Oktober 2013 um 16:22 Uhr

Bestimmen Sie ob ein String in Java eine ganze Zahl
corsiKa

Der naivste Weg wäre, über den String zu iterieren und sicherzustellen, dass alle Elemente gültige Ziffern für die angegebene Basis sind. Dies ist so effizient wie möglich, da Sie sich jedes Element mindestens einmal ansehen müssen. Ich nehme an, wir könnten es basierend auf dem Radix mikrooptimieren, aber für alle Absichten und Zwecke ist dies so gut, wie Sie es erwarten können.

public static boolean isInteger(String s) {
    return isInteger(s,10);
}

public static boolean isInteger(String s, int radix) {
    if(s.isEmpty()) return false;
    for(int i = 0; i < s.length(); i++) {
        if(i == 0 && s.charAt(i) == '-') {
            if(s.length() == 1) return false;
            else continue;
        }
        if(Character.digit(s.charAt(i),radix) < 0) return false;
    }
    return true;
}

Alternativ können Sie sich darauf verlassen, dass die Java-Bibliothek dies hat. Es basiert nicht auf Ausnahmen und fängt so ziemlich jeden Fehlerzustand ab, den Sie sich vorstellen können. Es wird etwas teurer (Sie müssen ein Scanner-Objekt erstellen, was Sie in einer kritisch engen Schleife nicht tun möchten. Aber es sollte im Allgemeinen nicht zu viel teurer sein, also für den Alltag Operationen sollte es ziemlich zuverlässig sein.

public static boolean isInteger(String s, int radix) {
    Scanner sc = new Scanner(s.trim());
    if(!sc.hasNextInt(radix)) return false;
    // we know it starts with a valid int, now make sure
    // there's nothing left!
    sc.nextInt(radix);
    return !sc.hasNext();
}

Wenn Best Practices für Sie keine Rolle spielen oder Sie den Typ trollen möchten, der Ihre Codeüberprüfungen durchführt, probieren Sie dies für die Größe aus:

public static boolean isInteger(String s) {
    try { 
        Integer.parseInt(s); 
    } catch(NumberFormatException e) { 
        return false; 
    } catch(NullPointerException e) {
        return false;
    }
    // only got here if we didn't return false
    return true;
}

  • Die “nicht auf Ausnahmen basierende Methode” betrachtet “-” als ganze Zahl.

    – Zach Langley

    5. September 2012 um 15:45 Uhr

  • Es ist sicherlich ein unorthodoxer Weg, dies zu tun. Als allgemeine Regel sollten Sie vermeiden, Ausnahmen zu verwenden, um den Ausführungsablauf zu diktieren. Oder wie es Joshua Bloch in seinem „Effective Java item 57: Use Exceptions only for Exceptional Conditions“ ausdrückt. Sein Kommentar zur Verwendung von Ausnahmen zum Durchlaufen eines Arrays lautet // Horrible abuse of exceptions. Don't ever do this! eigentlich

    – corsiKa

    3. März 2015 um 17:53 Uhr

  • Könnte mir jemand erklären, warum die 3. Methode schlechte Praxis ist? Weil der Ausführungsablauf auf Ausnahmen basiert?

    – Sebastian Breit

    24. Mai 2015 um 17:10 Uhr

  • Sie werden nicht ohne Grund „Ausnahmen“ genannt. In einer perfekten Welt gibt es nie eine Ausnahme. Angenommen, mein Chef bittet mich, an einer Aufgabe zu arbeiten. Er wird erwarten, dass ich “Ja, Sir!” sage. aber ich könnte antworten: “Ich habe gerade viel zu tun, ich kann keinen neuen Auftrag annehmen, ohne dass die bestehende Arbeit scheitert.” Auf beides ist er vorbereitet. Er ist nicht darauf vorbereitet, dass ich ihm ins Gesicht schlage. Ich verliere meinen Job und er ruft den Sicherheitsdienst. Stellen Sie sich nun vor, er ruft für mich den Sicherheitsdienst und sagt einfach, dass ich zu viel Arbeit habe – das ist die dritte Methode: die Polizei wegen etwas zu rufen, das eigentlich zu erwarten ist.

    – corsiKa

    24. Mai 2015 um 22:40 Uhr

  • Bei Verwendung der Non-Exception-Methode ist die Zeichenfolge „9999999999999999999999“ eine gültige Ganzzahl

    – fgonzales

    3. Dezember 2016 um 9:49 Uhr

Bestimmen Sie ob ein String in Java eine ganze Zahl
shuangwarumwarum

Die Verwendung von regulären Ausdrücken ist besser.

str.matches("-?\\d+");


-?     --> negative sign, could have none or one
\\d+   --> one or more digits

Es ist nicht gut zu benutzen NumberFormatException hier, wenn Sie verwenden können if-statement stattdessen.


Wenn Sie keine führenden Nullen möchten, können Sie einfach den regulären Ausdruck wie folgt verwenden:

str.matches("-?(0|[1-9]\\d*)");

  • Außerdem … Wenn sich jemand mit dem Signal ‘+’ befassen möchte, habe ich diese Version erstellt (in Bezug auf Ihre): str.matches("^[+-]?\\d+$")

    – Damiii

    9. April 2015 um 10:46 Uhr


  • Neugierig, warum dies nicht die gewählte Antwort ist …

    – Brent Hronik

    2. Juni 2015 um 0:04 Uhr

  • @BrentHronik Es ist ein schöner, sauberer Einzeiler, aber laut einer der Antworten unter stackoverflow.com/questions/237159/… ist es 10x langsamer als die von corsiKa vorgeschlagenen Methoden.

    – lreeder

    5. Juli 2015 um 15:04 Uhr

  • Während der Initialisierung, beim Überprüfen des Werts der Konfigurationseingabezeichenfolgen, ist die Leistung kein Problem +1

    – Adam

    15. Mai 2017 um 10:43 Uhr

  • Das führende ^ und das abschließende $ im regulären Ausdruck sind überflüssig, da String.matches() immer mit der gesamten Zeichenfolge übereinstimmt.

    – Schon Vella

    1. Juni 2017 um 22:17 Uhr

1646252233 259 Bestimmen Sie ob ein String in Java eine ganze Zahl
Will Madison

Oder Sie können ein wenig Hilfe von unseren guten Freunden bei Apache Commons in Anspruch nehmen: StringUtils.isNumeric(Zeichenfolge str)

  • Die einzige Frage, die ich zu dieser Methode habe, ist, dass “” true zurückgibt. Unsere Intuition sagt uns, dass die leere Zeichenfolge keine Zahl ist (Integer für die OP-Frage), an der Sie mathematische Operationen durchführen können, aber ich denke, Sie können sagen, dass Sie nicht beweisen können, dass die leere Zeichenfolge nicht numerisch ist, weil wir es Ihnen nicht gesagt haben doch was der String sein wird.

    – Dämongolem

    16. Dezember 2011 um 17:02 Uhr

  • Ich wünschte, das wäre eine gute Antwort für mich, aber “” gibt nicht nur wahr zurück, sondern auch “-1” gibt falsch zurück. Das bedeutet, dass es weder für alle gültigen Ganzzahlen true zurückgibt, noch garantiert die Tatsache, dass es true zurückgibt, dass die Übergabe an Integer.parseInt keine Ausnahme auslöst.

    – Jhericks

    4. April 2013 um 2:41 Uhr

  • @jhericks Danke für den Hinweis. Als ich dies vor ein paar Jahren zum ersten Mal beantwortete, bezog es sich auf eine ältere Version von Commons StringUtils. Seitdem haben sie die API so aktualisiert, dass leere Zeichenfolgen jetzt als nicht numerisch betrachtet werden. Leider müsste der negative Fall separat behandelt werden, was ein Nachteil ist, aber die Umgehung ist trivial. Einfach eine Prüfung auf numberCandidate.startsWith(“-“) und einen Substring-Aufruf mit einer Negation nach dem parseInt-Aufruf, vorausgesetzt, der Wert war natürlich numerisch.

    – Will Madison

    5. April 2013 um 7:14 Uhr

  • Nicht nur ist StringUtils.isNumeric(String) Die ursprüngliche Anforderung, zu prüfen, ob eine Zeichenfolge “eine Ganzzahl ist oder nicht”, nicht zu erfüllen, aber auch ein Tier wie die Apache Commons vorzuschlagen, um das Schreiben eines Einzeilers zu vermeiden, ist meiner Meinung nach nicht rational.

    – Björn Zurmaar

    8. Juli 2017 um 22:27 Uhr

  • Vermeiden Sie einfach Apache “Commons” um jeden Preis. Obwohl es manchmal auf den ersten Blick eine gute Idee ist, ist es nur ein Haufen von Antimustern, die Ihnen die Abhängigkeitshölle bringen werden, mit umstrittenen Ergebnissen.

    – Ymajoros

    4. Oktober 2017 um 5:20 Uhr

1646252233 829 Bestimmen Sie ob ein String in Java eine ganze Zahl
klaus437

Oder einfach

mystring.matches("\\d+")

obwohl es für Zahlen, die größer als ein Int sind, true zurückgeben würde

Sie möchten die verwenden Ganzzahl.parseInt(String) Methode.

try{
  int num = Integer.parseInt(str);
  // is an integer!
} catch (NumberFormatException e) {
  // not an integer!
}

  • Warum wird das nicht besser bewertet? Es scheint mir am einfachsten, oder gibt es einige Nachteile, die ich übersehe?

    – bobismijnaam

    14. April 2016 um 8:14 Uhr

  • @bobismijnnaam Das Problem dabei ist, dass es eine relativ teure Ausnahme erzeugt und Sie einige böse Verschachtelungen haben, die die Lesbarkeit beeinträchtigen können.

    – Zhedar

    20. April 2016 um 19:29 Uhr

  • Ausnahmen weisen darauf hin, dass etwas schief gelaufen ist, und diese Art der Verwendung ist sicherlich ein Missbrauch dieses Designprinzips. Verwenden Sie nur Integer.parserInt() nach dem Sie haben sichergestellt, dass der String wirklich einen ganzzahligen Wert enthält. Wenn Sie dies tun und Integer.parseInt immer noch eine Ausnahme auslöst, wissen Sie, dass Sie ein Problem in Ihrem Code haben, das Sie beheben sollten (oder der Vollständigkeit halber, dass Integer.parseInt selbst fehlerhaft ist, aber diese Option ist ziemlich unwahrscheinlich )

    – Rolch2015

    1. September 2016 um 20:18 Uhr

  • nicht funktioniert und aaaa in einen Wert umgewandelt

    – Khwaja Sanjari

    15. März 2019 um 4:55 Uhr

Als alternativer Ansatz zum Versuch, die Zeichenfolge zu analysieren und abzufangen NumberFormatException, könnten Sie einen regulären Ausdruck verwenden; z.B

if (Pattern.compile("-?[0-9]+").matches(str)) {
    // its an integer
}

Dies ist wahrscheinlich schneller, insbesondere wenn Sie die Regex vorkompilieren und wiederverwenden.

Das Problem bei diesem Ansatz ist jedoch das Integer.parseInt(str) wird auch scheitern, wenn str stellt eine Zahl dar, die außerhalb des zulässigen Bereichs liegt int Werte. Es ist zwar möglich, eine Regex zu erstellen, die nur mit ganzen Zahlen im Bereich übereinstimmt Integer.MIN_INT zu Integer.MAX_INT, es ist kein schöner Anblick. (Und ich werde es nicht versuchen …)

Andererseits … kann es akzeptabel sein, “keine Ganzzahl” und “Ganzzahl zu groß” zu Validierungszwecken getrennt zu behandeln.

  • Warum wird das nicht besser bewertet? Es scheint mir am einfachsten, oder gibt es einige Nachteile, die ich übersehe?

    – bobismijnaam

    14. April 2016 um 8:14 Uhr

  • @bobismijnnaam Das Problem dabei ist, dass es eine relativ teure Ausnahme erzeugt und Sie einige böse Verschachtelungen haben, die die Lesbarkeit beeinträchtigen können.

    – Zhedar

    20. April 2016 um 19:29 Uhr

  • Ausnahmen weisen darauf hin, dass etwas schief gelaufen ist, und diese Art der Verwendung ist sicherlich ein Missbrauch dieses Designprinzips. Verwenden Sie nur Integer.parserInt() nach dem Sie haben sichergestellt, dass der String wirklich einen ganzzahligen Wert enthält. Wenn Sie dies tun und Integer.parseInt immer noch eine Ausnahme auslöst, wissen Sie, dass Sie ein Problem in Ihrem Code haben, das Sie beheben sollten (oder der Vollständigkeit halber, dass Integer.parseInt selbst fehlerhaft ist, aber diese Option ist ziemlich unwahrscheinlich )

    – Rolch2015

    1. September 2016 um 20:18 Uhr

  • nicht funktioniert und aaaa in einen Wert umgewandelt

    – Khwaja Sanjari

    15. März 2019 um 4:55 Uhr

1646252233 623 Bestimmen Sie ob ein String in Java eine ganze Zahl
Rushil Paul

Sie können verwenden Integer.parseInt(str) und fangen die NumberFormatException Wenn die Zeichenfolge keine gültige Ganzzahl ist, auf folgende Weise (wie in allen Antworten angegeben):

static boolean isInt(String s)
{
 try
  { int i = Integer.parseInt(s); return true; }

 catch(NumberFormatException er)
  { return false; }
}

Beachten Sie hier jedoch, dass dieselbe Ausnahme ausgelöst wird, wenn die ausgewertete Ganzzahl überläuft. Ihr Ziel war es herauszufinden, ob es sich um eine gültige Ganzzahl handelt oder nicht. Daher ist es sicherer, eine eigene Methode zur Überprüfung der Gültigkeit zu entwickeln:

static boolean isInt(String s)  // assuming integer is in decimal number system
{
 for(int a=0;a<s.length();a++)
 {
    if(a==0 && s.charAt(a) == '-') continue;
    if( !Character.isDigit(s.charAt(a)) ) return false;
 }
 return true;
}

915750cookie-checkBestimmen Sie, ob ein String in Java eine ganze Zahl ist [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy