2010-11-09 9 views
18
a = raw_input('How much is 1 share in that company? ') 

while not a.isdigit(): 
    print("You need to write a number!\n") 
    a = raw_input('How much is 1 share in that company? ') 

यह तभी उपयोगकर्ता एक integer में प्रवेश करती है काम करता है, लेकिन मैं यह भी काम करने के लिए अगर वे एक float प्रवेश चाहते हैं, लेकिन नहीं, जब वे एक string दर्ज करें।फ्लोट के लिए isdigit का उपयोग कर?

तो उपयोगकर्ता 9 और 9.2 दोनों दर्ज करने में सक्षम होना चाहिए, लेकिन abc नहीं।

मुझे यह कैसे करना चाहिए?

उत्तर

9

उपयोग नियमित अभिव्यक्ति।

import re 

p = re.compile('\d+(\.\d+)?') 

a = raw_input('How much is 1 share in that company? ') 

while p.match(a) == None: 
    print "You need to write a number!\n" 
    a = raw_input('How much is 1 share in that company? ') 
+3

वे नियमित अभिव्यक्तियां बहुत लचीला हैं! फिर भी, dan04 का समाधान बहुत अधिक पाइथनिक लगता है। यहां मैं पाइथोनिक को "समकक्ष जटिलता के दो समाधानों के बीच परिभाषित करता हूं, जो नियमित अभिव्यक्तियों का उपयोग नहीं करता है।" यह अभी भी नियमित अभिव्यक्तियों के लिए कई अनुप्रयोगों को छोड़ देता है। –

+0

@ स्टेवेन रूंबास्की: हाँ, dan04 का समाधान अधिक पाइथोनिक लगता है, सोचा कि मेरा वास्तव में कम कोड हो सकता है। –

+0

दुर्भाग्य से यह फ्लोट्स के लिए एक अच्छा regex नहीं है और इसलिए वास्तव में सवाल का जवाब नहीं है। उदाहरण के लिए यह ".1" से मेल नहीं खाता है लेकिन "5 एबीसी" से मेल खाता है।ऋणात्मक मूल्य और अन्य नोटेशन भी हैं, इसलिए संभव है कि यह dan04 के उत्तर का उपयोग करने के लिए आदर्श है, इसे किसी फ़ंक्शन में बदलना यदि आपको किसी सूची समझ या तर्क में इसका उपयोग करने की आवश्यकता है। – mrooney

25

EAFP

try: 
    x = float(a) 
except ValueError: 
    print("You must enter a number") 
+8

EAFP = आसान अनुमति से माफी के लिए पूछें करने के लिए (http://docs.python.org/glossary.html देखें) –

+0

@ स्टेवेन रुंबास्की हालांकि मैं इस फॉर्म को पसंद करता हूं: "अनुमति मांगने से माफी मांगना आसान है" :-) –

+0

ठीक है, तो यह सुनिश्चित करने के लिए भी कोई आसान तरीका है कि उपयोगकर्ता ऋणात्मक मूल्य दर्ज नहीं करता है? –

2

मुझे लगता है कि @ dan04 सही दृष्टिकोण (EAFP) है, लेकिन दुर्भाग्य से असली दुनिया अक्सर एक विशेष मामला है और कुछ अतिरिक्त कोड वास्तव में प्रबंधन करने के लिए आवश्यक है बातें-तो नीचे एक अधिक विस्तृत, लेकिन यह भी एक है और अधिक व्यावहारिक (और यथार्थवादी) बिट:

import sys 

while True: 
    try: 
     a = raw_input('How much is 1 share in that company? ') 
     x = float(a) 
     # validity check(s) 
     if x < 0: raise ValueError('share price must be positive') 
    except ValueError, e: 
     print("ValueError: '{}'".format(e)) 
     print("Please try entering it again...") 
    except KeyboardInterrupt: 
     sys.exit("\n<terminated by user>") 
    except: 
     exc_value = sys.exc_info()[1] 
     exc_class = exc_value.__class__.__name__ 
     print("{} exception: '{}'".format(exc_class, exc_value)) 
     sys.exit("<fatal error encountered>") 
    else: 
     break # no exceptions occurred, terminate loop 

print("Share price entered: {}".format(x)) 

नमूना उपयोग:

> python numeric_input.py 
How much is 1 share in that company? abc 
ValueError: 'could not convert string to float: abc' 
Please try entering it again... 
How much is 1 share in that company? -1 
ValueError: 'share price must be positive' 
Please try entering it again... 
How much is 1 share in that company? 9 
Share price entered: 9.0 

> python numeric_input.py 
How much is 1 share in that company? 9.2 
Share price entered: 9.2 
8

मौजूदा जवाब है कि सही और अधिक pythonic तरीका try...except को आमतौर पर (मैं है कर रहे हैं। ई। EAFP)।

हालांकि, अगर आप वास्तव में सत्यापन करना चाहते हैं, तो आप isdigit() का उपयोग करने से पहले बिल्कुल 1 दशमलव बिंदु निकाल सकते हैं।

>>> "124".replace(".", "", 1).isdigit() 
True 
>>> "12.4".replace(".", "", 1).isdigit() 
True 
>>> "12..4".replace(".", "", 1).isdigit() 
False 
>>> "192.168.1.1".replace(".", "", 1).isdigit() 
False 

ध्यान दें कि यह फ्लोट्स को इट्स से अलग नहीं करता है। यदि आप वास्तव में इसकी आवश्यकता है तो आप उस चेक को जोड़ सकते हैं।

2
s = '12.32' 
if s.replace('.', '').replace('-', '').isdigit(): 
    print(float(s)) 

ध्यान दें कि यह नकारात्मक float एस के लिए भी काम करेगा। dan04 के जवाब पर

3

भवन:

def isDigit(x): 
    try: 
     float(x) 
     return True 
    except ValueError: 
     return False 

उपयोग:

isDigit(3)  # True 
isDigit(3.1) # True 
isDigit("3") # True 
isDigit("3.1") # True 
isDigit("hi") # False 
संबंधित मुद्दे