我正在处理一个需要我从用户那里获取浮点值的类项目。此浮点值必须在十进制后正好有两个数字才能成为有效输入。这是我到目前为止所做的。
while True:
try:
cost = float(input("Enter the price: "))
if cost % 1 == 0:
print("Invalid input for price.")
else:
if cost > 0:
return cost
except ValueError:
print("Invalid input for price.")
将cost % 1
与0
进行比较,排除以.00结尾的整数和浮点数,但我不确定如何将接受的输入限制为小数点后正好有2个数字的浮点数(iexxx)。另外我相信我需要接受像5.00一样的浮动,所以我的方法不会削减它。我已经尝试将cost
转换为str并设置长度限制,但这仍然让它容易出错。有什么建议吗?
答案 0 :(得分:6)
您可以在转换为float之前检查它:
cost = input("Enter the price: ")
if len(cost.rsplit('.')[-1]) == 2:
print('2 digits after decimal point')
答案 1 :(得分:1)
使用此代码:
>>> while True:
... try:
... x = float(raw_input('Enter the price: '))
... y = str(x).split('.')
... if len(y[-1]) != 2:
... raise ValueError
... except ValueError:
... print 'Please try again!'
... pass
...
Enter the price: hello
Please try again!
Enter the price: 5.6
Please try again!
Enter the price: 5.67
Enter the price: 7.65
Enter the price: 7
Please try again!
Enter the price:
它将输入作为float
,如果用户未输入数值,则默认情况下会引发ValueError
。如果它没有,那么我们使用str(x)
获取价格的字符串值,并将其分配给y
,我们将其除以小数位。然后我们可以检查列表中的最后一个值(yx
中的$x.yz
)是否有一个不等于2的长度。如果是,请提出ValueError
。
答案 2 :(得分:0)
为什么要这么复杂?
cost = raw_input('Enter the price: ')
if len(cost[cost.rfind('.')+1:]) != 2:
raise ValueError('Must have two numbers after decimal point')
try:
cost = float(cost)
except ValueError:
print('Please enter a valid number')
答案 3 :(得分:0)
使用 raw_input()代替 input()。这样更安全(不使用eval)并返回用户输入的实际字符串。
然后用正则表达式检查字符串。
>>> import re
>>> s = raw_input('Enter a price: ')
Enter a price: 3.14
>>> if not re.match(r'[0-9]*\.[0-9]{2}', s):
print 'Not a valid price'
>>> price = float(s)