Conversione di una stringa in int in Groovy


286

Ho un Stringche rappresenta un valore intero e vorrei convertirlo in un int. Esiste un equivalente di Groovy di Java Integer.parseInt(String)?


1
perché non usare semplicemente la parola chiave def?
Onnipresente l'

4
Ho un parametro di stringa che contiene un numero intero. L'uso di def i = string_parameter provoca l'eccezione del cast di classe se in seguito utilizzo i come int.
Steve Kuo,

Risposte:


492

Utilizzare il toInteger()metodo per convertire un Stringin un Integer, ad es

int value = "99".toInteger()

Un'alternativa, che evita l'uso di un metodo deprecato (vedi sotto) è

int value = "66" as Integer

Se è necessario verificare se il String può essere convertito prima di eseguire la conversione, utilizzare

String number = "66"

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

Aggiornamento di deprecazione

Nelle recenti versioni di Groovy uno dei toInteger()metodi è stato deprecato. Quanto segue è tratto da 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);
}

Puoi forzare la versione non deprecata del metodo per essere chiamata usando qualcosa di terribile come:

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

Personalmente preferisco di gran lunga:

int num = 66 as Integer

19
Caveat emptor: devi prima controllare il valore isInteger(), perché toInteger()genererà un'eccezione se la stringa non è numerica. Lo stesso vale per toFloat()/isFloat()
Andres Kievsky,

8
Nella documentazione di API 2.1.6 isInteger / toInteger sono obsoleti. Qual è attualmente il modo migliore per farlo?
Pakman,

1
L'uso di Integer paramValue = params.int ('paramName') non è sicuro. Se non ci sono parametri con il nome "paramName" nella param map, si ottiene un'eccezione su cui non è possibile eseguire il cast di null su int.
Michael,

2
volevo solo aggiungere, che da Groovy 1.8 intè davvero int. Groovy visualizzerà comunque la classe Integer, a causa della boxe, ma ad esempio non sarà possibile assegnare nulla un int, cosa che era possibile in 1.0. Abbiamo considerato la modifica non critica, poiché non era già possibile utilizzare null come argomento per un parametro di chiamata del metodo di tipo int. Tutto ciò è ancora diverso da Java, poiché in Java non è possibile convertire Integer in Long con una semplice assegnazione o chiamare un metodo int prendendo con un Long.
blackdrag,

1
@pakman StringGroovyMethods.isInteger(String)e DefaultGroovyMethods.isInteger(CharSequence)sono deprecati a favore di StringGroovyMethods.isInteger(CharSequence). Lo stesso vale per toInteger().
bmaupin,

67

Diversi modi per farlo, questo è il mio preferito:

def number = '123' as int

10
Stesso problema di cui sopra, ciò genererà un'eccezione se la stringa non è un numero. Verificare isInteger()prima con .
Andres Kievsky,

12
@ank la domanda posta per un equivalente di Integer.parseInt(String)cui genera anche un'eccezione se la stringa non è un numero, quindi data la domanda, non considero questo un "problema"
Dónal

30

Come un addendum alla risposta di Don , non solo non Groovy aggiungere un .toInteger()metodo per Strings, si aggiunge anche toBigDecimal(), toBigInteger(), toBoolean(), toCharacter(), toDouble(), toFloat(), toList(), e toLong().

Allo stesso modo, is*Groovy aggiunge anche eqivalenti a tutti quelli che ritornano truese la Stringquestione in questione può essere analizzata nel formato in questione.

La pagina GDK pertinente è qui.


8
Questa è la risposta corretta - controlla prima con isInteger(), poi fai toInteger()... cioè, a meno che tu non preferisca aggiungere un try/ catchblocco :) ma usare le eccezioni per questo è una cattiva idea.
Andres Kievsky,

2
@anktastic Direi che la mia risposta è più corretta perché la domanda ha chiesto "un equivalente di Groovy di Integer.parseInt (String)" di Java, ovvero una conversione non controllata
Dónal

25

Non sono sicuro che sia stato introdotto nelle versioni recenti di groovy (la risposta iniziale è abbastanza vecchia), ma ora puoi usare:

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

o

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

Raccomando di usare float o anche doppi invece di numeri interi nel caso in cui la stringa fornita non sia affidabile.


2
+1 migliore soluzione IMO in quanto include il controllo null oltre al controllo del tipo prima della conversione
kaskelotti

Sconsiglio di usare float o doppi perché sono intrinsecamente inaccurati. Poiché Groovy semplifica l'utilizzo di BigDecimals come qualsiasi altro numero, se hai bisogno di maggiore precisione rispetto a un numero intero, utilizzalo. In secondo luogo, questo approccio sembra sicuro, ma il risultato può essere num == null, quindi devi stare attento con questo
Hans Bogaards,

Per il primo codice di esempio, suppongo che tu volessi scrivere mystring.toInteger()invece di mystring.toFloat(). Quindi def num = mystring?.isInteger() ? mystring.toInteger() : nullsarebbe corretto.
Sk8erPeter,

15

Bene, Groovy accetta bene il modulo Java. Se stai chiedendo se esiste un modo Groovier , c'è un modo per andare Integer.

Entrambi sono mostrati qui:

String s = "99"
assert 99 == Integer.parseInt(s)
Integer i = s as Integer
assert 99 == i

5
Questa risposta genera anche quando la stringa non è numerica - attenzione!
Andres Kievsky,

6

inoltre puoi effettuare l'importazione statica

import static java.lang.Integer.parseInt as asInteger

e dopo questo uso

String s = "99"
asInteger(s)

Bene, mi dimentico molto delle piccole cose.
Magic Octopus Urn,

3

toInteger() Il metodo è disponibile in Groovy, è possibile utilizzarlo.


2

Diversi modi per raggiungere questo obiettivo. Gli esempi sono i seguenti

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

Spero che questo ti aiuti


1
In che modo ciò aggiunge qualcosa alla domanda non già presente nelle 8 risposte esistenti?
LukeG,

Mio cattivo, è diventato un po 'avido qui
Darth Shekhar,

1

Conversione di stile Groovy:

Integer num = '589' as Integer

Se hai un parametro di richiesta:

Integer age = params.int('age')



0

Il modo di usare dovrebbe essere comunque toInteger (), perché non è veramente deprecato.

int value = '99'.toInteger()

La versione String è obsoleta, ma CharSequence è un'interfaccia implementata da String. Quindi, usare una stringa è ok, perché il tuo codice funzionerà anche quando il metodo funzionerà solo con CharSequence. Lo stesso vale per isInteger ()

Vedi questa domanda per riferimento: Come convertire una stringa in CharSequence?

Ho commentato, perché la nozione di deprecato su questo metodo mi ha confuso e voglio evitarlo per le altre persone.


-1

Il modo più semplice di convertire una stringa in numero intero in Groovy è come segue ...

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

Ora "i" contiene il valore intero.


4
Cosa aggiunge questo alle risposte esistenti? La risposta accettata pubblicata 9 anni fa inizia con: "Usa il toInteger()metodo per convertire ...
impostazione predefinita
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.