Як перевірити в python, чи містить рядок лише числа?


129

Як перевірити, чи містить рядок лише числа?

Я дав сюди піти. Я хотів би побачити найпростіший спосіб досягти цього.

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
Ваш код завжди буде повертатися, Falseоскільки string.digits == Trueзавжди оцінюється False.
Сукрит Кальра

1
За винятком наведених нижче відповідей, "не пітонічний" спосіб - це якщо [x for x in isbn, якщо x у '0123456789']; що ви можете продовжити, якщо користувач поставить роздільники в isbn - додайте їх до списку
cox

1
Я рекомендую використовувати регулярний вираз, якщо ви читаєте номери ISBN. ISBN може бути довжиною 10 або 13 цифр і мати додаткові обмеження. Тут є хороший список команд регулярних виразів для їх узгодження тут: regexlib.com/… Багато з них також дозволять вам правильно прочитати дефіси ISBN, що полегшить копіювання та вставлення людей.
Кевін

1
@Kevin І, хоча 13-значні ISBN дійсно є лише цифрами, 10-значні ISBN можуть мати X як остаточний символ.
TRiG

Відповіді:


248

Ви хочете використовувати isdigitметод на своєму strоб'єкті:

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

З isdigitдокументації :

str.isdigit ()

Повернути True, якщо всі символи в рядку є цифрами, а принаймні один символ є помилковим. Цифри включають десяткові символи та цифри, які потребують спеціального поводження, наприклад, цифри суперскрипту сумісності Це охоплює цифри, які не можна використовувати для формування чисел у базі 10, як числа Харості. Формально цифра - це символ, який має значення властивості Numeric_Type = цифра або Numeric_Type = Десяткове.


16
Варто зазначити, що це може бути не той чек, який ви насправді хочете. Це перевіряє, що всі символи є подібними до цифр , а не те, що рядок є проаналізованим числом. Наприклад, рядок "⁰" (тобто нульовий суперскрипт unicode), проходить isdigit, але піднімає a, ValueErrorякщо передано до int().
danpalmer

42

Використання str.isdigit:

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

Я поняття не мав, що існує метод. Я завжди робив try: assert str(int(foo)) == foo; except (AssertionError,ValueError): #handleце, і це було некрасиво, як гріх. Дякую!
Адам Сміт

10

Використовуйте рядок isdigit функції:

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

3

Ви також можете використовувати регулярний вираз,

import re

наприклад: -1) word = "3487954"

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

наприклад: -2) word = "3487.954"

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

наприклад: -3) word = "3487.954 328"

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

Як ви бачите, усі 3, наприклад, означає, що у вашому рядку немає лише жодного. Таким чином, ви можете слідувати відповідним рішенням, поданим з ними.


1
re.match('^[0-9\.]*$',word)невдачі для поплавків if(bool(re.search(r'\d', word)))добре працює, хоча.

2

Як щодо числа з плаваючою кількістю , негативів чисел тощо. Усі приклади раніше будуть помилковими.

До сих пір я щось подібне маю, але я думаю, що це може бути набагато краще:

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

повернеться істинним, лише якщо є одне або немає ". у рядку цифр.

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

повернеться помилковим


Усі приклади раніше будуть помилковими. Чи не тому, що питання полягає в чомусь іншому?
AMC

2

Як зазначено в цьому коментарі Як ви перевіряєте в python, чи містить рядок лише числа? isdigit()метод не є абсолютно точним для цього випадку використання, тому що вона повертає Справедливо для деяких цифр, як символів:

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

Якщо цього потрібно уникати, слід перевірити наступні прості функції, чи всі символи в рядку є цифрою між "0" і "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

Використовується в прикладі з питання:

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

Це невелика річ, але функцію можна спростити all(ch in string.digits for ch in s).
AMC

1

Тут ви можете використовувати блок "try catch":

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

це працює лише з цілими числами, а числа з плаваючими числами завжди будуть
виходити

2
Крім того, завжди погана практика не визначати, з яким винятком ви хочете працювати. У цьому випадку це повинно бути:except ValueError:
J0ANMM

Хоча це не правильно, ні? int("1_000")наприклад, не призводить до помилок.
AMC

1

Як і кожен раз, коли я стикаюся з проблемою з чеком, тому що str іноді може бути None, а якщо str може бути None, використовувати лише str.isdigit () недостатньо, оскільки ви отримаєте помилку

AttributeError: У об’єкта 'NoneType' немає атрибута 'isdigit'

а потім вам потрібно спершу перевірити str: немає або ні. Щоб уникнути багатогалузевої гілки, чіткий спосіб зробити це:

if str and str.isdigit():

Сподіваюсь, це допомагає людям мати таке саме питання, як і я.


1

Є два способи, які я можу придумати, щоб перевірити, чи має рядок усі цифри

Спосіб 1 (Використання вбудованої функції isdigit () у python): -

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

Спосіб 2 (Виконання обробки виключень у верхній частині рядка): -

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

Вихід з вищевказаного коду буде:

String does not have all digits in it

Використання голого, за винятком подібних випадків, є поганою практикою, дивіться, наприклад, Що не так у використанні голого "крім"? .
AMC

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.