आप अजगर में कैसे जांचते हैं कि क्या एक स्ट्रिंग में केवल संख्याएं हैं?


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

1
नीचे दिए गए उत्तरों को छोड़कर, एक "नॉन पाइथोनिक" तरीका है अगर [x in isbn के लिए यदि x '0123456789 में]; यदि उपयोगकर्ता isbn में विभाजक डालते हैं तो आप इसे बढ़ा सकते हैं - उन्हें सूची में जोड़ें
cox

1
यदि आप आईएसबीएन नंबर पढ़ रहे हैं तो मैं रेगेक्स का उपयोग करने की सलाह देता हूं। आईएसबीएन या तो 10 या 13 अंक लंबा हो सकता है, और अतिरिक्त प्रतिबंध हैं। उनके यहाँ मेल करने के लिए रेगेक्स कमांड्स की एक अच्छी सूची है: regexlib.com/… इनमें से कई आपको आईएसबीएन हाइफ़न को सही ढंग से पढ़ने देंगे, जिससे लोगों को कॉपी और पेस्ट करना आसान हो जाएगा।
केविन

1
@ केविन और, जबकि 13-अंकीय ISBN वास्तव में केवल अंक हैं, 10-अंकीय ISBN अंतिम वर्ण के रूप में X हो सकते हैं।
TRIG

जवाबों:


248

आप isdigitअपनी strवस्तु पर विधि का उपयोग करना चाहेंगे :

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

से isdigitप्रलेखन :

str.isdigit ()

सही पर लौटें यदि स्ट्रिंग के सभी वर्ण अंक हैं और कम से कम एक वर्ण है, तो गलत है। अंकों में दशमलव वर्ण और अंक शामिल होते हैं जिन्हें विशेष हैंडलिंग की आवश्यकता होती है, जैसे संगतता सुपरस्क्रिप्ट अंक। इस अंक को कवर किया जाता है जिसे आधार 10 में संख्याएँ बनाने के लिए इस्तेमाल नहीं किया जा सकता है, जैसे कि खरोष्ठी संख्याएँ। औपचारिक रूप से, एक अंक एक ऐसा चरित्र है जिसका गुण मान Numeric_Type = Digit या Numeric_Type = दशमलव होता है।


16
यह देखते हुए कि यह वह चेक नहीं है जो आप वास्तव में चाहते हैं। यह जांचता है कि सभी वर्ण डिजिट-जैसे हैं , यह नहीं कि स्ट्रिंग एक पारगम्य संख्या है। उदाहरण के लिए, स्ट्रिंग "⁰" (यह एक यूनिकोड सुपरस्क्रिप्ट शून्य है), पास करता है isdigit, लेकिन ValueErrorयदि पारित हो जाता है तो उठाता है int()
danpalmer

42

उपयोग करें str.isdigit:

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

मुझे पता नहीं था कि विधि मौजूद थी। मैंने हमेशा किया है try: assert str(int(foo)) == foo; except (AssertionError,ValueError): #handleऔर यह बदसूरत पाप के रूप में महसूस किया है। धन्यवाद!
एडम स्मिथ

10

स्ट्रिंग isdigit फ़ंक्शन का उपयोग करें :

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

3

आप regex का उपयोग भी कर सकते हैं,

import re

उदा: -1) शब्द = "3487954"

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

उदा: -2) शब्द = "3487.954"

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

उदा: -3) शब्द = "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()

झूठा लौटेगा


पहले के सभी उदाहरण गलत होंगे। क्या ऐसा नहीं है क्योंकि सवाल कुछ और है?
एएमसी

2

जैसा कि इस टिप्पणी में बताया गया है कि आप अजगर में कैसे जांचते हैं कि क्या एक स्ट्रिंग में केवल संख्याएँ हैं? 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)
एएमसी

1

आप कोशिश कर सकते हैं यहाँ पकड़ने के ब्लॉक का उपयोग करें:

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")उदाहरण के लिए, कोई त्रुटि नहीं होती है।
एएमसी

1

जब भी मैं हर बार चेक के साथ एक समस्या का सामना करता हूं, क्योंकि str कभी भी कोई भी हो सकता है, और अगर str कोई भी नहीं हो सकता है, तो केवल str.isdigit () का उपयोग करें क्योंकि आप एक त्रुटि प्राप्त करने के लिए पर्याप्त नहीं होंगे

गुण: 'कोई नहीं' वस्तु की कोई विशेषता नहीं है 'isdigit'

और फिर आपको पहले सत्यापित करने की आवश्यकता है कि कोई नहीं है या नहीं। बहु-यदि शाखा से बचने के लिए, ऐसा करने का एक स्पष्ट तरीका है:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.