Как вы проверяете в Python, содержит ли строка только числа?


130

Как проверить, содержит ли строка только числа?

Я попробовал здесь. Я хотел бы увидеть самый простой способ добиться этого.

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.
Sukrit Kalra

1
За исключением ответов ниже, «непитоническим» способом является if [x for x in isbn if x in '0123456789']; что вы можете расширить, если пользователь поместит разделители в isbn - добавьте их в список
cox

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

1
@Kevin И хотя 13-значные ISBN действительно являются только цифрами, 10-значные ISBN могут иметь X в качестве последнего символа.
TRiG

Ответы:


249

Вы захотите использовать этот isdigitметод для своего strобъекта:

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

Из isdigitдокументации :

str.isdigit ()

Верните True, если все символы в строке являются цифрами и есть хотя бы один символ, в противном случае - False. Цифры включают десятичные символы и цифры, требующие особой обработки, например цифры надстрочного индекса совместимости. Это касается цифр, которые нельзя использовать для образования чисел с основанием 10, таких как числа Харости. Формально цифра - это символ, имеющий значение свойства Numeric_Type = Digit или Numeric_Type = Decimal.


16
Стоит отметить, что это может быть не тот чек, который вам действительно нужен. Это проверяет, что все символы похожи на цифры , а не на то, что строка является анализируемым числом. Например, строка «⁰» (то есть нулевой надстрочный индекс юникода) проходит isdigit, но ValueErrorпри передаче вызывает int().
danpalmer

42

Использование str.isdigit:

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

Я понятия не имел о существовании этого метода. Я всегда поступал так, try: assert str(int(foo)) == foo; except (AssertionError,ValueError): #handleи это было уродливо, как грех. Спасибо!
Adam Smith


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()

вернет false


Все предыдущие примеры будут неправильными. Не потому ли, что речь идет о другом?
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 - None или нет. Чтобы избежать ветвления с несколькими if, простой способ сделать это:

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.