Convertir une chaîne en entier ou en entier en Java

1. Introduction

La conversion d' une chaîne à un int ou entier est une opération très courante en Java. Dans cet article, nous montrerons plusieurs façons de résoudre ce problème.

Il existe quelques moyens simples de gérer cette conversion de base.

2. Integer.parseInt ()

L'une des principales solutions consiste à utiliser la méthode statique dédiée d' Integer : parseInt () , qui renvoie une valeur int primitive :

@Test public void givenString_whenParsingInt_shouldConvertToInt() { String givenString = "42"; int result = Integer.parseInt(givenString); assertThat(result).isEqualTo(42); }

Par défaut, la méthode parseInt () suppose que la chaîne donnée est un entier en base 10. En outre, cette méthode accepte un autre argument pour modifier cette base par défaut . Par exemple, nous pouvons analyser les chaînes binaires comme suit:

@Test public void givenBinaryString_whenParsingInt_shouldConvertToInt() { String givenString = "101010"; int result = Integer.parseInt(givenString, 2); assertThat(result).isEqualTo(42); }

Naturellement, il est également possible d'utiliser cette méthode avec n'importe quelle autre base telle que 16 (hexadécimal) ou 8 (octal).

3. Integer.valueOf ()

Une autre option serait d' utiliser la méthode statique Integer.valueOf () , qui renvoie une instance Integer :

@Test public void givenString_whenCallingIntegerValueOf_shouldConvertToInt() { String givenString = "42"; Integer result = Integer.valueOf(givenString); assertThat(result).isEqualTo(new Integer(42)); }

De même, la méthode valueOf () accepte également une base personnalisée comme deuxième argument:

@Test public void givenBinaryString_whenCallingIntegerValueOf_shouldConvertToInt() { String givenString = "101010"; Integer result = Integer.valueOf(givenString, 2); assertThat(result).isEqualTo(new Integer(42)); }

3.1. Cache d'entiers

À première vue, il peut sembler que les méthodes valueOf () et parseInt () sont exactement les mêmes. Pour la plupart, cela est vrai - même la méthode valueOf () délègue à la méthode parseInt en interne.

Cependant, il existe une différence subtile entre ces deux méthodes: la méthode valueOf () utilise un cache d'entiers en interne . Ce cache renverrait la même instance Integer pour les nombres entre -128 et 127 :

@Test public void givenString_whenCallingValueOf_shouldCacheSomeValues() { for (int i = -128; i <= 127; i++) { String value = i + ""; Integer first = Integer.valueOf(value); Integer second = Integer.valueOf(value); assertThat(first).isSameAs(second); } }

Par conséquent, il est fortement recommandé d'utiliser valueOf () au lieu de parseInt () pour extraire les entiers encadrés car cela peut conduire à une meilleure empreinte globale pour notre application.

4. Constructeur de nombres entiers

Vous pouvez également utiliser le constructeur d' Integer :

@Test public void givenString_whenCallingIntegerConstructor_shouldConvertToInt() { String givenString = "42"; Integer result = new Integer(givenString); assertThat(result).isEqualTo(new Integer(42)); }

Depuis Java 9, ce constructeur est devenu obsolète au profit d'autres méthodes de fabrique statiques telles que valueOf () ou parseInt () . Même avant cette dépréciation, il était rarement approprié d'utiliser ce constructeur. Nous devrions utiliser parseInt () pour convertir une chaîne en une primitive int ou utiliser valueOf () pour la convertir en objet Integer .

5. Integer.decode ()

En outre, Integer.decode () fonctionne de manière similaire à Integer.valueOf (), mais peut également accepter différentes représentations de nombres:

@Test public void givenString_whenCallingIntegerDecode_shouldConvertToInt() { String givenString = "42"; int result = Integer.decode(givenString); assertThat(result).isEqualTo(42); }

6. NumberFormatException

Toutes les méthodes mentionnées ci-dessus lèvent une NumberFormatException, lorsqu'elles rencontrent des valeurs String inattendues . Ici vous pouvez voir un exemple d'une telle situation:

@Test(expected = NumberFormatException.class) public void givenInvalidInput_whenParsingInt_shouldThrow() { String givenString = "nan"; Integer.parseInt(givenString); }

7. Avec goyave

Bien sûr, nous n'avons pas besoin de nous en tenir au noyau Java lui-même. Voici comment la même chose peut être obtenue en utilisant Ints.tryParse () de Guava , qui renvoie une valeur nulle s'il ne peut pas analyser l'entrée:

@Test public void givenString_whenTryParse_shouldConvertToInt() { String givenString = "42"; Integer result = Ints.tryParse(givenString); assertThat(result).isEqualTo(42); }

De plus, la méthode tryParse () accepte également un deuxième argument de base similaire à parseInt () et valueOf ().

8. Conclusion

Dans cet article, nous avons exploré plusieurs façons de convertir des instances String en instances int ou Integer .

Tous les exemples de code peuvent, bien sûr, être trouvés sur GitHub.