Conversion d'une chaîne en int dans Groovy

286

J'ai un Stringqui représente une valeur entière et je voudrais le convertir en un int. Existe-t-il un équivalent groovy de Java Integer.parseInt(String)?

Steve Kuo
la source
1
pourquoi ne pas simplement utiliser le mot clé def?
Omniprésent
4
J'ai un paramètre de chaîne qui contient un entier. L'utilisation de def i = string_parameter entraîne une exception de conversion de classe si j'utilise plus tard i en tant qu'int.
Steve Kuo

Réponses:

492

Utilisez la toInteger()méthode pour convertir un Stringen un Integer, par exemple

int value = "99".toInteger()

Une alternative, qui évite d'utiliser une méthode obsolète (voir ci-dessous) est

int value = "66" as Integer

Si vous devez vérifier si le String peut être converti avant d'effectuer la conversion, utilisez

String number = "66"

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

Mise à jour sur la dépréciation

Dans les versions récentes de Groovy, l'une des toInteger()méthodes a été déconseillée. Ce qui suit est extrait 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);
}

Vous pouvez forcer la version non obsolète de la méthode à être appelée en utilisant quelque chose d'horrible comme:

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

Personnellement, je préfère de loin:

int num = 66 as Integer
Dónal
la source
19
Caveat emptor: vous devez d'abord vérifier la valeur isInteger(), car toInteger()lève une exception si la chaîne n'est pas numérique. La même chose s'applique à toFloat()/isFloat()
Andres Kievsky
8
Dans la documentation de l'api 2.1.6 isInteger / toInteger sont dépréciés. Quelle est alors la meilleure façon de procéder?
pakman
1
Utiliser Integer paramValue = params.int ('paramName') n'est cependant pas sûr. S'il n'y a pas de paramètre avec le nom "paramName" dans la carte des paramètres, vous obtenez une exception sur ne peut pas convertir null en int.
Michael
2
je voulais juste ajouter, que depuis Groovy 1.8 intest en effet int. Groovy affichera toujours la classe Integer, à cause de la boxe, mais vous ne pourrez par exemple pas l'attribuer nullà un int, ce qui était possible dans 1.0. Nous avons considéré que la modification n'était pas critique, car vous ne pouviez déjà pas utiliser null comme argument pour un paramètre d'appel de méthode de typeint . Tout cela reste différent de Java, car en Java, vous ne pouvez pas convertir Integer en Long par une simple affectation ou appeler une méthode de prise int avec un Long.
blackdrag
1
@pakman StringGroovyMethods.isInteger(String)et DefaultGroovyMethods.isInteger(CharSequence)sont déconseillés au profit de StringGroovyMethods.isInteger(CharSequence). Il en va de même toInteger().
bmaupin
67

Plusieurs façons de le faire, celle-ci est ma préférée:

def number = '123' as int
Esko
la source
10
Même problème que ci-dessus, cela lèvera une exception si la chaîne n'est pas un nombre. Vérifiez d' isInteger()abord.
Andres Kievsky
12
@ank la question demandée pour un équivalent Integer.parseInt(String)qui lève également une exception si la chaîne n'est pas un nombre, donc étant donné la question, je ne considère pas cela comme un "problème"
Dónal
30

Comme un additif à la réponse de Don , non seulement ajouter groovy une .toInteger()méthode pour Strings, il ajoute également toBigDecimal(), toBigInteger(), toBoolean(), toCharacter(), toDouble(), toFloat(),toList() et toLong().

Dans la même veine, groovy ajoute également des is*équivalents à tous ceux qui reviennent truesi leString question en question peut être analysée dans le format en question.

La page GDK correspondante est ici.

Electrons_Ahoy
la source
8
C'est la bonne réponse - vérifiez d'abord avec isInteger(), puis faites toInteger()... c'est-à-dire, sauf si vous préférez ajouter un try/ catchbloc :) mais utiliser des exceptions pour cela est une mauvaise idée.
Andres Kievsky
2
@anktastic Je dirais que ma réponse est plus correcte car la question demandait "un équivalent groovy de Java Integer.parseInt (String)", c'est-à-dire une conversion non contrôlée
Dónal
25

