如何在Python中检查字符串是否可以转换为float类型?

如何在Python中检查字符串是否可以转换为float类型?,python,floating-point,Python,Floating Point,是否有类似于str.isnumeric但适用于float的函数 '13.37'.isnumeric() #False 我仍然使用这个: def isFloat(string): try: float(string) return True except ValueError: return False 你的代码非常好。基于正则表达式的解决方案更容易出错 使用timeit快速测试显示float(str_val)确实比re.ma

是否有类似于
str.isnumeric
但适用于float的函数

'13.37'.isnumeric() #False  
我仍然使用这个:

def isFloat(string):
    try:
        float(string)
        return True
    except ValueError:
        return False

你的代码非常好。基于正则表达式的解决方案更容易出错

使用
timeit
快速测试显示
float(str_val)
确实比
re.match()快

上面使用的正则表达式在一个边缘情况下失败,它不能匹配
'-1.
,尽管
float()
会很高兴地将其转换为正确的浮点值。

如果您正在测试浮点变量,isinstance(myVariable,float)
将起作用


编辑:说得太快了,没有完全理解您想要得到的东西。

正如Imran所说,您的代码完全正确,如图所示

然而,它确实鼓励
isFloat
的客户走“三思而后行”的道路,而不是更通俗的“请求原谅比允许更容易”的道路

对于客户端来说,假设他们有一个表示浮点的字符串,但准备好处理将抛出的异常(如果不是),这更像是python

这种方法还有一个很好的副作用,就是将字符串转换为浮点一次,而不是两次。

不过有一个缺点:
float('nan')返回nan,未引发异常;)

更完整的概括:

    def strType(xstr):
        try:
            int(xstr)
            return 'int'
        except:
            try:
                float(xstr)
                return 'float'
            except:
                try:
                    complex(xstr)
                    return 'complex'
                except:
                    return 'str'


    print("4", strType("4"))
    print("12345678901234567890", strType("12345678901234567890"))
    print("4.1", strType("4.1"))
    print("4.1+3j", strType("4.1+3j"))
    print("a", strType("a"))

从@Imran的结果扩展:

>>> timeit('float("-1.1")', number=10000000)
1.365271806716919

>>> timeit(r"isfloat('-1.1')", """def isfloat(s): t = s.partition('.');
           return t[1] and t[0].isdigit() and (not t[2] or t[2].isdigit());""",
           number=10000000)
2.565232992172241

>>> timeit(r"pat.match('-1.1')", "import re; pat=re.compile(r'^-?\d*\.?\d+(
    ...: ?:[Ee]-?\d+)?$');", number=10000000)
3.258622169494629
我的
分区
解决方案比regex快得多,但比
浮点
慢得多;但是,它的优点是不会引起错误(因此您可以在理解中使用它)


这可以处理像
1.
这样的边缘条件,但不能处理像
NaN

这样的专业问题,这不是OP想要的。我想我记得很久以前在邮件列表上看到过关于这一点的帖子。要点是float()和regex的速度差不多,我认为这不是Python的方式——用6行代码来解决常见问题。但是,谢谢。使用re.compile将使regexp与float()的速度几乎相同。@Imran:您的性能比较不正确,虽然
float
会更快,但您需要在执行循环之外编译regex,为了使该方法实用,需要重新使用它。编译正则表达式的性能更差:P。这怎么可能呢?
timeit.timeit
中的
setup
语句只评估了一次,不是吗?+1:@pingvinus:请不要浪费时间写这样的东西。只需编写真正的应用程序。如果它抛出一个
ValueError
,这意味着输入不是有效的浮点值,总体异常处理程序可以报告这一点。不需要预先检查浮点值,因为
float
函数可以在需要时正确执行此操作。而且总是正确的。虽然我明白try-catch的意义,但我认为处理异常的花费“可能”很高。我很惊讶isfloat助手不可用,@S.Lott这不一定是真的。当您需要基于未知值做出决策时,对于这样的函数有很好的应用。这更具可读性。
nan
inf
(正数和负数)是浮点数,正如
1.e9
。。。所以这是一个更加一致和完整的答案:`def strType(xstr):try:int(xstr)返回'int'除了:try:float(xstr)返回'float'除了:try:complex(xstr)返回'complex'除了:返回'str'打印(“4”,strType(“4”))打印(“12345678901234567801234567890”,strType(“123456789090”))打印(“4.1”,strType(“4.1”))print(“4.1+3j”,strType(“4.1+3j”))print(“a”,strType(“a”)`13.37.替换(“.”,“”)。isnumeric():我喜欢@GrigoryIlizirov的答案,因为它不会调用异常。
>>> timeit('float("-1.1")', number=10000000)
1.365271806716919

>>> timeit(r"isfloat('-1.1')", """def isfloat(s): t = s.partition('.');
           return t[1] and t[0].isdigit() and (not t[2] or t[2].isdigit());""",
           number=10000000)
2.565232992172241

>>> timeit(r"pat.match('-1.1')", "import re; pat=re.compile(r'^-?\d*\.?\d+(
    ...: ?:[Ee]-?\d+)?$');", number=10000000)
3.258622169494629