Comment savoir si le premier caractère d'une chaîne est un nombre?

108

En Java, existe-t-il un moyen de savoir si le premier caractère d'une chaîne est un nombre?

Une façon est

string.startsWith("1")

et faites ce qui précède jusqu'à 9 heures, mais cela semble très inefficace.

Omniprésent
la source
10
J'allais mentionner la manière regex, mais j'avais peur que si je le faisais, vous seriez tenté de l'essayer.
Michael Myers

Réponses:

259
Character.isDigit(string.charAt(0))

Notez que cela autorisera n'importe quel chiffre Unicode , pas seulement 0-9. Vous pourriez préférer:

char c = string.charAt(0);
isDigit = (c >= '0' && c <= '9');

Ou les solutions regex plus lentes:

s.substring(0, 1).matches("\\d")
// or the equivalent
s.substring(0, 1).matches("[0-9]")

Cependant, avec l'une de ces méthodes, vous devez d'abord vous assurer que la chaîne n'est pas vide. Si c'est le cas, charAt(0)et substring(0, 1)lancera un fichier StringIndexOutOfBoundsException. startsWithn'a pas ce problème.

Pour rendre la condition entière une ligne et éviter les vérifications de longueur, vous pouvez modifier les expressions régulières comme suit:

s.matches("\\d.*")
// or the equivalent
s.matches("[0-9].*")

Si la condition n'apparaît pas dans une boucle serrée dans votre programme, le petit impact sur les performances lié à l'utilisation d'expressions régulières ne sera probablement pas perceptible.

Michael Myers
la source
Re: "vous devez d'abord vous assurer que la chaîne n'est pas vide" - vrai et plus encore - vous devez également vous assurer que ce n'est pas nul comme si c'était le cas, toutes les méthodes affichées lèveraient des exceptions. Vous pouvez soit vérifier directement (par exemple ((null!=s) && Character.isDigit(s.charAt(0)) )), soit utiliser des astuces commeCharacter.isDigit((s?s:"X").charAt(0))
epeleg
8

Les expressions régulières sont un outil très puissant mais coûteux. Il est valide de les utiliser pour vérifier si le premier caractère est un chiffre mais ce n'est pas si élégant :) Je préfère cette façon:

public boolean isLeadingDigit(final String value){
    final char c = value.charAt(0);
    return (c >= '0' && c <= '9');
}
Kiril Aleksandrov
la source
12
1) functionn'est pas Java. 2) Cela n'autorise que les chiffres arabes, pas le chinois, l'indien, etc. C'est peut-être ce que vous préférez, mais ce n'est pas spécifié dans la question. 3) J'ai déjà couvert cette solution exacte dans ma réponse il y a quatre ans.
Michael Myers
0
regular expression starts with number->'^[0-9]' 
Pattern pattern = Pattern.compile('^[0-9]');
 Matcher matcher = pattern.matcher(String);

if(matcher.find()){

System.out.println("true");
}
Narayan Yerrabachu
la source
2
Vous n'avez pas besoin du {1,1}suffixe, ce qui signifie que "le motif précédent doit apparaître entre 1 et 1 fois". Cela signifie exactement la même chose que le modèle seul.
Andrzej Doyle
Cette solution ne fonctionne pas car String.matches et l'API Pattern essaient de faire correspondre la chaîne complète et pas seulement le premier caractère
Amrish Pandey
0

Je viens de tomber sur cette question et j'ai pensé à contribuer avec une solution qui n'utilise pas de regex.

Dans mon cas, j'utilise une méthode d'aide:

public boolean notNumber(String input){
    boolean notNumber = false;
    try {
        // must not start with a number
        @SuppressWarnings("unused")
        double checker = Double.valueOf(input.substring(0,1));
    }
    catch (Exception e) {
        notNumber = true;           
    }
    return notNumber;
}

Probablement une exagération, mais j'essaie d'éviter les regex chaque fois que je le peux.

Pedro HN Vieira
la source