Convertir una cadena a int en Groovy

286

Tengo un Stringque representa un valor entero y me gustaría convertirlo en un int. ¿Hay un equivalente maravilloso de Java Integer.parseInt(String)?

Steve Kuo
fuente
1
¿Por qué no usar la palabra clave def?
Omnipresente
44
Tengo un parámetro de cadena que contiene un número entero. Usar def i = string_parameter da como resultado una excepción de conversión de clase si luego uso i como int.
Steve Kuo

Respuestas:

492

Use el toInteger()método para convertir un Stringa un Integer, por ejemplo

int value = "99".toInteger()

Una alternativa, que evita el uso de un método obsoleto (ver más abajo) es

int value = "66" as Integer

Si necesita verificar si String se puede convertir antes de realizar la conversión, use

String number = "66"

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

Actualización de obsolescencia

En versiones recientes de Groovy, uno de los toInteger()métodos ha quedado en desuso. Lo siguiente está tomado de 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);
}

Puede forzar la invocación de la versión no obsoleta del método usando algo horrible como:

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

Personalmente, prefiero mucho:

int num = 66 as Integer
Dónal
fuente
19
Advertencia: isInteger()primero debe verificar el valor , ya toInteger()que arrojará una excepción si la cadena no es numérica. Lo mismo se aplica a toFloat()/isFloat()
Andres Kievsky
8
En la documentación de la API 2.1.6 isInteger / toInteger están en desuso. ¿Cuál es la mejor forma actual de hacer esto entonces?
Pakman
1
Sin embargo, usar Integer paramValue = params.int ('paramName') no es nulo. Si no hay param con el nombre "paramName" en el mapa de param, se obtiene una excepción sobre no se puede convertir nulo en int.
Michael
2
solo quería agregar, que desde Groovy 1.8 intes de hecho int. Groovy seguirá mostrando la clase Integer, debido al boxeo, pero, por ejemplo, no podrá asignar nulla un int, lo que fue posible en 1.0. Consideramos que el cambio no es crítico, ya que no puede usar nulo como argumento para un parámetro de tipo de llamada a método int. Todo esto sigue siendo diferente de Java, ya que en Java no puede convertir Integer a Long mediante una simple asignación o llamar a un método de toma int con un Long.
blackdrag
1
@pakman StringGroovyMethods.isInteger(String)y DefaultGroovyMethods.isInteger(CharSequence)están en desuso a favor de StringGroovyMethods.isInteger(CharSequence). Lo mismo vale para toInteger().
bmaupin
67

Varias formas de hacerlo, este es mi favorito:

def number = '123' as int
Esko
fuente
10
Mismo problema que el anterior, esto arrojará una excepción si la cadena no es un número. Consulte con isInteger()primero.
Andres Kievsky
12
@ank la pregunta solicitó un equivalente del Integer.parseInt(String)cual también arroja una Excepción si la cadena no es un número, por lo que dada la pregunta, no considero que sea un "problema"
Dónal
30

Como una adición a la respuesta de Don , no sólo añadir maravilloso un .toInteger()método para Strings, sino que también añade toBigDecimal(), toBigInteger(), toBoolean(), toCharacter(), toDouble(), toFloat(),toList() , y toLong().

En la misma línea, groovy también agrega is*equivalentes a todos aquellos que regresan truesi elString en cuestión se puede analizar en el formato en cuestión.

La página relevante de GDK está aquí.

Electrones_Ahoy
fuente
8
Esta es la respuesta correcta: verifique primero con isInteger(), luego haga toInteger()... eso es, a menos que prefiera agregar un try/ catchbloque :) pero usar excepciones para esto es una mala idea.
Andres Kievsky
2
@anktastic Yo diría que mi respuesta es más correcta porque la pregunta pedía "un equivalente maravilloso del Integer.parseInt (String) de Java", es decir, una conversión no verificada
Dónal
25

No estoy seguro de si se introdujo en versiones recientes de groovy (la respuesta inicial es bastante antigua), pero ahora puede usar:

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

o

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

Recomiendo usar flotantes o incluso dobles en lugar de enteros en el caso si la cadena proporcionada no es confiable.

Shmaperator
fuente
2
+1 mejor solución IMO ya que incluye verificación nula además de verificación de tipo antes de la conversión
kaskelotti
Recomiendo no usar flotadores o dobles porque son inherentemente inexactos. Como Groovy hace que usar BigDecimals sea tan fácil como cualquier otro número, si necesita más precisión que un número entero, úselo. En segundo lugar, este enfoque parece seguro, pero el resultado puede ser que num == nulo, por lo que debe tener cuidado con eso
Hans Bogaards,
Para el primer código de muestra, supongo que querías escribir en mystring.toInteger()lugar de mystring.toFloat(). Entonces def num = mystring?.isInteger() ? mystring.toInteger() : nullsería correcto.
Sk8erPeter
15

Bueno, Groovy acepta bien la forma Java. Si está preguntando si hay una forma de Groovier , hay una forma de hacerlo Integer.

Ambos se muestran aquí:

String s = "99"
assert 99 == Integer.parseInt(s)
Integer i = s as Integer
assert 99 == i
Michael Easter
fuente
55
Esta respuesta también aparece cuando la cadena no es numérica: ¡cuidado!
Andres Kievsky
6

también puedes hacer importación estática

import static java.lang.Integer.parseInt as asInteger

y después de este uso

String s = "99"
asInteger(s)
Andrey
fuente
Aseado, me olvido mucho de las cosas pequeñas.
Urna mágica de pulpo
3

toInteger() El método está disponible en groovy, puedes usar eso.

Aakarsh Gupta
fuente
2

Varias formas de lograr esto. Los ejemplos son los siguientes

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

Espero que esto ayude

Darth Shekhar
fuente
1
¿Cómo es que esto agrega algo a la pregunta que no está presente en las 8 respuestas existentes?
LukeG
Mi mal, me puse un poco codicioso aquí
Darth Shekhar
1

Conversión de estilo maravilloso:

Integer num = '589' as Integer

Si tiene parámetro de solicitud:

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

int num = str as Integer
ratzip
fuente
0

Aquí está el otro camino. Si no te gustan las excepciones.

def strnumber = "100"
def intValue = strnumber.isInteger() ?  (strnumber as int) : null
Berhanu Tarekegn
fuente
Creo que esta es la misma respuesta que # 16877253 por @Shmaperator
MarkHu
0

La forma de usar aún debe ser toInteger (), porque en realidad no está en desuso.

int value = '99'.toInteger()

La versión de String está en desuso, pero CharSequence es una interfaz que implementa un String. Entonces, usar una cadena está bien, porque su código seguirá funcionando incluso cuando el método solo funcione con CharSequence. Lo mismo ocurre con isInteger ()

Consulte esta pregunta como referencia: ¿Cómo convertir una Cadena a CharSequence?

Comenté, porque la noción de obsoleto en este método me confundió y quiero evitar eso para otras personas.

Math Morn
fuente
-1

La manera más simple de convertir una cadena a entero en Groovy es la siguiente ...

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

Ahora "i" tiene el valor entero.

srinivasan
fuente
44
¿Qué agrega esto a las respuestas existentes? La respuesta aceptada publicada hace 9 años comienza con: "Use el toInteger()método para conversar ...
configuración regional predeterminada