检查字符串是否可以在 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 块中,看看它是否成功,如 本问题 所述。

有人有其他想法吗?关于分区和 try/catch 方法的相对优点的意见?

原文由 Chris Upchurch 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 936
2 个回答

我只会用..

 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"

原文由 dbr 发布,翻译遵循 CC BY-SA 4.0 许可协议

检查浮点数的 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 版本: How do I parse a string to a float or int?

始终进行单元测试。什么是浮动和不是浮动可能会让您大吃一惊:

 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

像这样下沉异常是不好的,因为杀死金丝雀是不好的,因为 float 方法可能因用户输入以外的原因而失败。不要在生命攸关的软件上使用这样的代码。此外,python 一直在更改其关于哪些 unicode 字符串可以提升为浮动的合同,因此预计此代码的这种行为会在主要版本更新时发生变化。

原文由 Eric Leschinski 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题