将输入验证为货币(没有任何货币符号)的最佳方法是什么? 我的有效输入只能是40或40.12
的形式答案 0 :(得分:6)
如何简单地使用format()
并尝试/除错值?
>>> "{:.2f}".format(float("40.12"))
'40.12'
>>> "{:.2f}".format(float("40"))
'40.00'
>>> "{:.2f}".format(float("40.123"))
'40.12'
>>> try:
... "{:.2f}".format(float("40.123€"))
... except ValueError:
... "fail"
...
'fail'
请注意,它只是删除小数点后面第二个数字后面的任何数字。 你应该通过向我们展示你想要的行为的更多例子来更具体。
答案 1 :(得分:3)
您可以使用正则表达式:
re.match(r'\d+(?:[.]\d{2})?$', '40.12')
如果输入正确,则返回匹配对象;如果不是,则返回None
。
上述正则表达式匹配一个或多个数字,可选地后跟一个点和正好两个数字。如果我没有准确地捕捉你的要求,这可以根据需要进行调整(问题陈述对解释有点开放)。
答案 2 :(得分:0)
我一直在谷歌搜索大约一个小时,以正确的方式如何做到这一点。我还没有找到任何真正好的和安全的方法,并在下面写了正则表达式,以便在点分隔符后匹配正的非零数字和可选的1-2位数字:
re.match(r'^[1-9]\d*(\.\d{1,2})?$', val)
^
和$
:如果没有匹配整个字符串,就会有办法搞砸正则表达式。[1-9]
:第一个字符应始终为1到9 \d*
:在第一位数后允许任意数量的数字(\.\d{1,2})?
:带点分隔符的可选1-2位数分数。如果需要多个分隔符支持,请使用[\.\,]
代替\.