Comment puis-je convertir un String
en un int
en Java?
Ma chaîne ne contient que des nombres et je veux retourner le nombre qu'elle représente.
Par exemple, étant donné la chaîne, "1234"
le résultat devrait être le nombre 1234
.
java
string
int
type-conversion
Utilisateur inconnu
la source
la source
Réponses:
Si vous regardez la documentation Java, vous remarquerez que le "catch" est que cette fonction peut lancer un
NumberFormatException
, que vous devez bien sûr gérer:(Ce traitement utilise par défaut un numéro mal formé
0
, mais vous pouvez faire autre chose si vous le souhaitez.)Alternativement, vous pouvez utiliser une
Ints
méthode de la bibliothèque Guava, qui en combinaison avec Java 8Optional
, permet une conversion puissante et concise d'une chaîne en un entier:la source
int foo = NumberUtils.toInt(myString, 0);
Par exemple, voici deux façons:
Il existe une légère différence entre ces méthodes:
valueOf
renvoie une instance nouvelle ou mise en cache dejava.lang.Integer
parseInt
renvoie primitifint
.Il en va de même pour tous les cas:
Short.valueOf
/parseShort
,Long.valueOf
/parseLong
, etc.la source
valueOf
méthode est justereturn valueOf(parseInt(string));
valueOf
s'appelle récursivement?valueOf(String)
est implémenté en analysant d'abord la chaîneparseInt(String)
dans un entier à l' aide , puis en encapsulant cet entier dans un entier à l'aide devalueOf(int)
. Pas de récursion ici carvalueOf(String)
et cevalueOf(int)
sont deux fonctions complètement différentes, même si elles ont le même nom.Eh bien, un point très important à considérer est que l'analyseur Integer lève NumberFormatException comme indiqué dans Javadoc .
Il est important de gérer cette exception lorsque vous essayez d'obtenir des valeurs entières à partir d'arguments fractionnés ou d'analyser dynamiquement quelque chose.
la source
"([0-9]+)"
"capturera" la première séquence d'un ou plusieurs chiffres de un à neuf. Regardez laMatcher
classe dans ce package.Faites-le manuellement:
la source
Integer.parseInt(s)
? - Je vois l'intérêt que ce soit une question d'entrevue, mais a) cela ne signifie pas que vous le feriez de cette façon (c'est ce que l'interrogateur a demandé), et b) cette réponse est de toute façon un très mauvais exemple.Integer.parseInt
parce qu'il ne fait aucune validation.Une autre solution consiste à utiliser NumberUtils d' Apache Commons :
L'utilitaire Apache est agréable car si la chaîne est un format numérique non valide, 0 est toujours renvoyé. Vous économisez donc le bloc try catch.
API Apache NumberUtils version 3.4
la source
Actuellement, je fais un devoir pour l'université, où je ne peux pas utiliser certaines expressions, telles que celles ci-dessus, et en regardant la table ASCII, j'ai réussi à le faire. C'est un code beaucoup plus complexe, mais il pourrait en aider d'autres qui sont restreints comme moi.
La première chose à faire est de recevoir en entrée, dans ce cas, une chaîne de chiffres; Je vais l'appeler
String number
, et dans ce cas, je vais l'illustrer en utilisant le numéro 12, doncString number = "12";
Une autre limitation était le fait que je ne pouvais pas utiliser de cycles répétitifs, par conséquent, un
for
cycle (qui aurait été parfait) ne peut pas être utilisé non plus. Cela nous limite un peu, mais là encore, c'est le but. Comme je n'avais besoin que de deux chiffres (en prenant les deux derniers chiffres), un simplecharAt
problème l'a résolu:Ayant les codes, il suffit de regarder le tableau et de faire les ajustements nécessaires:
Maintenant, pourquoi doubler? Eh bien, à cause d'une étape vraiment "bizarre". Actuellement, nous avons deux doubles, 1 et 2, mais nous devons le transformer en 12, il n'y a aucune opération mathématique que nous pouvons faire.
Nous divisons ce dernier (dernier chiffre) par 10 à la mode
2/10 = 0.2
(d'où le double) comme ceci:Cela ne fait que jouer avec les chiffres. Nous transformions le dernier chiffre en décimal. Mais maintenant, regardez ce qui se passe:
Sans trop entrer dans les mathématiques, nous isolons simplement les unités des chiffres d'un nombre. Vous voyez, puisque nous ne considérons que 0-9, diviser par un multiple de 10, c'est comme créer une "boîte" où vous le stockez (pensez à quand votre professeur de première année vous a expliqué ce qu'était une unité et une centaine). Donc:
Et voilà. Vous avez transformé une chaîne de chiffres (dans ce cas, deux chiffres) en un entier composé de ces deux chiffres, compte tenu des limitations suivantes:
la source
'0'
pour le caractère au lieu de48
et ne jamais avoir à dérange avec sa valeur numérique réelle. Troisièmement, tout le détour avec desdouble
valeurs n'a aucun sens car vous divisez par dix, juste pour multiplier par dix par la suite. Le résultat est tout simplementsemilastdigit * 10 + lastdigit
celui appris à l'école primaire, lorsque le système décimal a été introduit…semilastdigit
etlastdigit
. Comment coderiez-vous votre solution pour éviter les «cycles répétitifs» si je vous fournissais une chaîne numérique valide de longueur arbitraire (c.-à-d. N'importe quelle valeur entre «-2147483648» et «2147483647»?)Integer.decode
Vous pouvez également utiliser
public static Integer decode(String nm) throws NumberFormatException
.Il fonctionne également pour les bases 8 et 16:
Si vous voulez obtenir
int
au lieu deInteger
vous pouvez utiliser:Déballage:
intValue()
:la source
Chaque fois qu'il existe la moindre possibilité que la chaîne donnée ne contienne pas un entier, vous devez gérer ce cas spécial. Malheureusement, les méthodes Java standard
Integer::parseInt
etInteger::valueOf
jeter unNumberFormatException
pour signaler ce cas particulier. Ainsi, vous devez utiliser des exceptions pour le contrôle de flux, qui est généralement considéré comme un mauvais style de codage.À mon avis, ce cas spécial devrait être traité en renvoyant un vide
Optional<Integer>
. Étant donné que Java n'offre pas une telle méthode, j'utilise l'encapsuleur suivant:Exemple d'utilisation:
Bien que cela utilise toujours des exceptions pour le contrôle de flux en interne, le code d'utilisation devient très propre. En outre, vous pouvez clairement distinguer le cas où
-1
est analysé en tant que valeur valide et le cas où une chaîne non valide n'a pas pu être analysée.la source
La conversion d'une chaîne en entier est plus compliquée que la simple conversion d'un nombre. Vous avez réfléchi aux problèmes suivants:
la source
Méthodes pour y parvenir:
Integer.valueOf produit un objet Integer, toutes les autres méthodes - primitive int.
2 dernières méthodes de commons-lang3 et grand article sur la conversion ici .
la source
Nous pouvons utiliser la
parseInt(String str)
méthode de laInteger
classe wrapper pour convertir une valeur String en une valeur entière.Par exemple:
La
Integer
classe fournit également lavalueOf(String str)
méthode:Nous pouvons également utiliser
toInt(String strValue)
des NumberUtils classe utilitaire pour la conversion:la source
Utilisez
Integer.parseInt(yourString)
.N'oubliez pas les choses suivantes:
Integer.parseInt("1");
// D'accordInteger.parseInt("-1");
// D'accordInteger.parseInt("+1");
// D'accordInteger.parseInt(" 1");
// Exception (espace vide)Integer.parseInt("2147483648");
// Exception (l'entier est limité à une valeur maximale de 2 147 483 647)Integer.parseInt("1.1");
// Exception ( . Ou , ou tout ce qui n'est pas autorisé)Integer.parseInt("");
// Exception (pas 0 ou quelque chose)Il n'y a qu'un seul type d'exception:
NumberFormatException
la source
J'ai une solution, mais je ne sais pas à quel point elle est efficace. Mais cela fonctionne bien et je pense que vous pourriez l'améliorer. D'un autre côté, j'ai fait quelques tests avec JUnit qui fonctionnent correctement. J'ai attaché la fonction et les tests:
Test avec JUnit:
la source
(int) Double.parseDouble(input.replaceAll("[^0-9\\.\\-]", ""));
Google Guava a tryParse (String) , qui retourne
null
si la chaîne n'a pas pu être analysée, par exemple:la source
Vous pouvez également commencer par supprimer tous les caractères non numériques, puis analyser l’entier:
Mais sachez que cela ne fonctionne que pour les nombres non négatifs.
la source
-42
d'être analysé comme42
."4+2"
, j'obtiendrai42
sans aucun indice que ce que j'ai essayé de faire était erroné. L'utilisateur aura l'impression que la saisie d'expressions de base comme4+2
était une entrée valide, mais l'application continue avec une valeur incorrecte. A part ça, le type estString
, passtring
…Outre les réponses précédentes, je voudrais ajouter plusieurs fonctions. Voici les résultats pendant que vous les utilisez:
La mise en oeuvre:
la source
Comme mentionné, Apache Commons
NumberUtils
peut le faire. Il retourne0
s'il ne peut pas convertir une chaîne en entier.Vous pouvez également définir votre propre valeur par défaut:
Exemple:
la source
Vous pouvez également utiliser ce code, avec quelques précautions.
Option n ° 1: gérez l'exception de manière explicite, par exemple, en affichant une boîte de dialogue de message, puis arrêtez l'exécution du flux de travail en cours. Par exemple:
Option # 2: Réinitialisez la variable affectée si le flux d'exécution peut continuer en cas d'exception. Par exemple, avec quelques modifications dans le bloc catch
L'utilisation d'une constante de chaîne pour la comparaison ou tout autre type de calcul est toujours une bonne idée, car une constante ne renvoie jamais une valeur nulle.
la source
JOptionPane.showMessageDialog()
la réponse à la question Java vanille n'a aucun sens.Integer.valueOf(String);
ne renvoie pas de typeint
.Vous pouvez utiliser
new Scanner("1244").nextInt()
. Ou demandez si même un int existe:new Scanner("1244").hasNextInt()
la source
Dans les compétitions de programmation, où vous êtes assuré que le nombre sera toujours un entier valide, vous pouvez écrire votre propre méthode pour analyser les entrées. Cela sautera tout le code lié à la validation (puisque vous n'en avez pas besoin) et sera un peu plus efficace.
Pour un entier positif valide:
Pour les nombres entiers positifs et négatifs:
Si vous attendez un espace avant ou après ces chiffres, assurez-vous de faire un
str = str.trim()
avant de poursuivre le traitement.la source
Vous pouvez simplement essayer ceci:
Integer.parseInt(your_string);
pour convertir unString
àint
Double.parseDouble(your_string);
pour convertir unString
àdouble
Exemple
la source
Pour une chaîne normale, vous pouvez utiliser:
Pour un générateur de chaînes et un tampon de chaînes, vous pouvez utiliser:
la source
Assurez-vous qu'il n'y a pas de données non numériques dans la chaîne.
la source
Je suis un peu surpris que personne n'ait mentionné le constructeur Integer qui prend String comme paramètre.
Voici donc:
Java 8 - Entier (chaîne) .
Bien sûr, le constructeur renverra le type
Integer
et une opération de décompression convertit la valeur enint
.Il est important de mentionner : ce constructeur appelle la
parseInt
méthode.la source
Utilisez Integer.parseInt () et placez-le dans un
try...catch
bloc pour gérer les erreurs au cas où un caractère non numérique serait entré, par exemple,la source
Et c'est parti
la source
Cela peut se faire de sept manières:
1) en utilisant
Ints.tryParse
:2) Utilisation
NumberUtils.createInteger
:3) Utilisation
NumberUtils.toInt
:4) Utilisation
Integer.valueOf
:5) Utilisation
Integer.parseInt
:6) en utilisant
Integer.decode
:7) Utilisation
Integer.parseUnsignedInt
:la source
Une méthode est parseInt (String). Il renvoie un primitif int:
La deuxième méthode est valueOf (String) et renvoie un nouvel objet Integer ():
la source
Vous pouvez utiliser l'un des éléments suivants:
Integer.parseInt(s)
Integer.parseInt(s, radix)
Integer.parseInt(s, beginIndex, endIndex, radix)
Integer.parseUnsignedInt(s)
Integer.parseUnsignedInt(s, radix)
Integer.parseUnsignedInt(s, beginIndex, endIndex, radix)
Integer.valueOf(s)
Integer.valueOf(s, radix)
Integer.decode(s)
NumberUtils.toInt(s)
NumberUtils.toInt(s, defaultValue)
la source
Ceci est un programme complet avec toutes les conditions positives et négatives sans utiliser de bibliothèque
la source
Integer.parseInt
.