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

时间:2009-11-22 17:10:49

标签: python

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

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

生成ValueError

在我尝试转换之前,我可以用空字符串替换逗号,但不知何故感觉不对。还有更好的方法吗?

8 个答案:

答案 0 :(得分:90)

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 :(得分:32)

有几种方法可以用千位分隔符解析数字。我怀疑@unutbu所描述的方式在所有情况下都是最好的。这也是我列出其他方式的原因。

  1. 调用setlocale()的正确位置在__main__模块中。它是全局设置,会影响整个程序甚至C扩展(尽管注意LC_NUMERIC设置不是在系统级别设置,而是由Python模拟)。阅读caveats in documentation并在采取这种方式之前三思而后行。单个应用程序可能没问题,但从不在图书馆中为广大受众使用它。可能你应该避免使用某些特定的字符集编码来请求语言环境,因为它可能在某些系统上不可用。

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

    NumberFormat.createInstance(区域设置( 'EN_US'))。分析( “百万”)。getLong()

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

答案 2 :(得分:12)

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

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

答案 3 :(得分:5)

这有效:

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

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

答案 4 :(得分: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

答案 5 :(得分:1)

我试过这个。它有点超出了这个问题: 你得到一个输入。它将首先转换为字符串(如果它是一个列表,例如来自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

答案 6 :(得分: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上完成的。

答案 7 :(得分:0)

SHELL = CMD