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 :

Tester si une chaîne peut être un nombre d'un type particulier


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut Tester si une chaîne peut être un nombre d'un type particulier
    Voici mon petit code :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    # -*- coding: utf-8 -*-
    #!/usr/bin/env python
     
    import re
    from fractions import Fraction
     
    # The following pattern commes from the book "Dive into Python".
    # It will be use to test if a text is a valid roman number.
    PATTERN_ROMAN_NUMERAL = re.compile("""
        ^                   # beginning of string
        M{0,4}              # thousands - 0 to 4 M's
        (CM|CD|D?C{0,3})    # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
                            #            or 500-800 (D, followed by 0 to 3 C's)
        (XC|XL|L?X{0,3})    # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
                            #        or 50-80 (L, followed by 0 to 3 X's)
        (IX|IV|V?I{0,3})    # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
                            #        or 5-8 (V, followed by 0 to 3 I's)
        $                    # end of string
        """ ,re.VERBOSE)
     
    def isUpperRoman(stringToTest):
        return bool(PATTERN_ROMAN_NUMERAL.search(stringToTest))
     
    def isInteger(stringToTest):
        try:
    # We cannot use  isinstance(stringToTest, int) ...
            int(stringToTest)
            return True
        except:
            return False
     
    def isRational(stringToTest):
        try:
            Fraction(stringToTest)
            return True
        except:
            return False
     
     
    ###############
    ###############
    ##           ##
    ## FOR TESTS ##
    ##           ##
    ###############
    ###############
     
    if __name__ == '__main__':
        tests = []
     
        tests.append("isUpperRoman('I')")
        tests.append("isUpperRoman('4')")
     
        tests.append("isInteger('I')")
        tests.append("isInteger('4')")
     
        tests.append("isRational('I')")
        tests.append("isRational('4')")
        tests.append("isRational('4/5')")
        tests.append("isRational('123.667')")
     
        for oneTest in tests:
            print oneTest
            print '\t',
            exec "print " + oneTest
    Les méthodes sont typiquement celles de canards boîteux dont raffolent Python.

    Ma question est de savoir s'il est possible de faire autrement. Simple curiosité.

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 078
    Par défaut
    Tu peux utiliser le module types ou id()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> id(45)
    152270160
    >>> id(int("45"))
    152270160
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> type(45) is types.IntType
    True

  3. #3
    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,

    Tant que les nombres à tester sont formatés comme dans Python, on peut faire comme tu le proposes. Mais s'il s'agit, par exemple, de tester des nombres réels saisis avec une virgule au lieu d'un point décimal, ou des grands nombres ayant des séparateurs de milliers (espaces ou virgules à l'américaine), on peut recourir aux expressions régulières. J'ai essayé des solutions comme ça ici:

    http://python.jpvweb.com/mesrecettes...ivers_expr_reg.

    Tyrtamos

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 70
    Par défaut
    Note que pour savoir si c'est un entier tu peux faire :

    machin = "123"
    machin.isdigit()

  5. #5
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Tu peux utiliser le module types ou id()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> id(45)
    152270160
    >>> id(int("45"))
    152270160
    L'inconvénient de cette méthode par rapport à la mienne est qu'elle appelle les deux fonctions id et int au lieu de seulement int.

    Citation Envoyé par tyrtamos Voir le message
    Tant que les nombres à tester sont formatés comme dans Python, on peut faire comme tu le proposes.
    Oui effectivement. Si les nombres ne sont pas formatés la solution qui me vient à l'esprit est de passer par sympy qui se charge de faire les calculs et les simplifications exactes dans toutes les situations possibles.

    Citation Envoyé par tyrtamos Voir le message
    Mais s'il s'agit, par exemple, de tester des nombres réels saisis avec une virgule au lieu d'un point décimal, ou des grands nombres ayant des séparateurs de milliers (espaces ou virgules à l'américaine), on peut recourir aux expressions régulières.
    Merci.

    Citation Envoyé par peufeu Voir le message
    Note que pour savoir si c'est un entier tu peux faire :

    machin = "123"
    machin.isdigit()
    Merci

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 078
    Par défaut
    On peut aussi utiliser assert

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assert(isinstance(nombre, int))

  7. #7
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Pas dans mon cas car la variable à tester est stockée sous forme de chaîne puisqu'elle provient d'un fichier texte.

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

Discussions similaires

  1. Un petit défi : tester si une chaîne est un nombre romain
    Par rambc dans le forum Général Python
    Réponses: 1
    Dernier message: 09/04/2009, 12h43
  2. [DBF] Tester si une chaîne est vide
    Par ®om dans le forum JDBC
    Réponses: 7
    Dernier message: 26/07/2007, 16h30
  3. Voir si une chaîne est composée de nombre
    Par Destiny dans le forum C#
    Réponses: 2
    Dernier message: 26/04/2007, 09h56
  4. une idée peut être?
    Par b.amine dans le forum Excel
    Réponses: 2
    Dernier message: 01/04/2007, 11h19
  5. Tester qu'une variable varchar est un nombre
    Par Oluha dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/06/2005, 13h29

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