检查字符串是否可以转换为浮点数在Python中

302 投票
24 回答
552093 浏览
提问于 2025-04-15 11:06

我有一些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"

撰写回答