如何在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