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

  1. #21
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Citation Envoyé par Erlen Voir le message
    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)
    Ce que je t'invite également à comprendre, c'est l'importance des spécifications!!!
    Lorsque tu t'adresses à un forum, il est important d'avoir les idées claires et de préciser clairement ce que tu veux!
    ça permet aux contributeurs de gagner du temps et d'orienter la solution vers quelque chose qui te conviendra vraiment!

    (NB: c'est pas tout jeune comme idée:
    Avant donc que d'écrire, apprenez à penser (Chant I)

    Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément. (Chant I)
    )

    Donc, si j'ai bien compris, pour chaque nombre saisi par un utilisateur, il doit:
    - être un nombre décimal sans signe
    - être un nombre décimal sans signe avec 1 décimale (dans certains cas)
    - être un nombre décimal sans signe avec 2 décimales (dans certains cas)
    car j'imagine que, si l'utilisateur saisit quelque chose qui n'est pas un nombre, il faut le détecter et le prévenir (plutôt que de continuer les calculs comme si de rien n'était!).

    Moi, je verrais bien un truc du genre:
    if [[ "${nombre}" = [0-9]*\.[0-9] ]] ; then # BUG
    # Nombre à 1 chiffre
    elif [[ "${nombre}" = [0-9]*\.[0-9][0-9] ]] ; then # BUG
    # Nombre à 2 chiffres
    else
    # Mauvais nombre
    fi
    Après, on peut affiner le "mauvais nombre" pour expliquer pourquoi on le rejette.

    EDIT: Attention! C'est tout faux! Et, pour la clarté et la pérennité, je préfère rectifier (ce sont des expressions génériques et non des expressions régulières):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if [[ "${nombre}" = *([0-9]).[0-9] ]] ; then
        # Nombre à 1 chiffre
    elif [[ "${nombre}" = *([0-9]).[0-9][0-9] ]] ; then
        # Nombre à 2 chiffres
    else
        # Mauvais nombre
    fi

  2. #22
    Invité
    Invité(e)
    Par défaut
    Bonjour jack-ft,

    il faut préciser que l'expression de droite est une regex, et donc ajouter un tilde au signe égal (=~).

  3. #23
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour jack-ft,

    il faut préciser que l'expression de droite est une regex, et donc ajouter un tilde au signe égal (=~).
    Oops! Exact!
    Pour le ksh, ce n'est pas nécessaire, mais pour un autre shell, effectivement!

  4. #24
    Invité
    Invité(e)
    Par défaut
    Pour le ksh, ce n'est pas nécessaire[...]
    lequel ? mksh,et ksh98 (sur debian) disent le contraire
    pdksh ne connait pas =~

  5. #25
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    lequel ? mksh,et ksh98 (sur debian) disent le contraire
    Lorsque j'ai lu ça, j'ai été surpris et inquiet car mksh fait partie de nos cibles!

    Heureusement, je constate que ça marche ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ [[ "AB" = A* ]] ; print $?
    0
     
    $ echo $KSH_VERSION
    @(#)MIRBSD KSH R39 2009/08/01
     
    $ cat /etc/redhat-release  /etc/system-release
    Red Hat Enterprise Linux Server release 6.2 (Santiago)
    Red Hat Enterprise Linux Server release 6.2 (Santiago)
    Sous quelle version de mksh as-tu constaté que ça ne fonctionnait pas?

    pdksh ne connait pas =~
    Je confirme!
    Mais [[ "AB" = A* ]] fonctionne également.

  6. #26
    Invité
    Invité(e)
    Par défaut
    ah, mais ça, c'est pas de la regex !

    ça fonctionne aussi en bash :
    Code bash4.2.37 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [[ ab = a* ]]; echo $?
    0
    tu pourrais avoir un fichier ab, écrire echo a*, ça afficherait ab; c'est de la correspondance de motif, que permettent les [[.

    edit: reste que [[ .23 = [0-9]*.[0-9][0-9] ]], ça matche pas
    mais 0.23, ça matche
    ?

    edit 2: bash, entre [[, active les correspondances étendues (extglob), ce qui permet ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[ .23 = *([0-9]).+([0-9]) ]]
    soit :
    *(motif) 0 ou 1 motif
    +(motif) 1 ou plusieurs motifs.
    Dernière modification par Invité ; 09/10/2012 à 10h57.

  7. #27
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    ah, mais ça, c'est pas de la regex !
    Oops! Farpaitement! Mea culpa!

    bash, entre [[, active les correspondances étendues (extglob), ce qui permet ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[ .23 = *([0-9]).+([0-9]) ]]
    soit :
    *(motif) 0 ou 1 motif
    +(motif) 1 ou plusieurs motifs.
    Dans mon Korn, pour le ksh, le traducteur appelle ça "expression générique".

    Du coup, le code correct serait plutôt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if [[ "${nombre}" = *([0-9]).[0-9] ]] ; then
        # Nombre à 1 chiffre
    elif [[ "${nombre}" = *([0-9]).[0-9][0-9] ]] ; then
        # Nombre à 2 chiffres
    else
        # Mauvais nombre
    fi
    Merci N_BaH d'avoir surveillé de près!

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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