Python中的货币格式

Rai*_*Son 140 python formatting currency

我想用Python将188518982.18这样的数字格式化为188,518,982.18英镑.

我怎样才能做到这一点?

S.L*_*ott 191

请参阅区域设置模块.

这样做了货币(和日期)格式.

>>> 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'
Run Code Online (Sandbox Code Playgroud)

  • 我如何正确地格式化非本地货币,说我显示日语报告的成本(以GB为单位)? (14认同)
  • 这仍然不适合我,但我把它改为`locale.setlocale(locale.LC_ALL,'en_US.UTF-8')`它完美无缺! (5认同)
  • @TokenMacGuy:这是一个特技问题.日语报告表示日语逗号和小数位规则,但GB磅货币符号 - Locale不支持.您必须创建自定义的区域设置定义. (2认同)
  • @panchicore括号表示的负数表示法是会计界的常见做法.在oocalc或excel中尝试,并将数字格式化为会计类型. (2认同)

nat*_*e c 89

2.7的新功能

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

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

  • 这很整洁,但并没有真正回答这个问题,因为所请求的解决方案将包含货币符号,并且您还对小数点后的位数进行硬编码,这是特定于区域设置的.如果您不只是想要逗号放置,则有更多理由使用接受的区域设置答案. (6认同)
  • @mrooney还有很多理由不使用接受的语言环境答案,例如不导入整个模块. (6认同)
  • @mrooney:你可以这样做:'$ {:0,.2f}'.format(184467616.1),你现在有了这个符号 (5认同)
  • @triunenature 有时会导致“$ 123,456.78”。编辑:markdown 去掉了多余的空格,假装 $ 和数字之间有更多空格 (2认同)

gle*_*enc 40

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

OP给出的例子就是:

>>> import babel.numbers
>>> import decimal
>>> babel.numbers.format_currency( decimal.Decimal( "188518982.18" ), "GBP" )
£188,518,982.18
Run Code Online (Sandbox Code Playgroud)

  • 很晚的注意事项:测试一下,它似乎不会智能地格式化货币,因为它只是在金额之前粘贴适当的符号(格式化为您设置的区域,这是合理的),无论该货币是否实际使用其符号作为前缀. (2认同)

elP*_*tor 25

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

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

码:

num1 = 4153.53
num2 = -23159.398598

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

输出:

This: $4,154 and this: -$23,159.40
Run Code Online (Sandbox Code Playgroud)

而对于原来的海报,很明显,只要切换$£

  • 好主意!使用Python 3.6和f字符串,它看起来更加漂亮:`print(f'Value is:$ {value:,。2f}'。replace('$-','-$'))` (5认同)

Eug*_*pov 18

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

10,938.29
10,899.00
10,898.99
2,328.99
Run Code Online (Sandbox Code Playgroud)


use*_*986 16

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

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

独立操作系统

只是想在这里分享.


nev*_*ves 10

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

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

我的解决方案是使用locale.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)
Run Code Online (Sandbox Code Playgroud)

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

R$ 1.346.896,67
Run Code Online (Sandbox Code Playgroud)

它有点冗长,所以如果您经常使用它,也许最好预定义一些参数并使用较短的名称并在 f 字符串内使用它:

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

您可以传递该方法的区域设置值setlocale,但其值取决于操作系统,因此请注意。如果您使用的是 *nix 服务器,您还需要检查操作系统中是否正确安装了所需的语言环境。

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


sim*_*oes 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.
Run Code Online (Sandbox Code Playgroud)

要解决此问题,您必须使用以下内容:

locale.setlocale(locale.LC_ALL, 'en_US')
Run Code Online (Sandbox Code Playgroud)

  • locale.setlocale(locale.LC_ALL,'en_US.UTF-8')对我有用 (2认同)

小智 7

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

from babel.numbers import format_decimal


format_decimal(188518982.18, locale='en_US')
Run Code Online (Sandbox Code Playgroud)