2010-02-26 7 views
25

Wie kann ich den Int-Wert aus einer Zeichenfolge wie 423e erhalten - d. H. Eine Zeichenfolge, die eine Zahl enthält, aber auch einen Buchstaben?Get Int von String, auch Buchstaben enthalten, in Java

Integer.parseInt() schlägt fehl, da die Zeichenfolge vollständig eine Zahl sein muss.

+0

nicht zu wissen, etwas über Java, ich weiß, Sie dies mit regex tun könnte. Entferne zuerst alle Zeichen, die nicht 0-9 sind, dann parseInt, was immer noch übrig ist. Ist das die Art von was du suchst? –

Antwort

10

Wenn Sie nicht von Basis-16-Zahlen sprechen (für die es eine Methode gibt, als Hex zu analysieren), müssen Sie den Teil, an dem Sie interessiert sind, explizit trennen und dann konvertieren. Nach allem, was wäre die Semantik von etwas wie 23e44e11d in der Basis 10?

Reguläre Ausdrücke könnten den Trick machen, wenn Sie sicher sind, dass Sie nur eine Zahl haben. Java verfügt über einen eingebauten regulären Ausdrucksparser.

Wenn Ihr Ziel dagegen ist, alle Ziffern zu verketten und die Alphas auszugeben, dann ist das ziemlich einfach, indem Sie Zeichen für Zeichen durchlaufen, um mit StringBuilder eine Zeichenfolge zu erstellen und diese dann zu analysieren.

+0

Danke, ich habe es mit Regex gemacht. Ich dachte, dass es irgendwo eine eingebaute Methode geben könnte. – DisgruntledGoat

2

Vielleicht erhalten Sie die Größe der Zeichenfolge und Schleife durch jedes Zeichen und rufen Sie isDigit() für jedes Zeichen. Wenn es sich um eine Ziffer handelt, fügen Sie sie einer Zeichenfolge hinzu, die nur die Zahlen vor dem Aufruf von Integer.parseInt() erfasst.

Etwas wie:

String something = "423e"; 
    int length = something.length(); 
    String result = ""; 
    for (int i = 0; i < length; i++) { 
     Character character = something.charAt(i); 
     if (Character.isDigit(character)) { 
      result += character; 
     } 
    } 
    System.out.println("result is: " + result); 
+3

Der Algorithmus ist korrekt, aber Sie sollten StringBuilder verwenden, um an das Ergebnis anzuhängen. –

+3

Einverstanden. Ich denke, man kann beim Tippen in Eile nicht immer perfekt sein. – digiarnie

+0

Lieber nicht so eilig sein. Verkettung in einem Zyklus ist eines der schlimmsten Dinge, die Sie möglicherweise mit Strings tun können. Und es ist immer noch nicht nach 6 Jahren behoben. – Vlasec

67

alle mit leeren Nicht-Ziffer ersetzen: die verbleibende Zeichenfolge enthält nur Ziffern.

Integer.parseInt(s.replaceAll("[\\D]", "")) 

Dies wird auch nicht-Ziffern dazwischen Ziffern entfernen, so "x1x1x" wird 11.

Wenn Sie bestätigen müssen, dass die Zeichenfolge aus einer Folge von Ziffern besteht (mindestens eine) möglicherweise einen Brief folgte, dann verwenden:

s.matches("[\\d]+[A-Za-z]?") 
16

Die Number Klasse wird nur die Zeichenfolge analysieren, bis es erreicht ein nicht-parseable Charakter:

((Number)NumberFormat.getInstance().parse("123e")).intValue() 

daher 123.

+0

Es gibt auch [getIntegerInstance()] (https://docs.oracle.com/javase/7/docs/api/java/text/Zahlenformat.html # getIntegerInstance% 28% 29) – mlt

2

gehen Sie einfach durch die Zeichenfolge zurück, ein int wie gewohnt den Aufbau, aber nicht-Nummer characte ignorieren rs:

int res = 0; 
for (int i=0; i < str.length(); i++) { 
    char c = s.charAt(i); 
    if (c < '0' || c > '9') continue; 
    res = res * 10 + (c - '0'); 
} 
+0

Ziemlich sicher, dass die letzte Zeile sein sollte 'res = res * 10 + c -' 0 '; ' – benkc

+0

@benkc: es scheint, dass Sie richtig sind – Claudiu

3

Sie auch Scanner verwenden können:

Scanner s = new Scanner(MyString); 
s.nextInt(); 
+0

funktioniert nicht ??? –

+1

Die Klasse [Scanner] (http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html) setzt Whitespace als Trennzeichen zwischen den Tokens voraus, das jedoch in jede Regex geändert werden kann wie in 'new Scanner (" 456e "). useDelimiter (" \\ D "). nextInt()'. –