Python中的货币格式


156

我想使用Python将类似188518982.18的数字格式化为188,518,982.18英镑。

我怎样才能做到这一点?


您在下面的@RailsS​​on注释中指出了一个很好的观点:您想打印£来显示特定的货币,但是使用日语显示来表示财务数字。我感到奇怪的是,您的请求尚未通过将locale模块对货币值的使用和该货币的显示属性分离开来而无法用该语言实现。
Droogans 2012年

Answers:


212

请参阅语言环境模块。

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

>>> 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'

15
如果我要为日语报告显示以英镑为单位的费用,我将如何正确格式化非本国货币?
SingleNegationElimination

2
@TokenMacGuy:这是一个技巧问题。日文报告表示日文逗号和小数点后的位置规则,但表示GB磅货币符号-Locale并不支持。您必须创建一个自定义的语言环境定义。
S.Lott

如果给定数为负,则返回“()”之间的值为什么?
panchicore

6
这仍然对我不起作用,但是我将其更改为locale.setlocale(locale.LC_ALL, 'en_US.UTF-8'),并且效果很好!
Furbeenator 2011年

2
@panchicore用括号表示的负数表示法在会计界很普遍。在oocalc或excel中尝试,然后将数字格式化为会计类型。
Droogans 2012年

94

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


6
这很简洁,但并不能真正回答问题,因为请求的解决方案将包含货币符号,并且您还在硬编码小数点后的位数,这是特定于语言环境的。如果您不只是想要逗号放置,还有更多的理由使用可接受的语言环境答案。
mrooney 2013年

6
@mrooney还有许多不使用接受的语言环境答案的原因,例如不导入整个模块。
2014年

1
@Josh,“来自区域设置导入货币”。
安德鲁H

5
@mrooney:您可以执行:'$ {:0,.2f}'。format(184467616.1),现在有了符号
triunenature

@triunenature $ 123,456.78有时会导致。编辑:markdown删除了多余的空格,假装$和数字之间还有更多内容
Cyber​​Jacob '16

48

不太确定为什么没有在网上(或在此主题中)提及更多,但是Babel Edgewall家伙包(和Django实用程序)对于货币格式(以及许多其他i18n任务)来说很棒。很好,因为它不需要像核心Python语言环境模块那样全局地做所有事情。

OP给出的示例仅是:

>>> import babel.numbers
>>> import decimal
>>> babel.numbers.format_currency( decimal.Decimal( "188518982.18" ), "GBP" )
£188,518,982.18

2
非常晚的注释:测试此货币后,它似乎并不会智能地格式化货币,因为它只是在金额之前粘贴了适当的符号(格式化为您所设置的语言环境,这是合理的),无论该货币是否实际使用其符号作为前缀。
kungphu 2015年

@kungphu是什么意思?参见babel.pocoo.org/en/latest/api/…–
朱利安

1
@Julian似乎可以使用to 的locale参数来format_currency解决这个问题,但是要么是四年前不在文档中(当我写此评论时),要么我只是按原样测试了此答案的代码,而没有检查文档。
kungphu

1
@kungphu Gotcha。昨天我可能一直没有留意这篇文章的年代。文档/功能更改似乎很有可能。干杯!
朱利安

32

这是一个古老的帖子,但是我只是实现了以下解决方案:

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

码:

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

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


我的格式需要一些自定义,但这没关系,因为我可以使用此解决方案来做到这一点。
DonkeyKong

9
好主意!使用Python 3.6和f字符串,它看起来更加美丽:print(f'Value is: ${value:,.2f}'.replace('$-', '-$'))
Timo Saloranta


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')

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

9

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

10,938.29
10,899.00
10,898.99
2,328.99

6

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

from babel.numbers import format_decimal


format_decimal(188518982.18, locale='en_US')

1
python语言环境模块对我不起作用(无论我设置了哪种语言环境,它都会抱怨),但是需要babel并使用此功能很好。值得一看的是API文档,因为这里有更多的参数和更有用的功能(例如对于currency:)format_currency
Daniel W.19年

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中引入。


它比locale.currency()有优势吗?
阿里·阿夫沙尔

@AliAfshar:一个优势是10,50 kr而不是kr 10,50
user2394284

2

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

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

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


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


0

在@Nate 答案的帮助下,用于在函数内部进行计算的lambda

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'

大多数国家/地区会在金额后使用货币符号,而不是相反。
乔纳斯·拜斯特伦(JonasByström)

@jonas也许这就是大多数国家/地区所做的事情,但是OP在金额之前就已经拥有了,因此我在答案中也有金额之前:)
mu无

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)

1
你的代码返回字符串喜欢"$2,129.1468284147656""$10,948.3742933""$1,0908"。使字符串乱码。
尤金(Eugene Gr)。Philippov

是的,我没有注意到。您也给了ans。
Vanjith,
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.