Je ne sais pas s'il a été introduit dans les versions récentes de groovy (la réponse initiale est assez ancienne), mais maintenant vous pouvez utiliser:

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

ou

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

Je recommande d'utiliser des flottants ou même des doubles au lieu d'entiers dans le cas si la chaîne fournie n'est pas fiable.

Shmaperator
la source
2
+1 meilleure solution IMO car elle inclut la vérification nulle en plus de la vérification de type avant la conversion
kaskelotti
Je déconseille d'utiliser des flotteurs ou des doubles car ils sont intrinsèquement inexacts. Comme Groovy rend l'utilisation de BigDecimals aussi simple que n'importe quel autre numéro, si vous avez besoin de plus de précision qu'un nombre entier, utilisez-le. Deuxièmement, cette approche semble sûre, mais le résultat peut être que num == null, vous devez donc être prudent avec cela
Hans Bogaards
Pour le premier exemple de code, je suppose que vous vouliez écrire à la mystring.toInteger()place de mystring.toFloat(). Ce def num = mystring?.isInteger() ? mystring.toInteger() : nullserait donc correct.
Sk8erPeter
15

Eh bien, Groovy accepte très bien le formulaire Java. Si vous demandez s'il existe une méthode Groovier , il existe une solution Integer.

Les deux sont présentés ici:

String s = "99"
assert 99 == Integer.parseInt(s)
Integer i = s as Integer
assert 99 == i
Michael Easter
la source
5
Cette réponse est également lancée lorsque la chaîne n'est pas numérique - attention!
Andres Kievsky
6

vous pouvez également effectuer une importation statique

import static java.lang.Integer.parseInt as asInteger

et après cette utilisation

String s = "99"
asInteger(s)
Andrey
la source
Neat, j'oublie beaucoup les petites choses.
Urne de poulpe magique
3

toInteger() est disponible en groovy, vous pouvez l'utiliser.

Aakarsh Gupta
la source
2

Plusieurs façons d'y parvenir. Les exemples sont comme ci-dessous

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

J'espère que cela t'aides

Dark Shekhar
la source
1
Comment cela ajoute-t-il quelque chose à la question qui n'est pas déjà présente dans les 8 réponses existantes?
LukeG
Mon mauvais, est devenu un peu gourmand ici
Dark Shekhar
1

Conversion de style groovy:

Integer num = '589' as Integer

Si vous avez un paramètre de demande:

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

int num = str as Integer
ratzip
la source
0

Voici une autre façon. si vous n'aimez pas les exceptions.

def strnumber = "100"
def intValue = strnumber.isInteger() ?  (strnumber as int) : null
Berhanu Tarekegn
la source
Je pense que c'est la même réponse que # 16877253 par @Shmaperator
MarkHu
0

La façon d'utiliser devrait toujours être le toInteger (), car il n'est pas vraiment obsolète.

int value = '99'.toInteger()

La version String est obsolète, mais CharSequence est une interface qu'une chaîne implémente. Ainsi, l'utilisation d'une chaîne est correcte, car votre code fonctionnera toujours même lorsque la méthode ne fonctionnera qu'avec CharSequence. Il en va de même pour isInteger ()

Voir cette question pour référence: Comment convertir une chaîne en CharSequence?

J'ai commenté, car la notion de déprécié sur cette méthode m'a embrouillé et je veux éviter cela pour les autres.

Math Morn
la source
-1

La manière la plus simple de convertir une chaîne en entier dans Groovy est la suivante ...

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

Maintenant, "i" contient la valeur entière.

srinivasan
la source
4
Qu'est-ce que cela ajoute aux réponses existantes? La réponse acceptée publiée il y a 9 ans commence par: "Utilisez la toInteger()méthode pour convertir ...
locale par défaut