Check if string is a real number [duplicate]
Is there a quick way to find if a string is a real number, short of reading it a character at a time and doing isdigit()
on each character? I want to be able to test floating point numbers, for example 0.03001
.
If you mean an float as a real number this should work:
def isfloat(str):
try:
float(str)
except ValueError:
return False
return True
Note that this will internally still loop your string, but this is inevitable.
>>> a = "12345" # good number
>>> int(a)
12345
>>> b = "12345G" # bad number
>>> int(b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '12345G'
You can do that:
def isNumber(s):
try:
int(s)
except ValueError:
return False
return True
If you want a float number, replace int
by float
(thanks to @cobbal).
There is also another way using regular expression:
import re
def is_float(str):
if re.match(r"\d+\.*\d*", str):
return True
else:
return False
There is a more precise regexp of the real numbers:
"^[-+]?[0-9]*\.?[0-9]+(e[-+]?[0-9]+)?$"
And some check for this regexp:
realnum=re.compile("^[-+]?[0-9]*\.?[0-9]+(e[-+]?[0-9]+)?$")
["yes" if realnum.match(test) else "no" for test in ["12", "+12", "-12", "-3.14", ".314e1", "+.01e-12", "+22.134e+2"]]
['yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes']
["yes" if realnum.match(test) else "no" for test in ["..12", "+-12", "-12.", "-3.14p", ".314e1.9", "+. 01e-12", "+22.134e"]]
['no', 'no', 'no', 'no', 'no', 'no', 'no']
Method to verify real number:
def verify_real_number(item):
""" Method to find if an 'item'is real number"""
item = str(item).strip()
if not(item):
return False
elif(item.isdigit()):
return True
elif re.match(r"\d+\.*\d*", item) or re.match(r"-\d+\.*\d*", item):
return True
else:
return False
Defining a function to do this is the right approach, although it's a shame that Python does not already provide such a function.
I'm not a fan of using try ... except for this, because it was drilled into me that "exceptions are for exceptional circumstances", and not for control flow.
A one-line solution (if you ever want it, although it is less efficient, except for the regex answers) is
lambda x: all(n < 2 and i.isdigit() for n, i in enumerate(x.split('.')))
If you are going to encounter decimals written as 1.
or .01
, then simply add a length check
lambda x: all(n < 2 and (i.isdigit() or len(i) == 0) for n, i in enumerate(x.split('.')))
if you wanna check both integer and float numbers, you can check this out
def isDigit(str):
try:
int(str) or float(str)
except ValueError:
return False
return True
精彩评论