258 votes

Java String - Voir si une chaîne ne contient que des chiffres et pas de lettres

J'ai une chaîne de caractères que je charge dans toute mon application et qui passe des chiffres aux lettres, etc. J'ai un simple if pour voir si elle contient des lettres ou des chiffres, mais quelque chose ne fonctionne pas correctement. Voici un extrait.

String text = "abc"; 
String number; 

if (text.contains("[a-zA-Z]+") == false && text.length() > 2) {
    number = text; 
}

Bien que le text contient des lettres, la condition est retournée comme true . Le et && devrait être évaluée comme les deux conditions devant être true afin de traiter le number = text;

\==============================

Solution :

J'ai pu résoudre ce problème en utilisant le code suivant fourni par un commentaire sur cette question. Tous les autres messages sont également valables !

Ce que j'ai utilisé et qui a fonctionné vient du premier commentaire. Bien que tous les exemples de codes fournis semblent également valables !

String text = "abc"; 
String number; 

if (Pattern.matches("[a-zA-Z]+", text) == false && text.length() > 2) {
    number = text; 
}

5 votes

Contains ne prend pas une regexp en entrée. Utilisez soit matches("\\d{2,}") ou essayez avec un Pattern y Matcher

0 votes

La chaîne peut-elle avoir une valeur décimale ou seulement des valeurs entières ?

5 votes

Pourquoi vérifiez-vous que text.length() > 2 ? Quelle en est la raison ?

2voto

Voici mon code, j'espère que cela vous aidera !

 public boolean isDigitOnly(String text){

    boolean isDigit = false;

    if (text.matches("[0-9]+") && text.length() > 2) {
        isDigit = true;
    }else {
        isDigit = false;
    }

    return isDigit;
}

2voto

Doug Swain Points 1189

Il existe de nombreuses possibilités d'obtenir des numéros String en Java (et vice versa). Vous pouvez sauter la partie regex pour vous épargner cette complication.

Par exemple, vous pourriez essayer de voir ce que Double.parseDouble(String s) retourne pour vous. Il devrait envoyer un NumberFormatException s'il ne trouve pas de valeur appropriée dans la chaîne. Je suggère cette technique parce que vous pouvez réellement utiliser la valeur représentée par la balise String comme un type numérique.

6 votes

Utiliser une exception pour tester votre entrée peut être une mauvaise idée, les exceptions créent une surcharge importante.

1 votes

@OfirLuzon Je suis d'accord sur le fait que les exceptions ne sont pas un bon moyen de gérer les cas attendus qui vont se présenter. Cependant, je pense qu'il est difficile de dire s'il y aurait un impact sur les performances sans plus de contexte.

2voto

Ryan Stewart Points 46960

Ce code est déjà écrit. Si vous ne vous souciez pas de l'impact (extrêmement) mineur sur les performances - qui n'est probablement pas pire que de faire une correspondance regex - utilisez Integer.parseInt() o Double.parseDouble() . Cela vous dira tout de suite si une chaîne ne contient que des nombres (ou est un numéro, selon le cas). Si vous avez besoin de gérer des chaînes de nombres plus longues, les deux options suivantes sont disponibles BigInteger y BigDecimal les constructeurs sportifs qui acceptent les chaînes de caractères. Chacun d'entre eux lancera un NumberFormatException si vous essayez de lui passer un non-nombre (intégral ou décimal, en fonction de celui que vous choisissez, bien sûr). Alternativement, en fonction de vos besoins, il suffit d'itérer les caractères de la chaîne et de contrôler Caractère.isDigit() et/ou Caractère.isLetter() .

1voto

JamisonMan111 Points 170
Character first_letter_or_number = query.charAt(0);
                //------------------------------------------------------------------------------
                if (Character.isDigit())
                {

                }
                else if (Character.isLetter())
                {

                }

1voto

vaquar khan Points 2622

Exemple de test fonctionnel

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;

public class PaserNo {

    public static void main(String args[]) {

        String text = "gg";

        if (!StringUtils.isBlank(text)) {
            if (stringContainsNumber(text)) {
                int no=Integer.parseInt(text.trim());
                System.out.println("inside"+no);

            } else {
                System.out.println("Outside");
            }
        }
        System.out.println("Done");
    }

    public static boolean stringContainsNumber(String s) {
        Pattern p = Pattern.compile("[0-9]");
        Matcher m = p.matcher(s);
        return m.find();
    }
}

Votre code peut encore être cassé par "1a" etc., vous devez donc vérifier les exceptions.

if (!StringUtils.isBlank(studentNbr)) {
                try{
                    if (isStringContainsNumber(studentNbr)){
                    _account.setStudentNbr(Integer.parseInt(studentNbr.trim()));
                }
                }catch(Exception e){
                    e.printStackTrace();
                    logger.info("Exception during parse studentNbr"+e.getMessage());
                }
            }

Méthode pour vérifier que no est une chaîne ou non

private boolean isStringContainsNumber(String s) {
        Pattern p = Pattern.compile("[0-9]");
        Matcher m = p.matcher(s);
        return m.find();
    }

Prograide.com

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.

Powered by:

X