Bagaimana Anda memeriksa dalam python apakah string hanya berisi angka?


129

Bagaimana Anda memeriksa apakah string hanya berisi angka?

Saya sudah mencobanya di sini. Saya ingin melihat cara paling sederhana untuk mencapai ini.

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
Kode Anda akan selalu kembali Falsekarena string.digits == Trueselalu dievaluasi menjadi False.
Sukrit Kalra

1
Kecuali jawaban di bawah ini, cara "Non Pythonic" adalah jika [x untuk x di isbn jika x di '0123456789']; Anda dapat memperluas jika pengguna meletakkan pemisah di isbn - menambahkannya ke daftar
cox

1
Saya sarankan menggunakan regex jika Anda membaca nomor ISBN. ISBN dapat terdiri dari 10 atau 13 digit, dan memiliki batasan tambahan. Ada daftar perintah regex yang baik untuk mencocokkannya di sini: regexlib.com/... Banyak dari ini juga akan memungkinkan Anda membaca dengan benar tanda hubung ISBN, yang akan memudahkan orang untuk menyalin dan menempel.
Kevin

1
@Kevin Dan, sementara ISBN 13-digit memang hanya digit, ISBN 10-digit dapat memiliki X sebagai karakter terakhir.
TRiG

Jawaban:


248

Anda ingin menggunakan isdigitmetode pada strobjek Anda :

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

Dari isdigitdokumentasi :

str.isdigit ()

Return True jika semua karakter dalam string adalah digit dan setidaknya ada satu karakter, False sebaliknya. Digit termasuk karakter desimal dan digit yang membutuhkan penanganan khusus, seperti digit superscript kompatibilitas. Ini mencakup digit yang tidak dapat digunakan untuk membentuk angka di basis 10, seperti angka Kharosthi. Secara formal, digit adalah karakter yang memiliki nilai properti Numeric_Type = Digit atau Numeric_Type = Desimal.


16
Perlu dicatat bahwa ini mungkin bukan cek yang Anda inginkan. Ini memeriksa bahwa semua karakter seperti digit , bukan bahwa string adalah angka yang dapat diuraikan. Sebagai contoh, string "ā°" (yang merupakan unicode superscript nol), tidak lulus isdigit, tetapi memunculkan ValueErrorjika dilewatkan ke int().
danpalmer

42

Gunakan str.isdigit:

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

Saya tidak tahu metode itu ada. Saya selalu melakukan try: assert str(int(foo)) == foo; except (AssertionError,ValueError): #handledan rasanya jelek sebagai dosa. Terima kasih!
Adam Smith

10

Gunakan fungsi string isdigit :

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

3

Anda juga dapat menggunakan regex,

import re

mis .: -1) kata = "3487954"

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

mis: -2) word = "3487.954"

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

mis: -3) word = "3487.954 328"

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

Seperti yang Anda lihat semua 3 misalnya berarti bahwa tidak hanya ada di string Anda. Jadi, Anda dapat mengikuti solusi yang diberikan bersama mereka.


1
re.match('^[0-9\.]*$',word)gagal untuk mengapung. if(bool(re.search(r'\d', word)))bekerja dengan baik.

2

Bagaimana dengan angka float , angka negatif , dll. Semua contoh sebelumnya akan salah.

Sampai sekarang saya mendapatkan sesuatu seperti ini, tetapi saya pikir itu bisa menjadi jauh lebih baik:

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

akan mengembalikan true hanya jika ada satu atau tidak ada '.' dalam deretan digit.

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

akan kembali salah


Semua contoh sebelumnya akan salah. Bukankah itu karena pertanyaannya adalah tentang hal lain?
AMC

2

Seperti yang ditunjukkan dalam komentar ini. Bagaimana Anda memeriksa dalam python apakah string hanya berisi angka? yang isdigit()metode ini tidak benar-benar akurat untuk kasus penggunaan ini, karena kembali Benar untuk beberapa karakter digit seperti:

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

Jika ini perlu dihindari, fungsi sederhana berikut memeriksa, apakah semua karakter dalam string adalah angka antara "0" dan "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

Digunakan dalam contoh dari pertanyaan:

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

Ini hal kecil, tetapi fungsinya dapat disederhanakan all(ch in string.digits for ch in s).
AMC

1

Anda dapat menggunakan try catch block di sini:

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

ini hanya bekerja dengan bilangan bulat, dengan angka float akan selalu gagal karena mengandung (.)
Eddwin Paz

2
Selain itu, selalu merupakan praktik buruk untuk tidak menentukan pengecualian mana yang ingin Anda tangani. Dalam hal ini seharusnya:except ValueError:
J0ANMM

Ini tidak benar, kan? int("1_000")misalnya, tidak menyebabkan kesalahan.
AMC

1

Karena setiap kali saya menghadapi masalah dengan cek adalah karena str dapat Kadang-kadang tidak, dan jika str bisa Tidak, hanya menggunakan str.isdigit () tidak cukup karena Anda akan mendapatkan kesalahan

AttributeError: objek 'NoneType' tidak memiliki atribut 'isdigit'

dan kemudian Anda harus terlebih dahulu memvalidasi str adalah Tidak atau tidak. Untuk menghindari cabang multi-jika, cara yang jelas untuk melakukan ini adalah:

if str and str.isdigit():

Semoga ini bisa membantu orang-orang memiliki masalah yang sama seperti saya.


1

Ada 2 metode yang dapat saya pikirkan untuk memeriksa apakah sebuah string memiliki semua digit tidak

Metode 1 (Menggunakan fungsi isdigit () built-in python): -

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

Metode 2 (Melakukan Penanganan Eksepsi di atas tali): -

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

Output dari kode di atas adalah:

String does not have all digits in it

Menggunakan bare kecuali seperti itu adalah praktik yang buruk, lihat misalnya Apa yang salah dengan menggunakan bare 'kecuali'? .
AMC

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.