IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Java Discussion :

Savoir si un String correspond à un nombre [FAQ]


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 4
    Par défaut Savoir si un String correspond à un nombre
    Comment savoir si une chaine de caractére est un nombre ?
    exemple :
    "1234567890123456789" est un nombre
    mais 123456789f123456789" n'en es pas un !
    merci arnaud.

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Par défaut Re: Savoir si un String correspond à un nombre
    Citation Envoyé par arno00020
    Comment savoir si une chaine de caractére est un nombre ?
    exemple :
    "1234567890123456789" est un nombre
    mais 123456789f123456789" n'en es pas un !
    merci arnaud.
    Je ne sais pas si tu peux vraiment te fier à ça, mais j'ai justement fait une petite méthode cet après-midi pour mes besoins :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        public static boolean isInteger(String input) {
            for (int i = 0; i < input.length(); i++) {
                if (!(input.charAt(i) == '0' || input.charAt(i) == '1' ||
                    input.charAt(i) == '2' || input.charAt(i) == '3' ||
                    input.charAt(i) == '4' || input.charAt(i) == '5' ||
                    input.charAt(i) == '6' || input.charAt(i) == '7' ||
                    input.charAt(i) == '8' || input.charAt(i) == '9')) {
                    return false;
                }
            }
            return true;
    Il y a certainement plus optimisé, tiens-moi au courant d'ailleurs si tu trouves mieux.

  3. #3
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    un peu mieux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    String chaine="1234";
    boolean estUnNombre;
    try {
      Integer.parseInt(chaine);
      estUnNombre=true;
    } catch(NumberFormatException e) {
      estUnNombre=false;
    }

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Par défaut
    Effectivement j'avais pensé au try catch par la suite, mais j'ai eu la flemme de changer ma belle méthode

  5. #5
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Citation Envoyé par MiJack
    mais j'ai eu la flemme de changer ma belle méthode
    hum hum

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Par défaut
    Citation Envoyé par Pill_S
    Citation Envoyé par MiJack
    mais j'ai eu la flemme de changer ma belle méthode
    hum hum
    C'est bon, je viens de la modifier. Plus personne ne verra mon affreuse méthode, lourde au possible

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 4
    Par défaut
    c ce a quoi j'avais pensé au debut mais pour un nombre trop gd ca me péte une exception alors que le format est bon.
    exemple : 11111111111111111111111111111111

  8. #8
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Par défaut
    On dirait que ma méthode est à nouveau d'actualité

  9. #9
    Membre éclairé Avatar de soad
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    520
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 520
    Par défaut
    ou ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	public static boolean isNombre(String input) { 
     
    		for (int i = 0; i < input.length(); i++) {
     
    			char c = input.charAt(i);
    			if(c<'0' || c>'9') return false;
    		}
    		return true;
    	}


  10. #10
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Citation Envoyé par MiJack
    On dirait que ma méthode est à nouveau d'actualité
    nan, je persiste !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    boolean isint;
    try {
      BigInteger bigInt = new BigInteger(machainevachementlongue);
      isint=true;
    } catch(NumberFormatException e){
      isint = false;
    }

  11. #11
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par défaut
    j'aime bien la méthode de Pill_S...

    manière ca depend simplement du type de nombre car on pourrait faire la même chose avec les réels...

  12. #12
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    C'est pourtant simple vous faites tourner des tests sur plusieurs milliers de strings et vous voyez laquelle des 2 est la plus rapide.
    Fut un temps les profs disaient que c'etait couteux de lever des exceptions pour rien et que dans la mesure du possible mieux valait faire sans. Mais bon c'etait les profs... le mieux c'est de tester soi-meme

    Reste que la methode de saod a l'avantage ne ne pas creer d'objet intermedaire mais s'adaptera assez mal a des nombres au format plus complexe (negatif, flottant, nottation scientifique, ...) sans faire des dizaines de cas et de test specifiques.

    Celle(s) de Pill_S fonctionnera partout. C'est dailleurs la premiere qui m'est venue a l'esprit. Mais dans certains usages (temps reel, espace memoire restreint), l'autre est probablement preferable.

    Il devrait aussi etre possible de definir un pattern pour un nombre et d'utiliser les regexp pour voir si la chaine fournie "match" le pattern.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  13. #13
    Membre chevronné
    Inscrit en
    Avril 2004
    Messages
    503
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 503
    Par défaut
    Je crois effectivement que dans le cas présent, le choix le plus robuste serait de passer par les expressions régulières.

  14. #14
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    reste à connaître l'usage...

    si le but n'est que de savoir si une chaîne est nombre, alors les expressions régulières semblent meilleures...

    mais si il faut faire des opération mathématiques avec ce nombre par la suite, alors obligé de passer par BigInteger

  15. #15
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Des trucs dans le genre (note : ca fait quelques temps que je ne fais plus trop de regexp, de pattern matching ou d'analyse lexicale) :

    Short, int, long, float, double + nottation scientifique
    '-'?[0-9]+('.'[0-9]+)?(E'-'?[0-9]+)?

    Hexadecimal
    '-'?[(0[xX])#][0-9A-Fa-f]+

    Octal
    '-'?0[0-7]+

    Si l'on regarde la doc des methodes parseXXX() des differentes classes de nombres on verra qu'en general elles refusent les suffixes/extensions genre l, f ou d qui sont pourtant utilises par le language Java. Donc je ne les ai pas inclus ici.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  16. #16
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    N'oubliez pas Character.isDigit(int) qui a l'avantage de fonctionner avec d'autres langues. Extrait de la doc :

    Some Unicode character ranges that contain digits:

    * '\u0030' through '\u0039', ISO-LATIN-1 digits ('0' through '9')
    * '\u0660' through '\u0669', Arabic-Indic digits
    * '\u06F0' through '\u06F9', Extended Arabic-Indic digits
    * '\u0966' through '\u096F', Devanagari digits
    * '\uFF10' through '\uFF19', Fullwidth digits

    Many other character ranges contain digits as well.
    La classe StreamTokenizer peut aussi faire le boulot.

    P.S : pour la regex, on peut remplacer les [0-9] par \d et les [0-9a-fA-F] par \p{XDigit}.

  17. #17
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Tu as juste un probleme avec la Locale dans ton cas .. ce que la conversion en Big[Integer/Decimal] prend surement en compte.

    Sinon il y a aussi la solution du DecimalFormat.parse qui respecte la locale.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

Discussions similaires

  1. Comment savoir si un String est un Float
    Par ludovic tambour dans le forum Débuter
    Réponses: 8
    Dernier message: 14/12/2005, 13h36
  2. savoir si deux IXMLNode correspondent au même noeud ?
    Par Bruno75 dans le forum Langage
    Réponses: 8
    Dernier message: 26/10/2005, 11h02
  3. Savoir si un string est un numérique
    Par Homer dans le forum Langage
    Réponses: 3
    Dernier message: 05/10/2005, 16h21
  4. Réponses: 4
    Dernier message: 28/02/2005, 18h04
  5. Savoir si une string est un nombre
    Par SteelBox dans le forum SL & STL
    Réponses: 10
    Dernier message: 14/02/2005, 19h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo