Wie kann ich eine String
in eine int
in Java konvertieren ?
Mein String enthält nur Zahlen und ich möchte die Zahl zurückgeben, die er darstellt.
Bei gegebener Zeichenfolge sollte "1234"
das Ergebnis beispielsweise die Zahl sein 1234
.
java
string
int
type-conversion
Unbekannter Benutzer
quelle
quelle
Antworten:
Wenn Sie sich die Java-Dokumentation ansehen, werden Sie feststellen, dass diese Funktion einen "Haken" auslösen kann
NumberFormatException
, mit dem Sie natürlich umgehen müssen:(Bei dieser Behandlung wird standardmäßig eine fehlerhafte Nummer verwendet
0
, aber Sie können auch etwas anderes tun, wenn Sie möchten.)Alternativ können Sie eine
Ints
Methode aus der Guava-Bibliothek verwenden, die in Kombination mit Java 8Optional
eine leistungsstarke und präzise Möglichkeit bietet, eine Zeichenfolge in eine int zu konvertieren:quelle
int foo = NumberUtils.toInt(myString, 0);
Hier sind zum Beispiel zwei Möglichkeiten:
Es gibt einen kleinen Unterschied zwischen diesen Methoden:
valueOf
Gibt eine neue oder zwischengespeicherte Instanz von zurückjava.lang.Integer
parseInt
gibt primitiv zurückint
.Gleiches gilt für alle Fälle:
Short.valueOf
/parseShort
,Long.valueOf
/parseLong
usw.quelle
valueOf
Methode ist nurreturn valueOf(parseInt(string));
valueOf
ruft sich rekursiv auf?valueOf(String)
wird implementiert, indem zuerst der String mit einem int in ein int analysiertparseInt(String)
und dieses int dann mit using in eine Ganzzahl eingeschlossen wirdvalueOf(int)
. Keine Rekursion hier, weilvalueOf(String)
undvalueOf(int)
zwei völlig unterschiedliche Funktionen sind, auch wenn sie den gleichen Namen haben.Ein sehr wichtiger Punkt ist, dass der Integer-Parser NumberFormatException auslöst, wie in Javadoc angegeben .
Es ist wichtig, diese Ausnahme zu behandeln, wenn Sie versuchen, ganzzahlige Werte aus geteilten Argumenten abzurufen oder etwas dynamisch zu analysieren.
quelle
"([0-9]+)"
Willens "erfasst" die erste Sequenz einer oder mehrerer Ziffern eins bis neun. Schauen Sie sich dieMatcher
Klasse in diesem Paket an.Mach es manuell:
quelle
Integer.parseInt(s)
? - Ich sehe den Punkt darin als eine Interviewfrage, aber a) das bedeutet nicht, dass Sie es so machen würden (was der Fragesteller gefragt hat), und b) diese Antwort ist sowieso ein ziemlich schlechtes Beispiel.Integer.parseInt
weil es keine Validierung macht.Eine alternative Lösung ist die Verwendung von NumberUtils von Apache Commons :
Das Apache-Dienstprogramm ist nett, denn wenn die Zeichenfolge ein ungültiges Zahlenformat hat, wird immer 0 zurückgegeben. Dadurch sparen Sie den try catch-Block.
Apache NumberUtils API Version 3.4
quelle
Momentan mache ich eine Aufgabe für das College, wo ich bestimmte Ausdrücke wie die oben genannten nicht verwenden kann, und indem ich mir die ASCII-Tabelle anschaue, habe ich es geschafft. Es ist ein weitaus komplexerer Code, aber er könnte anderen helfen, die wie ich eingeschränkt sind.
Als erstes erhalten Sie die Eingabe, in diesem Fall eine Ziffernfolge. Ich werde es nennen
String number
und in diesem Fall werde ich es daher anhand der Nummer 12 veranschaulichenString number = "12";
Eine weitere Einschränkung war die Tatsache, dass ich keine sich wiederholenden Zyklen verwenden konnte, daher kann auch ein
for
Zyklus (der perfekt gewesen wäre) nicht verwendet werden. Das schränkt uns ein bisschen ein, aber das ist das Ziel. Da ich nur zwei Ziffern brauchte (die letzten beiden Ziffern),charAt
löste es ein einfaches :Mit den Codes müssen wir nur in die Tabelle schauen und die notwendigen Anpassungen vornehmen:
Warum also verdoppeln? Nun, wegen eines wirklich "seltsamen" Schritts. Derzeit haben wir zwei Doppel, 1 und 2, aber wir müssen daraus 12 machen, es gibt keine mathematische Operation, die wir ausführen können.
Wir teilen letzteres (letzte Ziffer) durch 10
2/10 = 0.2
(also warum doppelt) wie folgt :Dies spielt nur mit Zahlen. Wir haben die letzte Ziffer in eine Dezimalzahl umgewandelt. Aber jetzt schauen Sie, was passiert:
Ohne zu sehr in die Mathematik einzusteigen, isolieren wir einfach die Ziffern einer Zahl. Sie sehen, da wir nur 0-9 betrachten, ist das Teilen durch ein Vielfaches von 10 wie das Erstellen einer "Box", in der Sie es speichern (denken Sie daran, als Ihr Lehrer in der ersten Klasse Ihnen erklärte, was eine Einheit und hundert waren). Damit:
Und los geht's. Sie haben eine Ziffernfolge (in diesem Fall zwei Ziffern) in eine Ganzzahl umgewandelt, die aus diesen beiden Ziffern besteht, wobei die folgenden Einschränkungen berücksichtigt wurden:
quelle
'0'
für den Charakter verwenden können48
und niemals müssen sich mit seinem tatsächlichen numerischen Wert beschäftigen. Drittens macht der gesamte Umweg mitdouble
Werten überhaupt keinen Sinn, da Sie durch zehn teilen, nur um danach mit zehn zu multiplizieren. Das Ergebnis ist einfach so,semilastdigit * 10 + lastdigit
wie es in der Grundschule gelernt wurde, als das Dezimalsystem eingeführt wurde…semilastdigit
und zu verwendenlastdigit
. Wie würden Sie Ihre Lösung codieren, um "sich wiederholende Zyklen" zu vermeiden, wenn ich Ihnen eine gültige numerische Zeichenfolge beliebiger Länge (dh einen beliebigen Wert zwischen "-2147483648" und "2147483647") zur VerfügungInteger.decode
Sie können auch verwenden
public static Integer decode(String nm) throws NumberFormatException
.Es funktioniert auch für Basis 8 und 16:
Wenn Sie
int
stattdessen erhalten möchten,Integer
können Sie verwenden:Unboxing:
intValue()
::quelle
Immer wenn die geringste Möglichkeit besteht, dass der angegebene String keine Ganzzahl enthält, müssen Sie diesen Sonderfall behandeln. Leider signalisieren die Standard-Java-Methoden
Integer::parseInt
undInteger::valueOf
werfen einNumberFormatException
, um diesen Sonderfall zu signalisieren. Daher müssen Sie Ausnahmen für die Flusskontrolle verwenden, was im Allgemeinen als schlechter Codierungsstil angesehen wird.Meiner Meinung nach sollte dieser Sonderfall durch Rückgabe eines leeren behandelt werden
Optional<Integer>
. Da Java eine solche Methode nicht anbietet, verwende ich den folgenden Wrapper:Anwendungsbeispiel:
Während dies intern immer noch Ausnahmen für die Flusskontrolle verwendet, wird der Verwendungscode sehr sauber. Außerdem können Sie den Fall, in dem
-1
ein gültiger Wert analysiert wird, und den Fall, in dem eine ungültige Zeichenfolge nicht analysiert werden konnte , klar unterscheiden .quelle
Das Konvertieren eines Strings in ein int ist komplizierter als nur das Konvertieren einer Zahl. Sie haben über folgende Themen nachgedacht:
quelle
Methoden dazu:
Integer.valueOf erzeugt ein Integer-Objekt, alle anderen Methoden - primitive int.
Letzte 2 Methoden von commons-lang3 und großer Artikel zum Konvertieren hier .
quelle
Wir können die
parseInt(String str)
Methode derInteger
Wrapper-Klasse verwenden, um einen String-Wert in einen Integer-Wert zu konvertieren.Zum Beispiel:
Die
Integer
Klasse bietet auch die folgendevalueOf(String str)
Methode:Wir können auch mit
toInt(String strValue)
der NumberUtils Utility - Klasse für die Umwandlung:quelle
Verwenden Sie
Integer.parseInt(yourString)
.Denken Sie an folgende Dinge:
Integer.parseInt("1");
// OKInteger.parseInt("-1");
// OKInteger.parseInt("+1");
// OKInteger.parseInt(" 1");
// Ausnahme (Leerzeichen)Integer.parseInt("2147483648");
// Ausnahme (Integer ist auf einen Maximalwert von 2.147.483.647 begrenzt)Integer.parseInt("1.1");
// Exception ( . Oder , oder was auch immer ist nicht erlaubt)Integer.parseInt("");
// Ausnahme (nicht 0 oder so)Es gibt nur eine Art von Ausnahme:
NumberFormatException
quelle
Ich habe eine Lösung, aber ich weiß nicht, wie effektiv sie ist. Aber es funktioniert gut und ich denke, Sie könnten es verbessern. Andererseits habe ich mit JUnit einige Tests durchgeführt, die richtig waren. Ich habe die Funktion und das Testen angehängt:
Testen mit JUnit:
quelle
(int) Double.parseDouble(input.replaceAll("[^0-9\\.\\-]", ""));
Google Guava verfügt über tryParse (String) , das zurückgibt,
null
wenn der String nicht analysiert werden konnte. Beispiel:quelle
Sie können auch beginnen, indem Sie alle nicht numerischen Zeichen entfernen und dann die Ganzzahl analysieren:
Beachten Sie jedoch, dass dies nur für nicht negative Zahlen funktioniert.
quelle
-42
, dass analysiert wird als42
."4+2"
, bekomme ich42
ohne Hinweis darauf, dass das, was ich versucht habe, falsch war. Der Benutzer hat den Eindruck, dass die Eingabe grundlegender Ausdrücke4+2
eine gültige Eingabe war, die Anwendung jedoch mit einem falschen Wert fortgesetzt wird. Außerdem ist der TypString
nichtstring
...Neben den vorherigen Antworten möchte ich einige Funktionen hinzufügen. Dies sind Ergebnisse, während Sie sie verwenden:
Implementierung:
quelle
Wie bereits erwähnt, kann Apache Commons
NumberUtils
dies tun. Es wird zurückgegeben,0
wenn eine Zeichenfolge nicht in eine int konvertiert werden kann.Sie können auch Ihren eigenen Standardwert definieren:
Beispiel:
quelle
Mit einigen Vorsichtsmaßnahmen können Sie diesen Code auch verwenden.
Option 1: Behandeln Sie die Ausnahme explizit, indem Sie beispielsweise einen Nachrichtendialog anzeigen, und stoppen Sie dann die Ausführung des aktuellen Workflows. Zum Beispiel:
Option 2: Setzen Sie die betroffene Variable zurück, wenn der Ausführungsfluss im Falle einer Ausnahme fortgesetzt werden kann. Zum Beispiel mit einigen Änderungen im catch-Block
Die Verwendung einer Zeichenfolgenkonstante zum Vergleich oder für jede Art von Berechnung ist immer eine gute Idee, da eine Konstante niemals einen Nullwert zurückgibt.
quelle
JOptionPane.showMessageDialog()
Antwort auf die Vanille-Java-Frage einzugeben, macht keinen Sinn.Integer.valueOf(String);
gibt keinen Typ zurückint
.Sie können verwenden
new Scanner("1244").nextInt()
. Oder fragen Sie, ob überhaupt ein int existiert:new Scanner("1244").hasNextInt()
quelle
Bei Programmierwettbewerben, bei denen Sie sicher sind, dass die Zahl immer eine gültige Ganzzahl ist, können Sie Ihre eigene Methode zum Analysieren von Eingaben schreiben. Dies überspringt den gesamten validierungsbezogenen Code (da Sie nichts davon benötigen) und ist etwas effizienter.
Für eine gültige positive ganze Zahl:
Für positive und negative ganze Zahlen:
Wenn Sie vor oder nach diesen Zahlen ein Leerzeichen erwarten, stellen Sie sicher, dass Sie
str = str.trim()
vor der weiteren Verarbeitung ein Leerzeichen eingeben .quelle
Einfach können Sie dies versuchen:
Integer.parseInt(your_string);
diese Option , um einString
in zu konvertierenint
Double.parseDouble(your_string);
diese Option , um einString
in zu konvertierendouble
Beispiel
quelle
Für eine normale Zeichenfolge können Sie Folgendes verwenden:
Für einen String-Builder und einen String-Puffer können Sie Folgendes verwenden:
quelle
Stellen Sie sicher, dass die Zeichenfolge keine nicht numerischen Daten enthält.
quelle
Ich bin ein bisschen überrascht, dass niemand den Integer-Konstruktor erwähnt hat, der String als Parameter verwendet.
Hier ist es also:
Java 8 - Integer (String) .
Natürlich gibt der Konstruktor den Typ zurück
Integer
und eine Unboxing-Operation konvertiert den Wert inint
.Es ist wichtig zu erwähnen : Dieser Konstruktor ruft die
parseInt
Methode auf.quelle
Verwenden Sie Integer.parseInt () und fügen Sie es in einen
try...catch
Block ein, um Fehler zu behandeln, falls ein nicht numerisches Zeichen eingegeben wird, z.quelle
Auf geht's
quelle
Es gibt sieben Möglichkeiten:
1) Verwenden von
Ints.tryParse
:2) Verwenden von
NumberUtils.createInteger
:3) Verwenden von
NumberUtils.toInt
:4) Verwenden von
Integer.valueOf
:5) Verwenden von
Integer.parseInt
:6) Verwenden von
Integer.decode
:7) Verwenden von
Integer.parseUnsignedInt
:quelle
Eine Methode ist parseInt (String). Es gibt ein primitives int zurück:
Die zweite Methode ist valueOf (String) und gibt ein neues Integer () -Objekt zurück:
quelle
Sie können Folgendes verwenden:
Integer.parseInt(s)
Integer.parseInt(s, radix)
Integer.parseInt(s, beginIndex, endIndex, radix)
Integer.parseUnsignedInt(s)
Integer.parseUnsignedInt(s, radix)
Integer.parseUnsignedInt(s, beginIndex, endIndex, radix)
Integer.valueOf(s)
Integer.valueOf(s, radix)
Integer.decode(s)
NumberUtils.toInt(s)
NumberUtils.toInt(s, defaultValue)
quelle
Dies ist ein vollständiges Programm mit allen positiven und negativen Bedingungen ohne Verwendung einer Bibliothek
quelle
Integer.parseInt
. Verwenden Sie es einfach .