Comment vérifier en python si une chaîne ne contient que des nombres?


129

Comment vérifier si une chaîne ne contient que des nombres?

Je l'ai essayé ici. J'aimerais voir le moyen le plus simple d'accomplir cela.

import string

def main():
    isbn = input("Enter your 10 digit ISBN number: ")
    if len(isbn) == 10 and string.digits == True:
        print ("Works")
    else:
        print("Error, 10 digit number was not inputted and/or letters were inputted.")
        main()

if __name__ == "__main__":
    main()
    input("Press enter to exit: ")

1
Votre code sera toujours renvoyé Falsecar il est string.digits == Truetoujours évalué à False.
Sukrit Kalra

1
Sauf les réponses ci-dessous, une manière "non pythonique" est if [x pour x dans isbn si x dans '0123456789']; que vous pouvez étendre si l'utilisateur met des séparateurs dans isbn - ajoutez-les à la liste
cox

1
Je recommande d'utiliser regex si vous lisez des numéros ISBN. Les ISBN peuvent comporter 10 ou 13 chiffres et sont soumis à des restrictions supplémentaires. Il y a une bonne liste de commandes regex pour les faire correspondre ici: regexlib.com / ... Beaucoup d'entre elles vous permettront également de lire correctement les tirets ISBN, ce qui facilitera le copier-coller pour les gens.
Kevin le

1
@Kevin Et, alors que les ISBN à 13 chiffres ne sont en effet que des chiffres, les ISBN à 10 chiffres peuvent avoir X comme caractère final.
TRiG

Réponses:


248

Vous voudrez utiliser la isdigitméthode sur votre strobjet:

if len(isbn) == 10 and isbn.isdigit():

De la isdigitdocumentation :

str.isdigit ()

Renvoie True si tous les caractères de la chaîne sont des chiffres et qu'il y a au moins un caractère, False sinon. Les chiffres incluent les caractères décimaux et les chiffres qui nécessitent un traitement spécial, tels que les chiffres en exposant de compatibilité. Cela couvre les chiffres qui ne peuvent pas être utilisés pour former des nombres en base 10, comme les nombres de Kharosthi. Formellement, un chiffre est un caractère qui a la valeur de propriété Numeric_Type = Digit ou Numeric_Type = Decimal.


16
Il convient de noter que ce n'est peut-être pas le chèque que vous souhaitez réellement. Cela vérifie que tous les caractères ressemblent à des chiffres , et non que la chaîne est un nombre analysable. Par exemple, la chaîne "⁰" (c'est-à-dire un zéro en exposant unicode) passe isdigit, mais lève un ValueErrorsi passé à int().
danpalmer

42

Utilisez str.isdigit:

>>> "12345".isdigit()
True
>>> "12345a".isdigit()
False
>>>

Je n'avais aucune idée que cette méthode existait. Je l'ai toujours fait try: assert str(int(foo)) == foo; except (AssertionError,ValueError): #handleet c'était moche comme un péché. Merci!
Adam Smith

10

Utilisez la fonction isdigit de chaîne :

>>> s = '12345'
>>> s.isdigit()
True
>>> s = '1abc'
>>> s.isdigit()
False

3

Vous pouvez également utiliser le regex,

import re

par exemple: -1) mot = "3487954"

re.match('^[0-9]*$',word)

par exemple: -2) mot = "3487.954"

re.match('^[0-9\.]*$',word)

par exemple: -3) mot = "3487.954 328"

re.match('^[0-9\.\ ]*$',word)

Comme vous pouvez le voir tous les 3, par exemple, cela signifie qu'il n'y a que non dans votre chaîne. Ainsi, vous pouvez suivre les solutions respectives données avec eux.


1
re.match('^[0-9\.]*$',word)échoue pour les flotteurs. if(bool(re.search(r'\d', word)))fonctionne bien cependant.

2

Qu'en est-il des nombres flottants , des négatifs nombres , etc. Tous les exemples précédents seront faux.

Jusqu'à présent, j'ai eu quelque chose comme ça, mais je pense que ça pourrait être beaucoup mieux:

'95.95'.replace('.','',1).isdigit()

retournera vrai seulement s'il y en a un ou pas de '.' dans la chaîne de chiffres.

'9.5.9.5'.replace('.','',1).isdigit()

retournera faux


Tous les exemples précédents seront faux. N'est-ce pas parce que la question porte sur autre chose?
AMC le

2

Comme indiqué dans ce commentaire Comment vérifiez-vous en python si une chaîne ne contient que des nombres? la isdigit()méthode n'est pas totalement précise pour ce cas d'utilisation, car elle renvoie True pour certains caractères de type chiffre:

>>> "\u2070".isdigit() # unicode escaped 'superscript zero' 
True

Si cela doit être évité, la fonction simple suivante vérifie si tous les caractères d'une chaîne sont un chiffre compris entre "0" et "9":

import string

def contains_only_digits(s):
    # True for "", "0", "123"
    # False for "1.2", "1,2", "-1", "a", "a1"
    for ch in s:
        if not ch in string.digits:
            return False
    return True

Utilisé dans l'exemple de la question:

if len(isbn) == 10 and contains_only_digits(isbn):
    print ("Works")

C'est une petite chose, mais la fonction peut être simplifiée all(ch in string.digits for ch in s).
AMC le

1

Vous pouvez utiliser le bloc try catch ici:

s="1234"
try:
    num=int(s)
    print "S contains only digits"
except:
    print "S doesn't contain digits ONLY"

cela ne fonctionne qu'avec des entiers, avec des nombres flottants échouera toujours car il contient un (.)
Eddwin Paz

2
De plus, il est toujours déconseillé de spécifier quelle exception vous souhaitez gérer. Dans ce cas, il devrait être:except ValueError:
J0ANMM

Ce n'est pas correct, non? int("1_000")ne conduit pas à une erreur, par exemple.
AMC le

1

Comme chaque fois que je rencontre un problème avec la vérification, c'est parce que le str peut parfois être None, et si le str peut être None, n'utiliser que str.isdigit () n'est pas suffisant car vous obtiendrez une erreur

AttributeError: l'objet 'NoneType' n'a pas d'attribut 'isdigit'

puis vous devez d'abord valider que la chaîne est None ou non. Pour éviter une branche multi-if, une façon claire de le faire est:

if str and str.isdigit():

J'espère que cela aidera les gens à avoir le même problème que moi.


1

Il y a 2 méthodes auxquelles je peux penser pour vérifier si une chaîne a tous les chiffres de non

Méthode 1 (Utilisation de la fonction isdigit () intégrée en python): -

>>>st = '12345'
>>>st.isdigit()
True
>>>st = '1abcd'
>>>st.isdigit()
False

Méthode 2 (exécution de la gestion des exceptions au-dessus de la chaîne): -

st="1abcd"
try:
    number=int(st)
    print("String has all digits in it")
except:
    print("String does not have all digits in it")

La sortie du code ci-dessus sera:

String does not have all digits in it

Utiliser un «sauf» nu est une mauvaise pratique, voir par exemple . .
AMC le

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.