Konvertieren eines Strings in int in Groovy

286

Ich habe eine String, die einen ganzzahligen Wert darstellt und möchte ihn in eine konvertieren int. Gibt es ein grooviges Äquivalent zu Java Integer.parseInt(String)?

Steve Kuo
quelle
1
Warum nicht einfach das Schlüsselwort def verwenden?
Allgegenwärtig
4
Ich habe einen String-Parameter, der eine Ganzzahl enthält. Die Verwendung von def i = string_parameter führt zu einer Klassenumwandlungsausnahme, wenn ich später i als int verwende.
Steve Kuo

Antworten:

492

Verwenden Sie die toInteger()Methode, um a Stringin ein zu konvertieren Integer, z

int value = "99".toInteger()

Eine Alternative, die die Verwendung einer veralteten Methode vermeidet (siehe unten), ist

int value = "66" as Integer

Wenn Sie überprüfen müssen, ob das konvertiert werden String kann , bevor Sie die Konvertierung durchführen, verwenden Sie

String number = "66"

if (number.isInteger()) {
  int value = number as Integer
}

Verfallsaktualisierung

In neueren Versionen von Groovy ist eine der toInteger()Methoden veraltet. Das Folgende stammt aus org.codehaus.groovy.runtime.StringGroovyMethodsGroovy 2.4.4

/**
 * Parse a CharSequence into an Integer
 *
 * @param self a CharSequence
 * @return an Integer
 * @since 1.8.2
 */
public static Integer toInteger(CharSequence self) {
    return Integer.valueOf(self.toString().trim());
}

/**
 * @deprecated Use the CharSequence version
 * @see #toInteger(CharSequence)
 */
@Deprecated
public static Integer toInteger(String self) {
    return toInteger((CharSequence) self);
}

Sie können erzwingen, dass die nicht veraltete Version der Methode aufgerufen wird, indem Sie Folgendes verwenden:

int num = ((CharSequence) "66").toInteger()

Persönlich bevorzuge ich:

int num = 66 as Integer
Dónal
quelle
19
Vorsichtsmaßnahme: Sie müssen den Wert isInteger()zuerst mit überprüfen , da toInteger()eine Ausnahme ausgelöst wird, wenn die Zeichenfolge nicht numerisch ist. Gleiches gilt für toFloat()/isFloat()
Andres Kievsky
8
In der 2.1.6-API-Dokumentation sind isInteger / toInteger veraltet. Was ist dann der derzeit beste Weg, dies zu tun?
Pakman
1
Die Verwendung von Integer paramValue = params.int ('paramName') ist jedoch nicht null sicher. Wenn es in der Parameterzuordnung keinen Parameter mit dem Namen "paramName" gibt, erhalten Sie eine Ausnahme, dass nicht null in int umgewandelt werden kann.
Michael
2
wollte nur hinzufügen, dass da Groovy 1.8 intin der Tat ist int. Groovy wird immer noch die Integer - Klasse angezeigt werden , weil der Box, aber Sie werden zum Beispiel nicht in der Lage sein , zu vergeben , nullum einen int, die in 1.0 möglich war. Wir haben die Änderung als unkritisch angesehen, da Sie null bereits nicht als Argument für einen Methodenaufrufparameter vom Typ verwenden konnten int. Dies alles unterscheidet sich immer noch von Java, da Sie in Java Integer nicht durch einfache Zuweisung in Long konvertieren oder eine int-Taking-Methode mit Long aufrufen können.
Blackdrag
1
@pakman StringGroovyMethods.isInteger(String)und DefaultGroovyMethods.isInteger(CharSequence)sind zugunsten von veraltet StringGroovyMethods.isInteger(CharSequence). Gleiches gilt für toInteger().
Bmaupin
67

Es gibt verschiedene Möglichkeiten, dies ist mein Favorit:

def number = '123' as int
Esko
quelle
10
Gleiches Problem wie oben, dies löst eine Ausnahme aus, wenn die Zeichenfolge keine Zahl ist. Überprüfen Sie isInteger()zuerst mit.
Andres Kievsky
12
@ank die Frage nach einem Äquivalent gestellt, Integer.parseInt(String)das auch eine Ausnahme auslöst, wenn die Zeichenfolge keine Zahl ist. Angesichts der Frage halte ich dies nicht für ein "Problem"
Dónal
30

Als Nachtrag zu Don Antwort , nicht nur groovy eine fügt .toInteger()Methode Strings, es fügt auch toBigDecimal(), toBigInteger(), toBoolean(), toCharacter(), toDouble(), toFloat(),toList() , und toLong().

In der gleichen Weise fügt is*groovy all jenen, die zurückkehren, truewenn dieString betreffende Format in das betreffende Format analysiert werden kann.

Die entsprechende GDK-Seite finden Sie hier.

