187

我希望使用 Python 将 188518982.18 等数字格式化为 188,518,982.18 英镑。

我怎样才能做到这一点?

4

15 回答 15

252

请参阅语言环境模块。

这会进行货币(和日期)格式化。

>>> import locale
>>> locale.setlocale( locale.LC_ALL, '' )
'English_United States.1252'
>>> locale.currency( 188518982.18 )
'$188518982.18'
>>> locale.currency( 188518982.18, grouping=True )
'$188,518,982.18'
于 2008-11-26T14:50:59.287 回答
106

2.7 中的新功能

>>> '{:20,.2f}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'

http://docs.python.org/dev/whatsnew/2.7.html#pep-0378

于 2010-08-03T05:20:21.993 回答
56

不太清楚为什么它没有在网上(或在这个线程上)被更多地提及,但是来自 Edgewall 家伙的Babel包(和 Django 实用程序)对于货币格式化(以及许多其他 i18n 任务)来说非常棒。这很好,因为它不需要像核心 Python 语言环境模块那样在全局范围内执行所有操作。

OP给出的例子只是:

>>> import babel.numbers
>>> import decimal
>>> babel.numbers.format_currency( decimal.Decimal( "188518982.18" ), "GBP" )
£188,518,982.18
于 2012-01-13T13:17:00.440 回答
45

这是一篇古老的帖子,但我刚刚实施了以下解决方案:

  • 不需要外部模块
  • 不需要创建新功能
  • 可以在线完成
  • 处理多个变量
  • 处理负美元金额

代码:

num1 = 4153.53
num2 = -23159.398598

print 'This: ${:0,.0f} and this: ${:0,.2f}'.format(num1, num2).replace('$-','-$')

输出:

This: $4,154 and this: -$23,159.40

而对于原始海报,显然,只需切换$£

于 2017-03-12T21:49:31.907 回答
21

"{:0,.2f}".format(float(your_numeric_value))在 Python 3 中完成这项工作;它给出了类似于以下几行之一的内容:

10,938.29
10,899.00
10,898.99
2,328.99
于 2019-08-04T16:59:32.977 回答
16

我的语言环境设置似乎不完整,所以我也超越了这个 SO 答案并发现:

http://docs.python.org/library/decimal.html#recipes

独立于操作系统

只是想在这里分享。

于 2009-07-04T16:41:31.043 回答
9

如果您使用的是 OSX 并且尚未设置您的语言环境模块设置,则此第一个答案将不起作用,您将收到以下错误:

Traceback (most recent call last):File "<stdin>", line 1, in <module> File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/locale.py", line 221, in currency
raise ValueError("Currency formatting is not possible using "ValueError: Currency formatting is not possible using the 'C' locale.

要解决此问题,您必须使用以下方法:

locale.setlocale(locale.LC_ALL, 'en_US')
于 2010-10-05T17:08:55.250 回答
7

如果我是你,我会使用 BABEL:http ://babel.pocoo.org/en/latest/index.html

from babel.numbers import format_decimal


format_decimal(188518982.18, locale='en_US')
于 2018-02-22T22:14:13.447 回答
3

哦,那是一只有趣的野兽。

我花了相当多的时间来做到这一点,有三个主要问题因地区而异: - 货币符号和方向 - 千位分隔符 - 小数点

我已经编写了自己的相当广泛的实现,它是 kiwi python 框架的一部分,请在此处查看 LGPL:ed 源代码:

http://svn.async.com.br/cgi-bin/viewvc.cgi/kiwi/trunk/kiwi/currency.py?view=markup

该代码略微特定于 Linux/Glibc,但在 Windows 或其他 unix 上采用应该不会太难。

安装完成后,您可以执行以下操作:

>>> from kiwi.datatypes import currency
>>> v = currency('10.5').format()

然后会给你:

'$10.50'

或者

'10,50 kr'

取决于当前选择的语言环境。

这篇文章相对于另一篇文章的主要观点是它将适用于旧版本的 python。locale.currency 是在 python 2.5 中引入的。

于 2008-11-26T15:06:36.620 回答
2

#以类似“9,348.237”的格式打印变量“总计:”

print ('Total:',   '{:7,.3f}'.format(zum1))

其中 '{:7,.3f}' 是在这种情况下格式化数字的空格数是一百万,带 3 个小数点。然后添加'.format(zum1)。zum1 是我的特定程序中所有数字的总和的大数字。变量可以是您决定使用的任何内容。

于 2016-11-21T17:16:28.297 回答
2

这里已经有十几种解决方案,但我相信下面的一个是最好的,因为:

  • 很简单
  • 遵守操作系统区域设置
  • 不需要外部库
  • 你可以让它简洁

使用语言环境currency

import locale
# this sets locale to the current Operating System value
locale.setlocale(locale.LC_ALL, '') 
print(locale.currency(1346896.67444, grouping=True, symbol=True)

将在我配置为巴西葡萄牙语的 Windows 10 中输出:

R$ 1.346.896,67

它有点冗长,所以如果你会经常使用它,也许最好预先定义一些参数并有一个更短的名称并在 f-string 中使用它:

fmt = lambda x: locale.currency(x, grouping=True, symbol=True)
print(f"Value: {fmt(1346896.67444)}"

您可以为该setlocale方法传递一个语言环境值,但它的值取决于操作系统,所以要小心。如果您在 *nix 服务器中,您还需要检查语言环境是否正确安装在操作系统中。

您也可以关闭符号传递symbol=False

于 2021-05-12T19:56:42.187 回答
1

受上面代码的启发:D

def money_format(value):
    value = str(value).split('.')
    money = ''
    count = 1

    for digit in value[0][::-1]:
        if count != 3:
            money += digit
            count += 1
        else:
            money += f'{digit},'
            count = 1

    if len(value) == 1:
        money = ('$' + money[::-1]).replace('$-','-$')
    else:
        money = ('$' + money[::-1] + '.' + value[1]).replace('$-','-$')

    return money
于 2020-06-25T14:27:28.757 回答
0

我来看看同样的东西,发现python-money还没有真正使用它,但也许两者的混合会很好

于 2009-06-04T12:16:00.503 回答
0

一个用于在函数内部计算它的 lambda,在@Nate 的回答的帮助下

converter = lambda amount, currency: "%s%s%s" %(
    "-" if amount < 0 else "", 
    currency, 
    ('{:%d,.2f}'%(len(str(amount))+3)).format(abs(amount)).lstrip())

进而,

>>> converter(123132132.13, "$")
'$123,132,132.13'

>>> converter(-123132132.13, "$")
'-$123,132,132.13'
于 2014-11-06T04:18:24.170 回答
0

简单的python代码!

def format_us_currency(value):
    value=str(value)
    if value.count(',')==0:
        b,n,v='',1,value
        value=value[:value.rfind('.')]
        for i in value[::-1]:
            b=','+i+b if n==3 else i+b
            n=1 if n==3 else n+1
        b=b[1:] if b[0]==',' else b
        value=b+v[v.rfind('.'):]
    return '$'+(value.rstrip('0').rstrip('.') if '.' in value else value)
于 2019-04-08T12:41:06.347 回答