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)?
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
intvalue="99".toInteger()
Eine Alternative, die die Verwendung einer veralteten Methode vermeidet (siehe unten), ist
intvalue="66"asInteger
Wenn Sie überprüfen müssen, ob das konvertiert werden Stringkann , bevor Sie die Konvertierung durchführen, verwenden Sie
String number ="66"if(number.isInteger()){intvalue= number asInteger}
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
*/publicstaticInteger toInteger(CharSequenceself){returnInteger.valueOf(self.toString().trim());}/**
* @deprecated Use the CharSequence version
* @see #toInteger(CharSequence)
*/@DeprecatedpublicstaticInteger toInteger(Stringself){return toInteger((CharSequence)self);}
Sie können erzwingen, dass die nicht veraltete Version der Methode aufgerufen wird, indem Sie Folgendes verwenden:
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:
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.
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.
+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"assert99==Integer.parseInt(s)Integer i = s asIntegerassert99== i
Die Verwendung sollte immer noch toInteger () sein, da es nicht wirklich veraltet ist.
intvalue='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 ()
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 ...
Antworten:
Verwenden Sie die
toInteger()
Methode, um aString
in ein zu konvertierenInteger
, zEine Alternative, die die Verwendung einer veralteten Methode vermeidet (siehe unten), ist
Wenn Sie überprüfen müssen, ob das konvertiert werden
String
kann , bevor Sie die Konvertierung durchführen, verwenden SieVerfallsaktualisierung
In neueren Versionen von Groovy ist eine der
toInteger()
Methoden veraltet. Das Folgende stammt ausorg.codehaus.groovy.runtime.StringGroovyMethods
Groovy 2.4.4Sie können erzwingen, dass die nicht veraltete Version der Methode aufgerufen wird, indem Sie Folgendes verwenden:
Persönlich bevorzuge ich:
quelle
isInteger()
zuerst mit überprüfen , datoInteger()
eine Ausnahme ausgelöst wird, wenn die Zeichenfolge nicht numerisch ist. Gleiches gilt fürtoFloat()
/isFloat()
int
in der Tat istint
. Groovy wird immer noch die Integer - Klasse angezeigt werden , weil der Box, aber Sie werden zum Beispiel nicht in der Lage sein , zu vergeben ,null
um einenint
, 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 konntenint
. 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.StringGroovyMethods.isInteger(String)
undDefaultGroovyMethods.isInteger(CharSequence)
sind zugunsten von veraltetStringGroovyMethods.isInteger(CharSequence)
. Gleiches gilt fürtoInteger()
.Es gibt verschiedene Möglichkeiten, dies ist mein Favorit:
quelle
isInteger()
zuerst mit.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"Als Nachtrag zu Don Antwort , nicht nur groovy eine fügt
.toInteger()
MethodeString
s, es fügt auchtoBigDecimal()
,toBigInteger()
,toBoolean()
,toCharacter()
,toDouble()
,toFloat()
,toList()
, undtoLong()
.In der gleichen Weise fügt
is*
groovy all jenen, die zurückkehren,true
wenn dieString
betreffende Format in das betreffende Format analysiert werden kann.Die entsprechende GDK-Seite finden Sie hier.
quelle
isInteger()
, dann tuntoInteger()
... das heißt, es sei denn, Sie möchten lieber einentry
/catch
-Block hinzufügen :), aber Ausnahmen dafür zu verwenden, ist eine schlechte Idee.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:
oder
Ich empfehle die Verwendung von Floats oder sogar Doubles anstelle von Ganzzahlen, wenn die angegebene Zeichenfolge unzuverlässig ist.
quelle
mystring.toInteger()
stattdessen schreibenmystring.toFloat()
. Wäredef num = mystring?.isInteger() ? mystring.toInteger() : null
also richtig.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:
quelle
Sie können auch statische Importe durchführen
und nach dieser Verwendung
quelle
toInteger()
Methode ist in groovy verfügbar, Sie könnten das verwenden.quelle
Mehrere Möglichkeiten, dies zu erreichen. Beispiele sind wie folgt
Hoffe das hilft
quelle
Groovy Style Konvertierung:
Wenn Sie einen Anforderungsparameter haben:
quelle
quelle
Hier ist der andere Weg. wenn Sie keine Ausnahmen mögen.
quelle
Die Verwendung sollte immer noch toInteger () sein, da es nicht wirklich veraltet ist.
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.
quelle
Die einfachere Methode zum Konvertieren eines Strings in eine Ganzzahl in Groovy ist wie folgt ...
Jetzt enthält "i" den ganzzahligen Wert.
quelle
toInteger()
Methode zum Konvertieren ...