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
intvalue="99".toInteger()
Una alternativa, que evita el uso de un método obsoleto (ver más abajo) es
intvalue="66"asInteger
Si necesita verificar si Stringse puede convertir antes de realizar la conversión, use
String number ="66"if(number.isInteger()){intvalue= number asInteger}
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
*/publicstaticInteger toInteger(CharSequenceself){returnInteger.valueOf(self.toString().trim());}/**
* @deprecated Use the CharSequence version
* @see #toInteger(CharSequence)
*/@DeprecatedpublicstaticInteger toInteger(Stringself){return toInteger((CharSequence)self);}
Puede forzar la invocación de la versión no obsoleta del método usando algo horrible como:
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().
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.
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.
+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"assert99==Integer.parseInt(s)Integer i = s asIntegerassert99== i
La forma de usar aún debe ser toInteger (), porque en realidad no está en desuso.
intvalue='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 ()
Respuestas:
Use el
toInteger()
método para convertir unString
a unInteger
, por ejemploUna alternativa, que evita el uso de un método obsoleto (ver más abajo) es
Si necesita verificar si
String
se puede convertir antes de realizar la conversión, useActualización de obsolescencia
En versiones recientes de Groovy, uno de los
toInteger()
métodos ha quedado en desuso. Lo siguiente está tomado deorg.codehaus.groovy.runtime.StringGroovyMethods
Groovy 2.4.4Puede forzar la invocación de la versión no obsoleta del método usando algo horrible como:
Personalmente, prefiero mucho:
fuente
isInteger()
primero debe verificar el valor , yatoInteger()
que arrojará una excepción si la cadena no es numérica. Lo mismo se aplica atoFloat()
/isFloat()
int
es de hechoint
. Groovy seguirá mostrando la clase Integer, debido al boxeo, pero, por ejemplo, no podrá asignarnull
a unint
, 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étodoint
. 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.StringGroovyMethods.isInteger(String)
yDefaultGroovyMethods.isInteger(CharSequence)
están en desuso a favor deStringGroovyMethods.isInteger(CharSequence)
. Lo mismo vale paratoInteger()
.Varias formas de hacerlo, este es mi favorito:
fuente
isInteger()
primero.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"Como una adición a la respuesta de Don , no sólo añadir maravilloso un
.toInteger()
método paraString
s, sino que también añadetoBigDecimal()
,toBigInteger()
,toBoolean()
,toCharacter()
,toDouble()
,toFloat()
,toList()
, ytoLong()
.En la misma línea, groovy también agrega
is*
equivalentes a todos aquellos que regresantrue
si elString
en cuestión se puede analizar en el formato en cuestión.La página relevante de GDK está aquí.
fuente
isInteger()
, luego hagatoInteger()
... eso es, a menos que prefiera agregar untry
/catch
bloque :) pero usar excepciones para esto es una mala idea.No estoy seguro de si se introdujo en versiones recientes de groovy (la respuesta inicial es bastante antigua), pero ahora puede usar:
o
Recomiendo usar flotantes o incluso dobles en lugar de enteros en el caso si la cadena proporcionada no es confiable.
fuente
mystring.toInteger()
lugar demystring.toFloat()
. Entoncesdef num = mystring?.isInteger() ? mystring.toInteger() : null
sería correcto.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í:
fuente
también puedes hacer importación estática
y después de este uso
fuente
toInteger()
El método está disponible en groovy, puedes usar eso.fuente
Varias formas de lograr esto. Los ejemplos son los siguientes
Espero que esto ayude
fuente
Conversión de estilo maravilloso:
Si tiene parámetro de solicitud:
fuente
fuente
Aquí está el otro camino. Si no te gustan las excepciones.
fuente
La forma de usar aún debe ser toInteger (), porque en realidad no está en desuso.
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.
fuente
La manera más simple de convertir una cadena a entero en Groovy es la siguiente ...
Ahora "i" tiene el valor entero.
fuente
toInteger()
método para conversar ...