Python:将输入限制为带小数位的数字和数字

时间:2015-05-04 16:03:29

标签: python python-3.x

如何将输入限制为只有两位小数的整数或数字,否则(字母或其他符号)它将显示“无效”并允许用户再次输入。

代码:

counter = 100
income = input("Enter income: ")

while counter >0:
    try:
       val = int(income)
       print ("YES")
       income = input("Enter money: ")
       counter = counter - 1
    except ValueError:
       print("NO")
       income = input("Enter money: ")
       counter = counter - 1

我从另一个问题中取得了val = int(???),如果仅限于整数输入,它就有效,因为我的程序涉及金钱,我需要它才能达到两位小数,但它不接受小数点。 (该计数器仅供我测试程序)

4 个答案:

答案 0 :(得分:1)

您可以定义自己的input功能

def input_number(msg):
    while True:
        try:
            res = round(float(input(msg)), 2)
            break
        except:
            print("Invalid")
    return res

income = input_number("Enter money:\n")

答案 1 :(得分:1)

您可以使用regexp:

import re
is_number=re.compile('^\d+\.?\d{,2}$')

>>>is_number.match('3.14') is not None
True
>>>is_number.match('32222') is not None
True
>>> is_number.match('32A') is not None
False
>>> is_number.match('3.1445') is not None
False

答案 2 :(得分:1)

在我看来,你需要一个正则表达式来表示你需要的功能,特别是确保小数点后面正好两位数,同时使其成为可选项。

我把收入强加为便士或美分。这是因为您可能会使用float来解决问题。

import re

# income as pence/cents
income = None

while income is None:
    instr = input("Enter money: ")
    m = re.fullmatch(r'(\d+)(?:\.(\d{2}))?', instr)
    if m:
        full, cents =  m.groups()
        if cents == '' or cents is None: 
            cents = '0'
        income = (int(full) * 100) + int(cents)
    else:
        print("NO")

print("Income is %d.%02d" % (income/100, income % 100))

答案 3 :(得分:1)

由于对模式有这么多限制,我真的认为正则表达式更具说明性和可读性。

import re 
NUM_REGEX = re.compile(r"^\d+(?:\.\d{,2})?$")

input_str = input("give me a number") 

while NUM_REGEX.match(input_str) is None:
    input_str = input("Nope, not valid. Give me another.")

return float(input_str)