检查字符串是否可以转换为浮点数在Python中
我有一些Python代码,它会遍历一个字符串列表,把这些字符串转换成整数或浮点数,如果可以的话。把字符串转换成整数其实挺简单的。
if element.isdigit():
newelement = int(element)
但是,转换成浮点数就比较复杂了。目前我使用 partition('.')
方法来分割字符串,并检查分割后的两边是否都是数字。
partition = element.partition('.')
if (partition[0].isdigit() and partition[1] == '.' and partition[2].isdigit())
or (partition[0] == '' and partition[1] == '.' and partition[2].isdigit())
or (partition[0].isdigit() and partition[1] == '.' and partition[2] == ''):
newelement = float(element)
这样做是可行的,但显然,这个if语句写起来有点麻烦。我考虑的另一种解决方案是把转换过程放在一个try/catch块里,看看能否成功,就像在这个问题中描述的那样。
有没有其他的想法?对使用partition和try/catch这两种方法的优缺点有什么看法吗?
24 个回答
68
'1.43'.replace('.','',1).isdigit()
这个函数只有在数字字符串中有一个或没有小数点('.')的时候,才会返回 true
。
'1.4.3'.replace('.','',1).isdigit()
这个函数会返回 false
。
'1.ww'.replace('.','',1).isdigit()
这个函数会返回 false
。
312
Python3 检查浮点数的方法:
def is_float(element: any) -> bool:
#If you expect None to be passed:
if element is None:
return False
try:
float(element)
return True
except ValueError:
return False
上面的 Python2 版本:如何将字符串解析为浮点数或整数?
一定要进行单元测试。什么是浮点数,什么不是,可能会让你感到意外:
Command to parse Is it a float? Comment
-------------------------------------- --------------- ------------
print(isfloat("")) False
print(isfloat("1234567")) True
print(isfloat("1_2_3.4")) True 123.4, underscores ignored
print(isfloat("NaN")) True nan is also float
print(isfloat("123.456")) True
print(isfloat("123.E4")) True
print(isfloat(".1")) True
print(isfloat("6.523537535629999e-07")) True
print(isfloat("6e777777")) True This is same as Inf
print(isfloat("-iNF")) True
print(isfloat("1.797693e+308")) True
print(isfloat("infinity")) True
print(isfloat("1,234")) False
print(isfloat("NULL")) False case insensitive
print(isfloat("NaNananana BATMAN")) False
print(isfloat(",1")) False
print(isfloat("123.EE4")) False
print(isfloat("infinity and BEYOND")) False
print(isfloat("12.34.56")) False Two dots not allowed.
print(isfloat("#56")) False
print(isfloat("56%")) False
print(isfloat("0E0")) True
print(isfloat("x86E0")) False
print(isfloat("86-5")) False
print(isfloat("True")) False Boolean is not a float.
print(isfloat(True)) True Boolean is a float
print(isfloat("+1e1^5")) False
print(isfloat("+1e1")) True
print(isfloat("+1e1.3")) False
print(isfloat("+1.3P1")) False
print(isfloat("-+1")) False
print(isfloat("(1)")) False brackets not interpreted
像这样忽略异常是很糟糕的,因为忽视警告是危险的,因为浮点数的方法可能因为其他原因而失败,而不仅仅是用户输入。不要在关键的生命安全软件中使用这样的代码。此外,Python 一直在改变它对 Unicode 字符串能否转换为浮点数的规定,所以在主要版本更新时,代码的行为可能会发生变化。
435
我会直接使用这个..
try:
float(element)
except ValueError:
print "Not a float"
..这样简单,而且有效。不过要注意,如果元素是比如说 1<<1024 的话,还是会出现 OverflowError 的错误。
另外一个选择是用正则表达式:
import re
if re.match(r'^-?\d+(?:\.\d+)$', element) is None:
print "Not float"