如果字符串中包含逗号作为千位分隔符,如何将其转换为数字?


83

我有一个字符串,代表一个使用逗号分隔数千个数字的数字。如何在python中将其转换为数字?

>>> int("1,000,000")

生成一个ValueError

在尝试进行转换之前,我可以将逗号替换为空字符串,但是感觉有点不对劲。有没有更好的办法?

Answers:


101
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

9
+1,但请添加语言环境设置(使用默认语言环境'C'仍会显示ValueError!)。
Alex Martelli,2009年

1
我认为专家的意思是这样的:locale.setlocale(locale.LC_ALL,'en_US.UTF-8')
mbarkhau,2009年

感谢您的评论。我添加了特定的语言环境。
unutbu

非常好。这样,我可以处理逗号和点也切换的欧洲数字。谢谢。
dsimard

5
我收到语言环境错误:Traceback (most recent call last): File "F:\test\locale_num.py", line 2, in <module> 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
Tony Veijalainen 2012年

39

有数千种分隔符可以解析数字。我怀疑@unutbu描述的方式在所有情况下都是最好的。这就是为什么我也列出其他方式。

  1. 正确的调用setlocale()位置在__main__模块中。它是全局设置,将影响整个程序甚至C扩展(尽管请注意,LC_NUMERIC设置不是在系统级别设置的,而是由Python模仿的)。阅读文档中的注意事项,然后再三思。在单个应用程序中可能还可以,但是永远不要在图书馆中使用它来吸引广大读者。可能应该避免使用某些特定的字符集编码请求语言环境,因为它在某些系统上可能不可用。

  2. 使用第三方库之一进行国际化。例如,PyICU允许使用影响整个过程的任何可用语言环境(甚至使用特定的数千个分隔符来解析数字,而无需使用语言环境):

    NumberFormat.createInstance(Locale('en_US'))。parse(“ 1,000,000”)。getLong()

  3. 如果您没有安装第三方库来“正确地进行”操作,请编写自己的解析函数。它可以像int(data.replace(',', ''))不需要严格验证时一样简单。


1
+1推荐简单的方法。当我遇到同样的问题时,这就是我所需要的。
Michael Kristofik

已编辑以修正错字(setlocate应为setlocale)。另外,+ 1。
马克·迪金森

无耻的自我推广,我确实使用了第三种选择。所以,如果有人有兴趣,看看这个问题/答案

13

用空字符串替换逗号,然后将结果字符串转换为intfloat

>>> a = '1,000,000'
>>> int(a.replace(',' , ''))
1000000
>>> float(a.replace(',' , ''))
1000000.0

21
请再次阅读OP问题。他特别指出:“在尝试进行转换之前,我可以用空字符串替换逗号,但是这感觉有些不对。是否有更好的方法?”
joaquin

1
鉴于我的要求与OP几乎相同(将str转换为int),因此我发现此答案很有用,但是很高兴有一种比公认的答案更简单的方法。

4

这有效:

(一种肮脏但快速的方法)

>>> a='-1,234,567,89.0123'
>>> "".join(a.split(","))
'-123456789.0123'

3

我从可接受的答案中收到了区域设置错误,但以下更改在芬兰(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

1

我试过了 它超出了问题:您得到了输入。它将首先转换为字符串(如果它是列表,例如,来自Beautiful soup)。然后是int,然后是float。

它尽其所能。在最坏的情况下,它会将所有未转换的内容返回为字符串。

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

0
>>> 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上完成的。


-1
#python3 tenzin
def changenum(data):
    foo = ""
    for i in list(data):
        if i == ",":
            continue
        else:
            foo += i
    return  float(int(foo))

2
该代码有一些解释吗?一碗汤通常与汤匙一起
食用
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.