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

Python Discussion :

Vérifier une entrée nombre


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut Vérifier une entrée nombre
    Je voudrais mettre une vérification que les caractères tapés pour une entrée de nombre ne sont bien que des chiffres ou un point.
    J'ai essayé quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x = input('Entrer la valeur : ')
    if type(x)==type('int'):
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x = input('Entrer la valeur :
    if type(x)=='float':
    mais ça ne marche pas.

    Bien sûr, je pourrais utiliser raw_input et faire la vérification sur la chaine de caractères entrée avec une regex et la transformer en nombre avec int() ou float() mais ça me plairait mieux d'utiliser input.

    PS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if type(x)=="<type 'int'>":
    ne marche pas non plus

  2. #2
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    Input essaye d'évaluer l'expression que tu saisis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    y = 12
    x = input('Entrer la valeur : ')
    try:
        v = int(x)
    except:
        print x + " n'est pas un entier"
     
    print v
    Si lors de l'exécution tu tapes, soit une valeur : 12 soit y, l'exception n'est pas lévée (y est évalué et la valeur renvoyé sera 12). Si par contre si tu saisis n'importe quoi : aze par exemple, une exception est levée au niveau de l'input, aze n'étant pas une expression python.

    Il est donc préférable de passer par raw_input :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    x = raw_input('Entrer la valeur : ')
    try:
        v = int(x)
    except:
        print x + " n'est pas un entier"
     
    print v
    Ou alors je n'ai pas bien compris la question !!

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Merci pour la réponse. Je pensais m'en sortir avec un if et une regex, mais c'est beaucoup mieux avec un try...except et les fonctions int() et float().

    En cherchant dans les docus, j'ai trouvé qu'il existe un module types, qui permet de faire ceci par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from types import IntType,FloatType
     
    x =12
     
    if type(x) is FloatType:
        print 'la valeur de x est un réel'
    else:
        print "x n'est pas un réel"
     
    if type(x) is IntType:
        print 'la valeur de x est un entier'
    else:
        print "x n'est pas un entier"
    Mais dans mon cas où je cherche à controler une entrée ce module ne m'est pas utile car je suis obligé de faire une saisie d'entrée par raw_input().

  4. #4
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    tu peux plutôt utiliser la fonction isinstance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> isinstance(5, float)
    False
    >>> isinstance(5.0, float)
    True
    >>> isinstance(5, int)
    True

  5. #5
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    Citation Envoyé par Guigui_ Voir le message
    tu peux plutôt utiliser la fonction isinstance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> isinstance(5, float)
    False
    >>> isinstance(5.0, float)
    True
    >>> isinstance(5, int)
    True
    Je n'ai pas tout compris alors !!

    Si je fais le test avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    x = raw_input('Entrer la valeur : ')
     
    if isinstance(x, int):
        v = int(x)
        print v
    else:
        print x + " n'est pas un entier"
    cela ne fonctionne pas, vu que x est de type str, et si je passe par un input, j'ai une exception en saisissant de l'alpha comme indiqué plus haut.

    Pourrais tu être plus explicite ?

  6. #6
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    En utilisant raw_input():

    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
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    x = raw_input("x = ")
    try:
        y = eval(x)
        if isinstance(y,int):
            print u"x est un entier"
        elif isinstance(y,float):
            print u"x est un réel"
        else:
            print u"x n'est ni un entier ni un réel"
    except:
        print u"x n'est ni un entier ni un réel"
    Avec ce code, si je rentre:

    123 => il affiche "x est un entier"
    1.23 => il affiche "x est un réel"
    azerty => il affiche "x n'est ni un entier ni un réel"

    Il y a cependant un effet de bord: si je rentre 2*3 (qui n'est pas un entier mais une expression), il est tout de même affiché "x est un entier" parce qu'eval calcule l'expression avant le test.

    Mais avec input(), c'est pareil, et ça donne les mêmes résultats:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    try:
        y = input("x = ")
        if isinstance(y,int):
            print u"x est entier"
        elif isinstance(y,float):
            print u"x est un réel"
        else:
            print u"x n'est ni un entier ni un réel"
    except:
        print u"x n'est ni un entier ni un réel"
    Manifestement, en partant d'une chaine et sans vouloir qu'une expression mathématique soit calculée avant le test, je ne vois qu'une expression régulière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    import re
     
    x = raw_input("x = ").strip()
    if re.match(r"^[+-]?[0-9]+$", x):
        print u"x est entier"
    elif re.match(r"^[+-]?[0-9]+(\.[0-9]*)?([eE][+-]?[0-9]+)?$", x):
        print u"x est un réel"
    else:
        print u"x n'est ni un entier ni un réel"
    Et là, ça donne le bon résultat. Je crois qu'en plus, c'est ça qui colle le mieux avec ce qu'on veut faire: vérifier les caractères.

    De plus, on peut modifier l'expression régulière pour, par exemple, inclure ou exclure la présence d'un exposant dans l'entrée d'un réel.

    Tyrtamos

  7. #7
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    Je répondais simplement à l'usage de type plutôt que isinstance.

    Après, tout dépend de ce qu'il attend en entrée. S'il accepte de pouvoir recevoir des variables, input est tout indiqué (l'avantage, est que isinstance est facile d'utilisation), sinon s'il attend une chaîne de caractères, il doit forcément passer par raw_input et traiter lui-même l'expression

Discussions similaires

  1. [Batch] vérifier une entrée utilisateur
    Par Ph4rell dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 29/07/2010, 08h28
  2. [MySQL] Vérifier l'existance d'une entrée avant l'insertion dans une BD
    Par mitchb dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 22/02/2008, 13h30
  3. comment vérifier une saisie d'entrée est valide
    Par helene0618 dans le forum C#
    Réponses: 9
    Dernier message: 19/02/2008, 18h27
  4. Réponses: 2
    Dernier message: 21/05/2007, 18h55

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