Bir dizenin yalnızca sayılardan oluşup oluşmadığını python'da nasıl kontrol edersiniz?


129

Bir dizenin yalnızca sayılardan oluşup oluşmadığını nasıl kontrol edersiniz?

Buraya bir şans verdim. Bunu başarmanın en basit yolunu görmek isterim.

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
Kodunuz hep dönecektir Falseberi string.digits == Truehep olarak değerlendirilir False.
Sukrit Kalra

1
Aşağıdaki cevaplar dışında, "Pytonik Olmayan" bir yol şudur: [isbn'de x için x, '0123456789'da ise x]; kullanıcı isbn'ye ayırıcılar koyarsa uzatabileceğinizi - bunları listeye ekleyin
cox

1
ISBN numaralarını okuyorsanız normal ifadeyi kullanmanızı öneririm. ISBN'ler 10 veya 13 basamaklı olabilir ve ek kısıtlamaları olabilir. Eşleştirmeye yönelik iyi bir normal ifade komutları listesi vardır: regexlib.com/… Bunların çoğu, ISBN kısa çizgilerini doğru şekilde okumanıza izin verir, bu da insanların kopyalayıp yapıştırmasını kolaylaştırır.
Kevin

1
@Kevin Ve 13 basamaklı ISBN'ler gerçekten yalnızca rakamlar iken, 10 basamaklı ISBN'ler son karakter olarak X'e sahip olabilir.
trigonometri

Yanıtlar:


248

isdigitYöntemi strnesneniz üzerinde kullanmak isteyeceksiniz :

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

Gönderen isdigitbelgeler :

str.isdigit ()

Dizedeki tüm karakterler rakamsa ve en az bir karakter varsa True döndür, aksi takdirde False. Rakamlar, uyumluluk üst simge rakamları gibi özel işlem gerektiren ondalık karakterleri ve rakamları içerir. Bu, Kharosthi sayıları gibi 10 tabanında sayılar oluşturmak için kullanılamayan basamakları kapsar. Resmi olarak rakam, Numeric_Type = Digit veya Numeric_Type = Decimal özellik değerine sahip bir karakterdir.


16
Bunun gerçekten istediğiniz çek olmayabilir. Bu , dizenin ayrıştırılabilir bir sayı olup olmadığını değil , tüm karakterlerin rakam benzeri olup olmadığını kontrol eder . Örneğin, "⁰" dizisi (bu bir unicode üst simge sıfırdır) geçer isdigit, ancak ValueErroriletilirse a yükseltir int().
danpalmer

42

Kullanım str.isdigit:

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

Bu yöntemin var olduğu hakkında hiçbir fikrim yoktu. Her zaman yaptım try: assert str(int(foo)) == foo; except (AssertionError,ValueError): #handleve günah kadar çirkin hissettim. Teşekkürler!
Adam Smith

10

String isdigit işlevini kullanın :

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

3

Ayrıca normal ifadeyi de kullanabilirsiniz.

import re

örneğin: -1) kelime = "3487954"

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

örneğin: -2) kelime = "3487.954"

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

örneğin: -3) kelime = "3487.954 328"

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

Bunların 3'ünü de görebileceğiniz gibi, örneğin dizenizde sadece hayır olduğu anlamına gelir. Böylece onlarla birlikte verilen ilgili çözümleri takip edebilirsiniz.


1
re.match('^[0-9\.]*$',word)yüzer için başarısız. if(bool(re.search(r'\d', word)))yine de iyi çalışıyor.

2

Peki ya kayan sayılar , negatif sayılar vb. Önceki tüm örnekler yanlış olacaktır.

Şimdiye kadar böyle bir şey aldım, ama çok daha iyi olabileceğini düşünüyorum:

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

yalnızca biri varsa veya hiç yoksa doğru döndürür. ' rakam dizisinde.

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

yanlış dönecek


Önceki tüm örnekler yanlış olacaktır. Soru başka bir şeyle ilgili olduğu için değil mi?
AMC

2

Bu yorumda belirtildiği gibi python'da bir dizenin yalnızca sayılar içerip içermediğini nasıl kontrol edersiniz? isdigit()bazı haneli benzeri karakterler için doğru döner, çünkü yöntem, bu kullanım şeklini tamamen doğru değildir:

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

Bundan kaçınılması gerekiyorsa, aşağıdaki basit işlev, bir dizedeki tüm karakterlerin "0" ile "9" arasında bir rakam olup olmadığını kontrol eder:

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

Sorudaki örnekte kullanılmıştır:

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

Bu küçük bir şey, ancak işlev basitleştirilebilir all(ch in string.digits for ch in s).
AMC

1

Try catch bloğu burada kullanabilirsiniz:

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

bu yalnızca tamsayılarla çalışır, kayan sayılar bir (.) içerdiği için her zaman başarısız olur.
Eddwin Paz

2
Ek olarak, hangi istisnayı ele almak istediğinizi belirtmemek her zaman kötü bir uygulamadır. Bu durumda şu şekilde olmalıdır:except ValueError:
J0ANMM

Yine de bu doğru değil, değil mi? int("1_000")örneğin bir hataya yol açmaz.
AMC

1

Kontrolle ilgili bir sorunla her karşılaştığımda, str'nin bazen Hiçbiri olabilmesi ve str'nin Yok olması durumunda, yalnızca str.isdigit () kullanmanız yeterli olmayacağı için bir hata alacağınızdan

AttributeError: 'NoneType' nesnesinin 'isdigit' özniteliği yok

ve sonra ilk önce dizenin Yok olup olmadığını doğrulamanız gerekir. Birden çok if dalını önlemek için bunu yapmanın açık bir yolu şudur:

if str and str.isdigit():

Umarım bu, benim gibi aynı sorunu yaşayan insanlar için yardımcı olur.


1

Bir dizgenin tüm basamaklarına sahip olup olmadığını kontrol etmek için düşünebileceğim 2 yöntem var.

Yöntem 1 (Python'da yerleşik isdigit () işlevini kullanma): -

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

Yöntem 2 (Dizenin üstünde Özel Durum İşleme Gerçekleştirme): -

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

Yukarıdaki kodun çıktısı şöyle olacaktır:

String does not have all digits in it

Bunun dışında çıplak kullanmak kötü bir uygulamadır, örneğin bkz. Çıplak 'hariç' kullanmanın nesi yanlış? .
AMC

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.