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

Langage Java Discussion :

Savoir si un String peut être parsé en int


Sujet :

Langage Java

  1. #1
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut Savoir si un String peut être parsé en int
    Salut,

    D'habitude, pour convertir un String en int, je fais Integer.parseInt(String), et je catch(NumberFormatException), et s'il y a un problème, c'est que ça n'était pas un entier...

    Mais ça me dérange quand même de faire ça...

    Quand on veut insérer un élément dans un tableau, on fait d'abord un if(index < tab.length) avant d'y mettre l'élément, on ne catch pas l'exception une fois qu'on l'a fait pour savoir si on n'avait pas dépassé le tableau...


    Y'a-t-il une solution plus propre pour faire savoir si un String est un int (à part de regarder caractère par caractère si c compris entre '0' et '9')?

    Je sais pas, une méthode du genre isANumber(String) quelque part???

  2. #2
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Je ne crois pas qu'il y ait une méthode qui fait cela, sinon il n'y aurait pas autant de fois le code que tu as présenté de montré

    Et même si une telle méthode existait, elle serait codé de manière certainement assez ressemblante à la tienne. Donc, tu peut faire une classe MathUtils par exemple avec un méthode static isNumber(String).

  3. #3
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Ca peut se faire avec une expression rationnelle.

  4. #4
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par seriousme
    Ca peut se faire avec une expression rationnelle.
    ouais c vrai...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maString.matches("[0-9]+");
    Mais après pour les Double c un peu plus compliqué...
    Notamment, on peut écrire 15. ou .05 mais pas . tout seul...

  5. #5
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maString.matches("[0-9]+");
    Pas seulement car il ne faut pas dépasser les valeurs autorisées.

  6. #6
    Membre chevronné Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Par défaut
    si j'étais toi, je ferai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class RomNumber{
        public static boolean isANumber(String chaine){
             try{              
                   Integer.parseInt(chaine);
                   return true;
             }catch(NumberFormatException nfe){
                   return false;
             }
        }
    }
    et voilou tu l'as ta méthode

  7. #7
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par NeptuS
    si j'étais toi, je ferai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class RomNumber{
        public static boolean isANumber(String chaine){
             try{              
                   Integer.parseInt(chaine);
                   return true;
             }catch(NumberFormatException nfe){
                   return false;
             }
        }
    }
    et voilou tu l'as ta méthode
    Oui, mais ça, c'est exactement ce que j'ai dit dans ma première phrase :-)

  8. #8
    Membre chevronné
    Inscrit en
    Avril 2004
    Messages
    503
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 503
    Par défaut
    Citation Envoyé par ®om
    Oui, mais ça, c'est exactement ce que j'ai dit dans ma première phrase :-)
    A mes yeux si une methode existe dans l'API standard, c'est pour ne pas réinventer la roue.
    En 1 seul ligne tu peux savoir si ta string est un entier ou remonter l'exception. Si tu veux être plus propre il te reste les expressions régulières. En tout cas tu as, je pense, un bon nombre de solutions déjà implémentée dans l'API standard de Java.

  9. #9
    Membre confirmé Avatar de Emplyst
    Inscrit en
    Mars 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 152
    Par défaut
    Citation Envoyé par ®om
    Salut,

    D'habitude, pour convertir un String en int, je fais Integer.parseInt(String), et je catch(NumberFormatException), et s'il y a un problème, c'est que ça n'était pas un entier...

    Mais ça me dérange quand même de faire ça...

    Quand on veut insérer un élément dans un tableau, on fait d'abord un if(index < tab.length) avant d'y mettre l'élément, on ne catch pas l'exception une fois qu'on l'a fait pour savoir si on n'avait pas dépassé le tableau...


    Y'a-t-il une solution plus propre pour faire savoir si un String est un int (à part de regarder caractère par caractère si c compris entre '0' et '9')?

    Je sais pas, une méthode du genre isANumber(String) quelque part???
    Ben de toute facon la methode is numeric parcourerais toute la chaine pour savoie si c'est un entier. A mon sens la maniere la plus propre (sans les exception)serais une fonction qui ressemblerait a ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
        private static final byte UNICODE_ZERO = 48;
        private static final byte UNICODE_NINE = 57;
     
        public static boolean isNumeric(String string)
        {
            boolean isnumeric = true;
            int codePoint;
     
            for (int i = 0; i < string.length(); i++)
            {
                codePoint = string.codePointAt(i);
                if (codePoint < UNICODE_ZERO || codePoint > UNICODE_NINE)
                {
                    isnumeric = false;
                    break;
                }
            }
     
            return isnumeric;
        }

  10. #10
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Ouais, en fait je voulais savoir s'il y avait une méthode toute faite dans l'API sans utiliser les exceptions... Apparemment, la méthode est non...

    Merci quand même :-)

    @Emplyst: C'est pas très joli un break dans une boucle ^^.

  11. #11
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Avec une expression rationnelle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Pattern p=Pattern.compile("(\\-?(([0-1]*\\d{1,9})|(20\\d{8})|(21[0-3]\\d{7})|(214[0-6]\\d{6})|(2147[0-3]\\d{5})|(21474[0-7]\\d{4})|(214748[0-2]\\d{3})|(2147483[0-5]\\d{2})|(21474836[0-3]\\d)|(214748364[0-7])))|(-2147483648)");
    Matcher m=p.matcher("-2147483648");
    System.out.println(m.matches());
    A vérifier car il y a sûrement des erreurs.

    [EDIT]
    Pas bon car ce pattern matche une chaine vide "".
    Il faut:
    C'est rectifié.
    [/EDIT]

  12. #12
    Membre confirmé Avatar de Emplyst
    Inscrit en
    Mars 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 152
    Par défaut
    Citation Envoyé par ®om
    @Emplyst: C'est pas très joli un break dans une boucle ^^.
    Arf desoler les vieilles habitudes ^^
    voila :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
        private static final byte UNICODE_ZERO = 48;
        private static final byte UNICODE_NINE = 57;
     
        public static boolean isNumeric(String string)
        {
            boolean isnumeric = true;
            int codePoint;
     
            for (int i = 0; i < string.length() && isnumeric; i++)
            {
                codePoint = string.codePointAt(i);
                if (codePoint < UNICODE_ZERO || codePoint > UNICODE_NINE)
                {
                    isnumeric = false;
                }
            }
     
            return isnumeric;
        }
    Quoi que je me demande lequel des deux est plus performant, verifier deux trucs jusqua ce qu'il trouve un element non numeric ou verifier un truc et tout simplement sortir de la boucle au bon moment.

    Je veux dire par la que ce n'etait pas une grosse michante boucle ^^

  13. #13
    Membre confirmé Avatar de Emplyst
    Inscrit en
    Mars 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 152
    Par défaut
    Citation Envoyé par seriousme
    Avec une expression rationnelle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Pattern p=Pattern.compile("(\\-?(([0-1]*\\d{0,9})|(20\\d{8})|(21[0-3]\\d{7})|(214[0-6]\\d{6})|(2147[0-3]\\d{5})|(21474[0-7]\\d{4})|(214748[0-2]\\d{3})|(2147483[0-5]\\d{2})|(21474836[0-3]\\d)|(214748364[0-7])))|(-2147483648)");
    Matcher m=p.matcher("-2147483648");
    System.out.println(m.matches());
    A vérifier car il y a sûrement des erreurs.
    C'est p-e parceque j'utilise windows mais suis-je le seul a ne pas etre fan des regex?

    Au fait, je me suis toujours demander si les regex etaient performantes.

  14. #14
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    La performance des regexp au niveau vitesse d'éxécution dépend de l'interpréteur mais elles sont surtout performantes pour faire du code compact.

  15. #15
    Membre confirmé Avatar de Emplyst
    Inscrit en
    Mars 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 152
    Par défaut
    Citation Envoyé par seriousme
    La performance des regexp au niveau vitesse d'éxécution dépend de l'interpréteur mais elles sont surtout performantes pour faire du code compact.
    Du code compact? Quel est l'interet du code compact si ce n'est de donner un mal de tete?

  16. #16
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Ca permet d'éviter des tests à la chaine et des boucles.

  17. #17
    Membre chevronné Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Par défaut
    ouai, par exemple Emplyst, on remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       if (codePoint < UNICODE_ZERO || codePoint > UNICODE_NINE)
       {
            isnumeric = false;
       }
    dans ton code par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       isnumeric = !(codePoint < UNICODE_ZERO || codePoint > UNICODE_NINE);
    ça c'est un petit exemple de code compact : ça prend quelques microsecondes de moins, 3 lignes de moins, mais surtout .. SURTOUT !!!! ça me permet d'écrire un autre post ..... à part ça, je ne vois pas trop ce que ça apporte . Chacun code comme il l'entend après tout

  18. #18
    Membre confirmé Avatar de Emplyst
    Inscrit en
    Mars 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 152
    Par défaut
    Tu vois on m'a deja dit de laisser ce genre d'operations au compilateur ;p (ref. les bitwise)

    De plus, quand tu ecris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    isnumeric = !(codePoint < UNICODE_ZERO || codePoint > UNICODE_NINE);
    Ca ne reviens pas a assigner constament une valeur a une variable qui n'a pas besoin d'etre changer? (donc si c'est le cas cela viendrait ralentir l'execution)

  19. #19
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Et en quoi le mécanisme d'exception est-il génant ???

    En fait le seul problème c'est que la création d'un exception est assez coûteuse à cause de la génération de son stacktrace (lire : Exception & Performance).

    Donc si tu dois traiter un grand nombre de données incorrectes, il est peut-être préférable de vérifier la chaine avant la conversion pour éviter la génération de ce stacktrace.

    Pour cela tu peux utiliser les Jakarta Commons Lang et la méthode NumberUtils.isNumber()...


    Par contre si les données sont rarement incorrectes, il est préférable d'utiliser un bloc try/catch car cela évite d'analyser deux fois la chaine de caractère...

    a++

  20. #20
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par seriousme
    La performance des regexp au niveau vitesse d'éxécution dépend de l'interpréteur mais elles sont surtout performantes pour faire du code compact.
    Pas seulement...
    C'est beaucoup plus efficace que de faire une simple recherche dans un texte (surtout si l'expression apparaît plusieurs fois, c'est d'ailleurs pour cela que .replace attend un String normal alors que .replaceAll attend une regex), car à partir de l'expression régulière, on crée un automate, et après on fait lire la chaîne de caractère par l'automate, et il suffit de voir l'état final pour voir si la chaîne correspond bien :-)

Discussions similaires

  1. Réponses: 7
    Dernier message: 29/07/2009, 15h40
  2. Virus ? peut être eu par USB ?
    Par rpatruno dans le forum Sécurité
    Réponses: 24
    Dernier message: 14/09/2008, 23h10
  3. Réponses: 2
    Dernier message: 13/02/2007, 18h02
  4. Réponses: 10
    Dernier message: 10/11/2006, 14h36
  5. Réponses: 2
    Dernier message: 10/03/2004, 18h52

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