คุณเช็คอินไพ ธ อนได้อย่างไรว่าสตริงมีเพียงตัวเลขเท่านั้น?


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

1
ยกเว้นคำตอบด้านล่างวิธี "Non Pythonic" คือถ้า [x สำหรับ x ใน isbn ถ้า x ใน '0123456789']; ที่คุณสามารถขยายได้หากผู้ใช้ใส่ตัวคั่นใน isbn - เพิ่มลงในรายการ
cox

1
ฉันแนะนำให้ใช้ regex ถ้าคุณอ่านหมายเลข ISBN ISBN อาจมีความยาว 10 หรือ 13 หลักและมีข้อ จำกัด เพิ่มเติม มีรายการคำสั่ง regex ที่ดีสำหรับการจับคู่คำเหล่านี้ที่นี่: regexlib.com/…เหล่านี้จะช่วยให้คุณอ่านเครื่องหมายยัติภังค์ ISBN ได้อย่างถูกต้องซึ่งจะทำให้ผู้คนสามารถคัดลอกและวางได้ง่ายขึ้น
เควิน

1
@Kevin และในขณะที่ ISBN 13 หลักเป็นตัวเลขหลักเท่านั้น ISBN 10 หลักสามารถมี X เป็นอักขระตัวสุดท้าย
TRiG

คำตอบ:


248

คุณจะต้องการใช้isdigitวิธีนี้กับstrวัตถุของคุณ:

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

จากisdigitเอกสาร :

str.isdigit ()

ส่งคืน True ถ้าตัวละครทั้งหมดในสตริงเป็นตัวเลขและมีอย่างน้อยหนึ่งตัวอักษรเท็จมิฉะนั้น ตัวเลขรวมถึงตัวอักษรทศนิยมและตัวเลขที่ต้องการการจัดการพิเศษเช่นความเข้ากันได้ของตัวยกหลัก ซึ่งครอบคลุมตัวเลขที่ไม่สามารถใช้ในการสร้างตัวเลขในฐาน 10 เช่นหมายเลข Kharosthi ตัวเลขเป็นตัวอักษรที่มีค่าคุณสมบัติเป็นตัวเลข Numeric_Type = Digit หรือ Numeric_Type = ทศนิยม


16
น่าสังเกตว่านี่อาจไม่ใช่เช็คที่คุณต้องการ สิ่งนี้จะตรวจสอบว่าตัวละครทุกตัวเป็นตัวเลขหลักไม่ใช่ว่าสตริงนั้นเป็นตัวเลขที่แยกได้ ยกตัวอย่างเช่นสตริง "⁰" (ที่เป็น Unicode ยกศูนย์) ไม่ผ่าน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

คุณยังสามารถใช้ regex

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

ตามที่ระบุไว้ในความคิดเห็นนี้คุณจะตรวจสอบในงูหลามว่าสตริงมีเพียงตัวเลขได้อย่างไร isdigit()เป็นวิธีการที่ไม่ได้ทั้งหมดที่ถูกต้องสำหรับกรณีการใช้งานนี้เพราะมันจะกลับ True สำหรับบางตัวละครหลักที่ชอบ:

>>> "\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

คุณสามารถใช้ลอง catch catch block ได้ที่นี่:

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

นี้ทำงานร่วมกับจำนวนเต็มกับตัวเลขลอยมักจะล้มเหลวเพราะมันมี (.)
Eddwin ลาปาซ

2
นอกจากนี้ยังเป็นวิธีปฏิบัติที่ไม่ดีเสมอที่จะไม่ระบุข้อยกเว้นใดที่คุณต้องการจัดการ ในกรณีนี้ควรเป็น:except ValueError:
J0ANMM

สิ่งนี้ไม่ถูกต้องใช่ไหม? int("1_000")ไม่นำไปสู่ข้อผิดพลาดตัวอย่างเช่น
AMC

1

เนื่องจากทุกครั้งที่ฉันพบปัญหากับการตรวจสอบก็เพราะว่า str สามารถเป็น None ในบางครั้งและถ้า str สามารถเป็น None ได้ให้ใช้เฉพาะ str.isdigit () เท่านั้นไม่พอเพราะคุณจะได้รับข้อผิดพลาด

AttributeError: วัตถุ 'NoneType' ไม่มีแอตทริบิวต์ 'isdigit'

และจากนั้นคุณต้องตรวจสอบก่อนว่า str คือ None หรือไม่ หากต้องการหลีกเลี่ยงสาขาที่มีหลายสาขาวิธีที่ชัดเจนในการดำเนินการคือ:

if str and str.isdigit():

หวังว่าสิ่งนี้จะช่วยให้ผู้คนมีปัญหาแบบเดียวกันกับฉัน


1

มี 2 ​​วิธีที่ฉันสามารถคิดเพื่อตรวจสอบว่าสตริงมีตัวเลขทั้งหมดไม่

วิธีที่ 1 (ใช้ฟังก์ชัน isdigit () ในตัวในไพ ธ อน): -

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.