Electrons_Ahoy
quelle
8
Dies ist die richtige Antwort - zuerst mit prüfen isInteger(), dann tun toInteger()... das heißt, es sei denn, Sie möchten lieber einen try/ catch-Block hinzufügen :), aber Ausnahmen dafür zu verwenden, ist eine schlechte Idee.
Andres Kievsky
2
@anktastic Ich würde argumentieren, dass meine Antwort korrekter ist, weil die Frage nach "einem groovigen Äquivalent von Javas Integer.parseInt (String)" gestellt wurde, dh nach einer ungeprüften Konvertierung
Dónal
25

Ich bin nicht sicher, ob es in neueren Versionen von groovy eingeführt wurde (die erste Antwort ist ziemlich alt), aber jetzt können Sie Folgendes verwenden:

def num = mystring?.isInteger() ? mystring.toInteger() : null

oder

def num = mystring?.isFloat() ? mystring.toFloat() : null

Ich empfehle die Verwendung von Floats oder sogar Doubles anstelle von Ganzzahlen, wenn die angegebene Zeichenfolge unzuverlässig ist.

Shmaperator
quelle
2
+1 beste Lösung IMO, da es zusätzlich zur Typprüfung vor der Konvertierung eine
Nullprüfung enthält
Ich empfehle, keine Floats oder Doubles zu verwenden, da diese von Natur aus ungenau sind. Da Groovy die Verwendung von BigDecimals so einfach wie jede andere Zahl macht, sollten Sie diese verwenden, wenn Sie mehr Genauigkeit als eine Ganzzahl benötigen. Zweitens scheint dieser Ansatz sicher zu sein, aber das Ergebnis kann sein, dass num == null ist, also müssen Sie damit vorsichtig sein
Hans Bogaards
Für den ersten Beispielcode wollten Sie wohl mystring.toInteger()stattdessen schreiben mystring.toFloat(). Wäre def num = mystring?.isInteger() ? mystring.toInteger() : nullalso richtig.
Sk8erPeter
15

Nun, Groovy akzeptiert die Java-Form ganz gut. Wenn Sie fragen, ob es einen Groovier- Weg gibt, gibt es einen Weg, zu dem Sie gehen können Integer.

Beide werden hier gezeigt:

String s = "99"
assert 99 == Integer.parseInt(s)
Integer i = s as Integer
assert 99 == i
Michael Ostern
quelle
5
Diese Antwort wird auch ausgelöst, wenn die Zeichenfolge nicht numerisch ist - aufgepasst!
Andres Kievsky
6

Sie können auch statische Importe durchführen

import static java.lang.Integer.parseInt as asInteger

und nach dieser Verwendung

String s = "99"
asInteger(s)
Andrey
quelle
Ordentlich, ich vergesse die kleinen Dinge viel.
Magic Octopus Urn
3

toInteger() Methode ist in groovy verfügbar, Sie könnten das verwenden.

Aakarsh Gupta
quelle
2

Mehrere Möglichkeiten, dies zu erreichen. Beispiele sind wie folgt

a. return "22".toInteger()
b. if("22".isInteger()) return "22".toInteger()
c. return "22" as Integer()
d. return Integer.parseInt("22")

Hoffe das hilft

Darth Shekhar
quelle
1
Wie fügt dies der Frage etwas hinzu, das in den 8 vorhandenen Antworten noch nicht vorhanden ist?
LukeG
Mein schlechtes, wurde ein bisschen gierig hier
Darth Shekhar
1

Groovy Style Konvertierung:

Integer num = '589' as Integer

Wenn Sie einen Anforderungsparameter haben:

Integer age = params.int('age')
Sagar Mal Shankhala
quelle
1
def str = "32"

int num = str as Integer
Ratzip
quelle
0

Hier ist der andere Weg. wenn Sie keine Ausnahmen mögen.

def strnumber = "100"
def intValue = strnumber.isInteger() ?  (strnumber as int) : null
Berhanu Tarekegn
quelle
Ich denke, dies ist die gleiche Antwort wie # 16877253 von @Shmaperator
MarkHu
0

Die Verwendung sollte immer noch toInteger () sein, da es nicht wirklich veraltet ist.

int value = '99'.toInteger()

Die String-Version ist veraltet, aber die CharSequence ist eine Schnittstelle, die ein String implementiert. Die Verwendung eines Strings ist also in Ordnung, da Ihr Code auch dann noch funktioniert, wenn die Methode nur mit CharSequence funktioniert. Gleiches gilt für isInteger ()

Siehe diese Frage als Referenz: Wie konvertiere ich einen String in CharSequence?

Ich habe es kommentiert, weil mich der Begriff der Ablehnung dieser Methode verwirrt hat und ich dies für andere Menschen vermeiden möchte.

Math Morn
quelle
-1

Die einfachere Methode zum Konvertieren eines Strings in eine Ganzzahl in Groovy ist wie folgt ...

String aa="25"
int i= aa.toInteger()

Jetzt enthält "i" den ganzzahligen Wert.

Srinivasan
quelle
4
Was trägt dies zu bestehenden Antworten bei? Die akzeptierte Antwort, die vor 9 Jahren veröffentlicht wurde, beginnt mit: "Verwenden Sie die toInteger()Methode zum Konvertieren ...
Standardgebietsschema