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

Shell et commandes GNU Discussion :

Savoir si un nombre est décimal


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Par défaut Savoir si un nombre est décimal
    Bonjour,

    Je voudrais faire un test pour vérifier que le nombre dans une variable est un nombre décimal.
    J'ai trouvé un test pour savoir si j'ai nombre (décimal ou pas) mais pas juste décimal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if ! [[ "$nombre" =~ ^[0-9]+([.][0-9]+)?$ ]]
    then
    echo "Ceci n'est pas un nombre"
    fi
    Si au passage quelqu'un pouvait m'expliquer comment la commande fonctionne car là où je l'ai trouvé il n'y avait aucune explication (que signifie =~ pourquoi le + à la fin dans la parenthèse, le ? et le dollar).
    Merci

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    Bonjour,

    =~ compare la partie gauche à une regex (à droite).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ decimal='^[0-9]*\.[0-9]?[0-9]*$'
    $ [[ ab.ced =~ $decimal ]] && echo decimal || echo pas decimal
    pas decimal
    $ [[ 10 =~ $decimal ]] && echo decimal || echo pas decimal
    pas decimal
    $ [[ 10.23 =~ $decimal ]] && echo decimal || echo pas decimal
    decimal
    $ [[ .23 =~ $decimal ]] && echo decimal || echo pas decimal
    decimal
    $ [[ 0.23 =~ $decimal ]] && echo decimal || echo pas decimal
    decimal
    $ [[ a.23 =~ $decimal ]] && echo decimal || echo pas decimal
    pas decimal
    cependant, une regex n'est pas indispensable, on peut utiliser correspondance de motif étendue (Pattern Matching, extglob) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ [[ 10.23 == *([0-9]).+([0-9]) ]] && echo decimal || echo pas decimal
    decimal
    $ [[ ab.23 == *([0-9]).+([0-9]) ]] && echo decimal || echo pas decimal
    pas decimal
    $ [[ .23 == *([0-9]).+([0-9]) ]] && echo decimal || echo pas decimal
    decimal
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Variante awk:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ VAR=0.899
    $ echo $VAR | awk '$0-int($0){print "est dédimal"}'
    est dédimal

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Par défaut
    Une chose que je comprends pas c'est: pourquoi n'a t'on pas besoin de bc, puisque par défaut bash ne gère pas les nombres décimaux ?

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    Citation Envoyé par Erlen
    pourquoi n'a t'on pas besoin de bc, puisque par défaut bash ne gère pas les nombres décimaux ?
    parce qu'on peut tester uniquement le format de la chaîne :
    la chaîne se compose de
    aucun, un, ou plusieurs chiffres
    un point
    un, ou plusieurs chiffres.

    on n'effectue aucun calcul.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Par défaut
    Ok je te remercie.

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    cependant, une regex n'est pas indispensable, on peut utiliser correspondance de motif étendue (Pattern Matching, extglob) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ [[ 10.23 == *([0-9]).+([0-9]) ]] && echo decimal || echo pas decimal
    decimal
    $ [[ ab.23 == *([0-9]).+([0-9]) ]] && echo decimal || echo pas decimal
    pas decimal
    $ [[ .23 == *([0-9]).+([0-9]) ]] && echo decimal || echo pas decimal
    decimal
    Du coup, ça marche aussi en ksh ! Merci, N_BaH !

    Je ne suis pas très familier de ces expressions génériques (comme on dit dans mon Korn) où les * + ? @ et ! précèdent les parenthèses!

    Toute petite remarque: le test vérifie si la chaîne est ou non un décimal en notation ango-américaine. Avec un locale français, il faudrait remplacer le point par une virgule ! (j'ai déjà eu un script de ce genre qui a échoué lorsqu'il a été déployé sur une architecture différente de celle de développement)

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Par défaut
    Un dernière question dans la même veine, peut on vérifier si un nombre possède une ou deux decimales

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    ici l'utilisation de regex se jusitifie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    decimal='^[0-9]*\.([0-9]?[0-9]*)$'
    nombre=".23"
    [[ $nombre =~ $decimal ]] && echo "${#BASH_REMATCH[1]} décimale(s) dans $nombre"
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Hello à tous,

    Juste histoire d'apporter mon grain de sel (et de faire le malin ), je signale le cas particulier du nombre entier écrit avec ses zéros non significatifs : « 50.000 ».

    Deux façons de voir les choses : soit on considère que l'expression précise des décimales, fussent-elles nulles, que l'on peut évaluer et, dans ce cas, les expressions ci-dessus conviennent très bien, soit on considère qu'un nombre est décimal si sa partie rationnelle est non-nulle et là, il faut une expression qui recherche un nombre qui contienne au moins un chiffre non nul après la virgule. Par exemple : « [0-9]+\.0*[1-9]+[0-9]* ».

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Par défaut
    Bonjour,

    Je suis surpris du débat que j'ai malgré moi lancé et dont j'avoue je ne suis pas sur de tout comprendre.
    Je reviens sur ma dernière question:

    Citation Envoyé par N_BaH Voir le message
    ici l'utilisation de regex se jusitifie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    decimal='^[0-9]*\.([0-9]?[0-9]*)$'
    nombre=".23"
    [[ $nombre =~ $decimal ]] && echo "${#BASH_REMATCH[1]} décimale(s) dans $nombre"
    Ce n'est pas exactement ce que je cherche, car cette expression me dit si le nombre possède un ou deux décimales et ce que je voulais faire c'était :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if [[ "$nombre" = une décimale ]]
    then
    echo ce nombre a une décimale
    elif [[ "$nombre" = deux décimale ]]
    then
    echo ce nombre a deux décimales
    fi
    Dans mon script il y a deux possibilités soit on fait tout avec une décimale soit tout avec deux et comme les $nombre sont rentrés par l'utilisateur je veux vérifier qu'il ne c'est pas trompé que tous reste cohérents (quand on écrit un script pour soit c'est rapide on s'en fou, on sait comment il marche mais si d'autres doivent s'en servir c'est le bazar, je comprends maintenant quand les gens disent que la gestion des bugs est important, faut tout vérifier)

    La méthode proposer m'oblige à faire un test, sur le résultat ${#BASH_REMATCH[1]} du test précédent

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment savoir si un nombre est décimal ?
    Par Nemesis007 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 10/04/2008, 09h49
  2. Savoir si un nombre est premier
    Par Jihnn dans le forum Vos contributions VB6
    Réponses: 4
    Dernier message: 11/08/2006, 10h14
  3. Comment savoir si un nombre est premier ?
    Par Extra-Nitro dans le forum Général Python
    Réponses: 9
    Dernier message: 03/01/2006, 14h28
  4. savoir si un nombre est pair ou non
    Par shirya dans le forum C++
    Réponses: 25
    Dernier message: 23/11/2005, 17h53
  5. Réponses: 4
    Dernier message: 30/06/2002, 20h23

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