Comment convertir un String
à un int
?
"1234" 1234
Comment convertir un String
à un int
?
"1234" 1234
String myString = "1234";
int foo = Integer.parseInt(myString);
Si vous regardez le Documentation Java vous remarquerez que le "catch" est que cette fonction peut lancer un NumberFormatException
, ce que vous pouvez faire :
int foo;
try {
foo = Integer.parseInt(myString);
}
catch (NumberFormatException e) {
foo = 0;
}
(Ce traitement renvoie par défaut un nombre malformé à la valeur 0
mais vous pouvez faire autre chose si vous le souhaitez).
Vous pouvez également utiliser un Ints
de la bibliothèque Guava, qui, en combinaison avec la méthode Optional
est un moyen puissant et concis de convertir une chaîne de caractères en un nombre entier :
import com.google.common.primitives.Ints;
int foo = Optional.ofNullable(myString)
.map(Ints::tryParse)
.orElse(0)
En plus d'attraper une NumberFormatException, l'utilisateur doit également faire attention à la longueur des chaînes qu'il passe ; si elles sont suffisamment longues pour faire déborder un entier, il peut envisager d'utiliser Long::parseLong à la place.
Par exemple, voici deux façons de procéder :
Integer x = Integer.valueOf(str);
// or
int y = Integer.parseInt(str);
Il existe une légère différence entre ces deux méthodes :
valueOf
renvoie une instance nouvelle ou mise en cache de java.lang.Integer
parseInt
renvoie des données primitives int
.Il en va de même pour tous les cas : Short.valueOf
/ parseShort
, Long.valueOf
/ parseLong
, etc.
Un point très important à prendre en compte est que l'analyseur Integer lance NumberFormatException comme indiqué dans Javadoc .
int foo;
String StringThatCouldBeANumberOrNot = "26263Hello"; //will throw exception
String StringThatCouldBeANumberOrNot2 = "26263"; //will not throw exception
try {
foo = Integer.parseInt(StringThatCouldBeANumberOrNot);
} catch (NumberFormatException e) {
//Will Throw exception!
//do something! anything to handle the exception.
}
try {
foo = Integer.parseInt(StringThatCouldBeANumberOrNot2);
} catch (NumberFormatException e) {
//No problem this time, but still it is good practice to care about exceptions.
//Never trust user input :)
//Do something! Anything to handle the exception.
}
Il est important de gérer cette exception lorsque l'on essaie d'obtenir des valeurs entières à partir d'arguments fractionnés ou lorsque l'on analyse dynamiquement quelque chose.
@user463035818 - Voir docs.oracle.com/javase/8/docs/api/java/util/regex/ - un modèle d'expression régulière de "([0-9]+)"
capturera la première séquence d'un ou plusieurs chiffres de un à neuf. Observez la Matcher
de ce paquet.
Faites-le manuellement :
public static int strToInt(String str){
int i = 0;
int num = 0;
boolean isNeg = false;
// Check for negative sign; if it's there, set the isNeg flag
if (str.charAt(0) == '-') {
isNeg = true;
i = 1;
}
// Process each character of the string;
while( i < str.length()) {
num *= 10;
num += str.charAt(i++) - '0'; // Minus the ASCII code of '0' to get the value of the charAt(i++).
}
if (isNeg)
num = -num;
return num;
}
Que se passe-t-il si l'entrée est supérieure à 2^32 ? Que se passe-t-il si l'entrée contient des caractères non numériques ?
L'une des choses qu'un programmeur doit apprendre dès son entrée sur le marché du travail, si ce n'est avant, est de ne jamais réinventer la roue. C'est peut-être un exercice amusant, mais ne vous attendez pas à ce que votre code passe la revue de code si vous faites ce genre de choses dans un cadre commercial.
@yohm il s'agit de cas particuliers ; vous pouvez les traiter avec long et quelques regex ; cependant, d'ici là, vous pouvez utiliser parseInt.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
4 votes
Au passage, sachez que si la chaîne est nulle, l'appel : int i = Integer.parseInt(null) ; provoque une NumberFormatException, et non une NullPointerException.
9 votes
Je suis un peu surpris que cette question soit si bien notée alors qu'une partie importante de la spécification est manquante : que doit-il se passer si la chaîne NE contient PAS que des chiffres ? Par exemple, de nombreuses réponses analyseront volontiers "-1" et renverront -1, mais nous ne savons pas si c'est acceptable.
1 votes
La question doit préciser le radix. Est-ce 10, 16, 8 ? quoi ? Peut-être la base 7