What is the best way to validate an input as a currency (without any currency symbols) My val开发者_JAVA技巧id inputs can be only in the form of 40 or 40.12
How about simply using format()
and try/except for wrong values?
>>> "{:.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'
Note that it simply cuts any number behind the second number behind the decimal point. You should be more specific by showing us more examples with your desired behaviour.
You could use a regular expression:
re.match(r'\d+(?:[.]\d{2})?$', '40.12')
This returns a match object if the input is correct, or None
if it isn't.
The above regex matches one or more digits optionally followed by a dot and exactly two more digits. This can be tweaked as required if I didn't capture your requirements precisely (the problem statement is somewhat open to interpretation).
I've been googling about an hour for proper way on how to do this. I haven't found any really good and safe way, and wrote regular expression below to match positive non-zero number with optional 1-2 digits after dot-separator:
re.match(r'^[1-9]\d*(\.\d{1,2})?$', val)
^
and$
: without matching whole string there will be ways to fooling up the regex.[1-9]
: first character always should be from 1 to 9\d*
: after first digit any amount of digits allowed(\.\d{1,2})?
: optional 1-2 digit fraction with dot-separator. Use[\.\,]
instead of\.
if multiple separator support is needed
精彩评论