2010-11-09 24 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? ') 

Điều này chỉ hoạt động nếu người dùng nhập integer, nhưng tôi muốn nó hoạt động ngay cả khi họ nhập float, nhưng không phải khi họ nhập string.Sử dụng isdigit cho phao nổi?

Vì vậy, người dùng sẽ có thể nhập cả hai 99.2, nhưng không phải abc.

Tôi nên làm như thế nào?

Trả lời

9

Sử dụng biểu thức thông thường.

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

rất linh hoạt! Tuy nhiên, giải pháp của dan04 cảm thấy nhiều hơn pythonic. Ở đây tôi định nghĩa pythonic là "giữa hai giải pháp phức tạp tương đương, thích cái không sử dụng cụm từ thông dụng." Điều đó vẫn còn nhiều ứng dụng cho các biểu thức thông thường. –

+0

@Steven Rumbalski: Vâng, giải pháp của dan04 có vẻ là Pythonic hơn, ý nghĩ của tôi có thể thực sự ít mã hơn. –

+0

Thật không may đây không phải là một regex tốt cho phao nổi và do đó không thực sự trả lời câu hỏi. Ví dụ: nó không khớp với ".1" nhưng DOES khớp với "5abc".Ngoài ra còn có các giá trị âm và các ký hiệu khác, vì vậy nó có lẽ là lý tưởng để sử dụng câu trả lời của dan04, biến nó thành một hàm nếu bạn cần sử dụng nó trong một danh sách hiểu hoặc đối số. – mrooney

25

EAFP

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

EAFP = Dễ Yêu cầu tha thứ hơn Permission (xem http://docs.python.org/glossary.html) –

+0

@Steven Rumbaski Mặc dù tôi thích hình thức: "Nó dễ dàng hơn để cầu xin sự tha thứ hơn xin phép" :-) –

+0

Được rồi, vậy cũng có cách đơn giản để kiểm tra để đảm bảo người dùng không nhập giá trị âm? –

2

Tôi nghĩ @ dan04 có cách tiếp cận đúng (EAFP), nhưng tiếc là thế giới thực thường là một trường hợp đặc biệt và một số mã bổ sung là thực sự cần thiết để quản lý điều-so dưới đây là một phức tạp hơn, mà còn là một chút thực dụng hơn (và thực tế):

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

mẫu sử dụng:

> 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

những câu trả lời hiện tại là chính xác ở chỗ cách Pythonic hơn thường để try...except là (i. e. EAFP).

Tuy nhiên, nếu bạn thực sự muốn thực hiện xác thực, bạn có thể xóa chính xác 1 dấu thập phân trước khi sử dụng isdigit().

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

Lưu ý rằng điều này không xử lý bất kỳ phần mềm nào khác với int. Bạn có thể thêm kiểm tra đó nếu bạn thực sự cần nó mặc dù.

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

Lưu ý rằng thao tác này cũng sẽ hoạt động đối với âm float.

3

Xây dựng về câu trả lời của dan04:

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

sử dụng:

isDigit(3)  # True 
isDigit(3.1) # True 
isDigit("3") # True 
isDigit("3.1") # True 
isDigit("hi") # False 
Các vấn đề liên quan