我有一个字符串,表示一个使用逗号分隔数千的数字。 如何将其转换为python中的数字?
>>> int("1,000,000")
生成ValueError。
在我尝试转换它之前,我可以用空字符串替换逗号,但不知何故感觉不对。 有没有更好的办法?
这感觉怎么样? 功能是有原因的。
import locale
locale.setlocale( locale.LC_ALL, 'en_US.UTF-8' )
locale.atoi('1,000,000')
# 1000000
locale.atof('1,000,000.53')
# 1000000.53
那些不适用的地方吗?
+1,但请添加区域设置(使用默认区域设置'C',这仍然会给出ValueError!)。
我认为大师的意思是这样的:locale.setlocale(locale.LC_ALL,'en_US.UTF-8')
感谢您的评论。我添加了一个特定的语言环境。
非常好。这样我就可以处理逗号和点也被切换的欧洲数字。谢谢。
我得到语言环境错误:Traceback (most recent call last): File"F:\test\locale_num.py", line 2, in locale.setlocale( locale.LC_ALL, 'en_US.UTF-8' ) File"F:\Python27\lib\locale.py", line 539, in setlocale return _setlocale(category, locale) locale.Error: unsupported locale setting
@TonyVeijalainen:在Linux上,您可以使用locale -a查找系统上可用的语言环境。对于Windows,请尝试这样的答案。
你在哪里发现它是'en_US.UTF-8'? (这是正确的 - 我只是想知道以供将来参考。)它没有出现在python.org网站的谷歌搜索中,也没有在语言环境文档页面上的任何列表:docs.python.org/2/ library / locale.html编辑:我看到你可以找到带有locale -a的语言环境...所以解释器从操作系统本身获取有关语言环境的信息?
@AmadeusDrZaius:在Linux上,语言环境由glibc提供。
有没有什么方法,类似于这个答案,将带逗号的字符串转换为小数?
@EliasZamaria:我认为没有内置函数,但您可以使用replace来删除逗号:decimal.Decimal('123,456.789'.replace(',',''))。
@unutbu,谢谢。我知道我能做到。我只是想知道是否有一种更简单的方式,类似于你的答案。
这对我不起作用,但这样做了 - stackoverflow.com/questions/48843193/
有几种方法可以用数千个分隔符来解析数字。我怀疑@unutbu所描述的方式在所有情况下都是最好的。这也是我列出其他方式的原因。
调用setlocale()的适当位置在__main__模块中。它是全局设置,会影响整个程序甚至C扩展(尽管注意LC_NUMERIC设置不是在系统级别设置,而是由Python模拟)。阅读文档中的注意事项并在这样做之前三思而后行。单个应用程序可能没问题,但从不在图书馆中为广大受众使用它。可能你应该避免使用某些特定的字符集编码来请求语言环境,因为它可能在某些系统上不可用。
使用第三方库之一进行国际化。例如,PyICU允许使用任何可用的语言环境而不影响整个过程(甚至使用特定的千位分隔符解析数字而不使用语言环境):
NumberFormat.createInstance(区域设置( 'EN_US'))。分析("百万")。getLong()
编写自己的解析函数,如果你没有安装第三方库来"正确"地执行它。当不需要严格验证时,它可以像int(data.replace(',', ''))一样简单。
+1推荐简单方法。当我遇到同样的问题时,这就是我所需要的。
编辑修复错字(setlocate应setlocale)。另外,+1。
无耻的自我推销,我确实使用了第三种选择。所以,如果有人有兴趣,请看看这个问题/答案
用空字符串替换逗号,并将结果字符串转换为int或float。
>>> a = '1,000,000'
>>> int(a.replace(',' , ''))
1000000
>>> float(a.replace(',' , ''))
1000000.0
请再次阅读OP问题。特别是在他说:"在我尝试转换它之前,我可以用空字符串替换逗号,但这种方法感觉不对。有更好的方法吗?"
我发现这个答案很有用,因为我的要求与OP几乎相同(将strs转换为int),但我很高兴有一种比接受的答案更简单的方法。
这有效:
(一种肮脏但快速的方式)
>>> a='-1,234,567,89.0123'
>>>"".join(a.split(","))
'-123456789.0123'
我从接受的答案中得到了语言环境错误,但以下更改在芬兰(Windows XP)中有效:
import locale
locale.setlocale( locale.LC_ALL, 'english_USA' )
print locale.atoi('1,000,000')
# 1000000
print locale.atof('1,000,000.53')
# 1000000.53
我试过这个。它有点超出了这个问题:
你得到一个输入。它将首先转换为字符串(如果它是一个列表,例如来自Beautiful soup);
然后到int,
然后漂浮。
它尽可能地得到它。在最坏的情况下,它返回未转换为字符串的所有内容。
def to_normal(soupCell):
''' converts a html cell from beautiful soup to text, then to int, then to float: as far as it gets.
US thousands separators are taken into account.
needs import locale'''
locale.setlocale( locale.LC_ALL, 'english_USA' )
output = unicode(soupCell.findAll(text=True)[0].string)
try:
return locale.atoi(output)
except ValueError:
try: return locale.atof(output)
except ValueError:
return output
#python3 tenzin
def changenum(data):
foo =""
for i in list(data):
if i ==",":
continue
else:
foo += i
return float(int(foo))
一些解释与该代码一起使用?一碗汤通常配汤匙
>>> import locale
>>> locale.setlocale(locale.LC_ALL,"")
'en_US.UTF-8'
>>> print locale.atoi('1,000,000')
1000000
>>> print locale.atof('1,000,000.53')
1000000.53
这是在美国的Linux上完成的。