如果使用Python将string转换为数字(如果它包含千位分隔符的逗号)?
我有一个string表示一个使用逗号分隔数千的数字。 我如何将其转换为Python中的数字?
>>> int("1,000,000")
生成一个ValueError
。
在我尝试转换之前,我可以用空string来replace逗号,但是感觉不对。 有没有更好的办法?
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
有几种方法可以用数千个分隔符来parsing数字。 我怀疑〜Ubuntu所描述的方式在所有情况下都是最好的。 这就是我列出其他方式的原因。
-
调用
setlocale()
的适当位置在__main__
模块中。 这是全局设置,将影响整个程序甚至C扩展(尽pipe注意LC_NUMERIC设置不是在系统级设置,而是由Python模拟)。 阅读文档中的警告,并在这样做之前三思。 在单一的应用程序中可能是确定的,但是不要在库中用于广泛的用户。 可能你应该避免请求一些特定的字符集编码的区域设置,因为它可能在某些系统上不可用。 -
使用第三方库进行国际化。 例如, PyICU允许使用任何可用的语言环境,而不影响整个过程(甚至不使用区域设置来parsing具有特定数千个分隔符的数字):
NumberFormat.createInstance(区域设置( 'EN_US'))。分析( “百万”)。getLong()
-
编写你自己的parsing函数,如果你没有安装第三方库来做“正确的方法”。 当不需要严格validation时
int(data.replace(',', ''))
它可以像int(data.replace(',', ''))
一样简单。
用空stringreplace逗号,并将结果string变成int
或float
。
>>> a = '1,000,000' >>> int(a.replace(',' , '')) 1000000 >>> float(a.replace(',' , '')) 1000000.0
我从接受的答案中得到了语言环境错误,但在芬兰(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
这工作:
(一个肮脏但快速的方式)
>>> a='-1,234,567,89.0123' >>> "".join(a.split(",")) '-123456789.0123'
我试过这个。 它超出了这个问题:你得到一个input。 它将首先转换为string(如果它是一个列表,例如美丽的汤); 然后int,然后浮动。
它尽可能地得到。 在最坏的情况下,它返回所有未转换的string。
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
>>> 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上完成的。 -Suresh
#python3 tenzin def changenum(data): foo = "" for i in list(data): if i == ",": continue else: foo += i return float(int(foo))