Làm thế nào để bạn kiểm tra python xem một chuỗi chỉ chứa số?


129

Làm thế nào để bạn kiểm tra xem một chuỗi chỉ chứa số?

Tôi đã cho nó đi đây. Tôi muốn xem cách đơn giản nhất để thực hiện điều này.

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
Mã của bạn sẽ luôn trở lại Falsestring.digits == Trueluôn luôn đánh giá False.
Sukrit Kalra

1
Ngoại trừ các câu trả lời dưới đây, một cách "Không Pythonic" là nếu [x cho x in isbn nếu x trong '0123456789']; rằng bạn có thể gia hạn nếu người dùng đặt dấu phân cách vào isbn - thêm chúng vào danh sách
cox

1
Tôi khuyên bạn nên sử dụng regex nếu bạn đang đọc số ISBN. Các số có thể dài 10 hoặc 13 chữ số và có các hạn chế bổ sung. Có một danh sách tốt các lệnh regex để khớp chúng ở đây: regexlib.com/ Từ Nhiều trong số này cũng sẽ cho phép bạn đọc chính xác các dấu gạch ngang, giúp mọi người dễ dàng sao chép và dán.
Kevin

1
@Kevin Và, trong khi các chữ số 13 chữ số thực sự chỉ là chữ số, thì các chữ số 10 chữ số có thể có X là ký tự cuối cùng.
TRiG

Câu trả lời:


248

Bạn sẽ muốn sử dụng isdigitphương thức trên strđối tượng của mình :

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

Từ isdigittài liệu :

str.itorigit ()

Trả về True nếu tất cả các ký tự trong chuỗi là chữ số và có ít nhất một ký tự, Sai khác. Các chữ số bao gồm các ký tự thập phân và chữ số cần xử lý đặc biệt, chẳng hạn như các chữ số siêu ký tự tương thích. Điều này bao gồm các chữ số không thể được sử dụng để tạo thành số trong cơ sở 10, như số Kharosthi. Chính thức, một chữ số là một ký tự có giá trị thuộc tính Numeric_Type = Digit hoặc Numeric_Type = Decimal.


16
Đáng lưu ý rằng đây có thể không phải là kiểm tra bạn thực sự muốn. Điều này kiểm tra rằng tất cả các ký tự giống như chữ số , không phải là chuỗi là một số có thể phân tích cú pháp. Ví dụ: chuỗi "" (đó là siêu ký tự unicode zero), không vượt qua isdigit, nhưng tăng a ValueErrornếu được chuyển đến int().
danpalmer

42

Sử dụng str.isdigit:

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

Tôi không có ý tưởng rằng phương pháp tồn tại. Tôi đã luôn luôn làm try: assert str(int(foo)) == foo; except (AssertionError,ValueError): #handlevà nó cảm thấy xấu xí như tội lỗi. Cảm ơn!
Adam Smith

10

Sử dụng hàm isdigit chuỗi :

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

3

Bạn cũng có thể sử dụng regex,

import re

ví dụ: -1) từ = "3487954"

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

ví dụ: -2) từ = "3487.954"

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

ví dụ: -3) từ = "3487.954 328"

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

Như bạn có thể thấy cả 3 ví dụ có nghĩa là chỉ có không có trong chuỗi của bạn. Vì vậy, bạn có thể làm theo các giải pháp tương ứng được đưa ra với họ.


1
re.match('^[0-9\.]*$',word)thất bại cho phao. if(bool(re.search(r'\d', word)))hoạt động tốt mặc dù.

2

Những gì về số float , số âm , vv .. Tất cả các ví dụ trước sẽ sai.

Cho đến bây giờ tôi đã có một cái gì đó như thế này, nhưng tôi nghĩ nó có thể tốt hơn rất nhiều:

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

sẽ chỉ trả về đúng nếu có một hoặc không '.' trong chuỗi các chữ số.

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

sẽ trả lại sai


Tất cả các ví dụ trước sẽ sai. Không phải vì câu hỏi là về cái gì khác sao?
AMC

2

Như đã chỉ ra trong bình luận này Làm thế nào để bạn kiểm tra python xem một chuỗi chỉ chứa các số? các isdigit()phương pháp là không hoàn toàn chính xác đối với trường hợp sử dụng này, bởi vì nó sẽ trả về True cho một số nhân vật chữ số giống như:

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

Nếu cần tránh điều này, hàm đơn giản sau sẽ kiểm tra, nếu tất cả các ký tự trong chuỗi là một chữ số nằm giữa "0" và "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

Được sử dụng trong ví dụ từ câu hỏi:

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

Đó là một điều nhỏ, nhưng chức năng có thể được đơn giản hóa all(ch in string.digits for ch in s).
AMC

1

Bạn có thể sử dụng thử khối bắt tại đây:

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

điều này chỉ hoạt động với số nguyên, với số float sẽ luôn bị lỗi vì nó chứa (.)
Eddwin Paz

2
Ngoài ra, luôn luôn là một thực tiễn tồi khi không chỉ định ngoại lệ nào bạn muốn xử lý. Trong trường hợp này phải là:except ValueError:
J0ANMM

Điều này không đúng, mặc dù không? int("1_000")không dẫn đến một lỗi, ví dụ.
AMC

1

Vì mỗi lần tôi gặp sự cố với kiểm tra là vì str đôi khi có thể là Không và nếu str có thể là Không, chỉ sử dụng str.itorigit () là không đủ vì bạn sẽ gặp lỗi

AttributionError: Đối tượng 'noneType' không có thuộc tính 'isdigit'

và sau đó bạn cần xác thực str là Không hoặc không. Để tránh một nhánh nhiều nếu, một cách rõ ràng để làm điều này là:

if str and str.isdigit():

Hy vọng điều này sẽ giúp cho những người có cùng một vấn đề như tôi.


1

Có 2 phương thức mà tôi có thể nghĩ ra để kiểm tra xem một chuỗi có tất cả các chữ số không

Phương pháp 1 (Sử dụng hàm isdigit () tích hợp trong python): -

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

Phương pháp 2 (Thực hiện Xử lý ngoại lệ trên đầu chuỗi): -

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

Đầu ra của đoạn mã trên sẽ là:

String does not have all digits in it

Sử dụng trần trừ như thế là một thực hành xấu, xem ví dụ Điều gì sai khi sử dụng trần 'ngoại trừ'? .
AMC

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.