web-dev-qa-db-fra.com

Déterminer si une chaîne est un entier dans Java

J'essaie de déterminer si un élément particulier dans un tableau de chaînes est un entier ou non.

Je suis .split(" ")'ing une expression infixe sous la forme String, puis j'essaie de scinder le tableau résultant en deux tableaux. un pour les entiers, un pour les opérateurs, en supprimant les parenthèses et autres éléments divers. Quel serait le meilleur moyen d'y parvenir?

J'ai pensé que je pourrais peut-être trouver une méthode Integer.isInteger(String arg) ou quelque chose, mais pas de chance.

280
Nick Coelius

Le moyen le plus naïf serait de parcourir la chaîne et de s’assurer que tous les éléments sont des chiffres valides pour la base donnée. C’est à peu près aussi efficace que possible, car vous devez examiner chaque élément au moins une fois. Je suppose que nous pourrions micro-optimiser en fonction de la base, mais à toutes fins pratiques, c'est aussi bon que vous pouvez vous attendre.

public static boolean isInteger(String s) {
    return isInteger(s,10);
}

public static boolean isInteger(String s, int radix) {
    if(s.isEmpty()) return false;
    for(int i = 0; i < s.length(); i++) {
        if(i == 0 && s.charAt(i) == '-') {
            if(s.length() == 1) return false;
            else continue;
        }
        if(Character.digit(s.charAt(i),radix) < 0) return false;
    }
    return true;
}

Vous pouvez également vous fier à la bibliothèque Java. Elle ne repose pas sur des exceptions et intercepte pratiquement toutes les conditions d'erreur possibles. Ce sera un peu plus cher (vous devez créer un objet Scanner, ce que vous ne voulez pas faire dans une boucle extrêmement serrée. Mais en règle générale, il ne devrait pas être beaucoup plus cher. opérations, il devrait être assez fiable.

public static boolean isInteger(String s, int radix) {
    Scanner sc = new Scanner(s.trim());
    if(!sc.hasNextInt(radix)) return false;
    // we know it starts with a valid int, now make sure
    // there's nothing left!
    sc.nextInt(radix);
    return !sc.hasNext();
}

Si les meilleures pratiques ne vous intéressent pas ou si vous souhaitez surveiller le responsable de la révision de votre code, essayez ceci pour la taille:

public static boolean isInteger(String s) {
    try { 
        Integer.parseInt(s); 
    } catch(NumberFormatException e) { 
        return false; 
    } catch(NullPointerException e) {
        return false;
    }
    // only got here if we didn't return false
    return true;
}
324
corsiKa

Utiliser une expression régulière est préférable.

str.matches("-?\\d+");


-?     --> negative sign, could have none or one
\\d+   --> one or more digits

Il n'est pas bon d'utiliser NumberFormatException ici si vous pouvez utiliser if-statement à la place.


Si vous ne voulez pas que les zéros soient en tête, vous pouvez simplement utiliser l'expression régulière comme suit:

str.matches("-?(0|[1-9]\\d*)");
230
shuangwhywhy

Ou vous pouvez demander l'aide de nos bons amis chez Apache Commons: StringUtils.isNumeric (String str)

133
Will Madison

Ou simplement

mystring.matches("\\d+")

bien que cela revienne vrai pour des nombres plus grands qu'un int

69
claus437

Vous souhaitez utiliser la méthode Integer.parseInt (String) .

try{
  int num = Integer.parseInt(str);
  // is an integer!
} catch (NumberFormatException e) {
  // not an integer!
}
51
Mike Lewis

Au lieu d’essayer d’analyser la chaîne et d’attraper NumberFormatException, vous pouvez utiliser une regex; par exemple.

if (Pattern.compile("-?[0-9]+").matches(str)) {
    // its an integer
}

Cela sera probablement plus rapide, surtout si vous précompilez et réutilisez l'expression régulière. Cependant, le problème est que Integer.parseInt(str) échouera quand même si str représente un nombre situé en dehors de la plage des valeurs légales int.

13
Stephen C

Vous pouvez utiliser Integer.parseInt(str) et capturer le NumberFormatException si la chaîne n'est pas un entier valide, de la manière suivante (comme indiqué par toutes les réponses):

static boolean isInt(String s)
{
 try
  { int i = Integer.parseInt(s); return true; }

 catch(NumberFormatException er)
  { return false; }
}

Cependant, notez ici que si l'entier évalué déborde, la même exception sera levée. Votre but était de savoir si oui ou non, c'était un entier valide. Il est donc plus sûr de créer votre propre méthode pour vérifier la validité:

static boolean isInt(String s)  // assuming integer is in decimal number system
{
 for(int a=0;a<s.length();a++)
 {
    if(a==0 && s.charAt(a) == '-') continue;
    if( !Character.isDigit(s.charAt(a)) ) return false;
 }
 return true;
}
8
Rushil Paul

Vous pouvez utiliser Integer.parseInt() ou Integer.valueOf() pour obtenir l'entier de la chaîne et intercepter l'exception s'il ne s'agit pas d'un entier analysable. Vous voulez être sûr d’attraper la NumberFormatException qu’elle peut lancer.

Il peut être utile de noter que valueOf () retournera un objet Integer, pas la primitive int.

1
Chad La Guardia