检查输入是否为浮点数,小数点后面恰好有2个数字

时间:2014-04-26 05:51:19

标签: python validation

我正在处理一个需要我从用户那里获取浮点值的类项目。此浮点值必须在十进制后正好有两个数字才能成为有效输入。这是我到目前为止所做的。

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 % 10进行比较,排除以.00结尾的整数和浮点数,但我不确定如何将接受的输入限制为小数点后正好有2个数字的浮点数(iexxx)。另外我相信我需要接受像5.00一样的浮动,所以我的方法不会削减它。我已经尝试将cost转换为str并设置长度限制,但这仍然让它容易出错。有什么建议吗?

4 个答案:

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