如何在 Python 中将字符串转换为浮点或整数
-
在 Python 中通过
float()
将字符串转换为浮点数 -
在 Python 中通过
int()
将字符串转换为 int -
在 Python 中通过
ast.literal_eval
将字符串转换为float
或int
-
在 Python 中将字符串转换为浮点数时地本地化和逗号
,
情况 -
在 Python 中将字符串转换为
float
或int
的不同方法的性能比较
本教程文章将介绍如何在 Python 中将字符串转换为浮点数 float()
或整数 int()
。
在 Python 中通过 float()
将字符串转换为浮点数
float()
将字符串转换为 float
数字,如果可能的话。
>>> float('111.2222')
111.2222
>>> float('111.0')
111.0
>>> float('111')
111.0
在 Python 中通过 int()
将字符串转换为 int
int()
如果给定的字符串是整数的表示形式,则可以将字符串转换为整数。否则会引发 ValueError
。
>>> int('111')
111
>>> int('111.0')
Traceback (most recent call last):
File "<pyshell#43>", line 1, in <module>
int('111.0')
ValueError: invalid literal for int() with base 10: '111.0'
>>> int('111.22222')
Traceback (most recent call last):
File "<pyshell#45>", line 1, in <module>
int('111.22222')
ValueError: invalid literal for int() with base 10: '111.22222'
如果给定的字符串是浮点数的表示形式,float
则可以先将其转换为,然后再将其转换为 int
。
>>> int(float('111.0'))
111
在 Python 中通过 ast.literal_eval
将字符串转换为 float
或 int
ast.literal_eval(string)
安全地评估包含 Python 表达式的给定字符串。它可以将字符串自动地转换为 float
或 int
。
>>> ast.literal_eval('111.2222')
111.2222
>>> ast.literal_eval('111.0')
111.0
>>> ast.literal_eval('111')
111
在 Python 中将字符串转换为浮点数时地本地化和逗号 ,
情况
如果字符串表示形式中存在逗号 ,
,则 float
转换将引发 ValueError
异常。但是逗号是常规的用法,例如在美国或英国等国家/地区用作千位分隔符 111,111.22
,或者在大多数欧洲国家/地区用作小数点 111,222
。
>>> float('111,111.22')
Traceback (most recent call last):
File "<pyshell#54>", line 1, in <module>
float('111,111.22')
ValueError: could not convert string to float: '111,111.22'
>>> float('111,111')
Traceback (most recent call last):
File "<pyshell#55>", line 1, in <module>
float('111,111')
ValueError: could not convert string to float: '111,111'
应该使用 locale
模块来设置语言环境信息,然后 locale.atof()
函数可以根据语言环境设置将给定的字符串解析为浮点数。
在美国/英国,逗号作为千位分隔符
>>> import locale
>>> A = '111,111.222'
>>> locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.atof(A)
111111.222
>>> locale.atof('111,111')
111111.0
如果给出正确的语言环境设置,则逗号 ,
可以正确解释。
还应注意的是,即使给定的字符串表示形式是整数,转换结果也始终是 float
类型。
在欧洲国家,逗号作为小数点
>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'nl_NL')
'nl_NL'
>>> locale.atof('111,222')
111.222
>>> locale.atof('111.111,222')
111111.222
111,222
可以正确转换为 111.222
,111.111,222
也可以正确转换为 111111.222
,因为在荷兰等欧洲国家/地区,.
用作千位分隔符。
在 Python 中将字符串转换为 float
或 int
的不同方法的性能比较
我们 timeit
用来检查不同方法之间的性能表现。
>>> import timeint
>>> timeit.timeit('float(111.2222)', number=1000000)
0.14707240000007005
>>> timeit.timeit('ast.literal_eval("111.2222")', setup='import ast', number=1000000)
4.779956100000163
>>> timeit.timeit('locale.atof("111.2222")', setup='import locale; locale.setlocale(locale.LC_ALL, "en_US.UTF-8")', number=1000000)
6.092166299999917
ast.literal_eval()
方法比 float
方法慢得多。如果你只需要在 Python 中将字符串转换为 float
或 int
,则 ast.literal_eval()
不是首选。ast.literal_eval()
在此应用程序中属于过度设计,因为其主要目标应该是评估包含 Python 表达式的字符串。
locale.atof()
也非常慢,因此仅当在美国或英国的约定字符串中存在逗号时才使用它,或者点 .
表示千位分隔符,而逗号 ,
在欧洲国家中表示小数点。换句话说,locale.atof()
如果确实需要,才应使用它。
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn