Python中的货币格式

Posted

技术标签:

【中文标题】Python中的货币格式【英文标题】:Currency formatting in Python 【发布时间】:2010-09-24 04:05:46 【问题描述】:

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

我该怎么做?

【问题讨论】:

您在下面的评论中提出了一个很好的观点,@RailsS​​on:您想要打印 £s 以显示特定货币,但使用该显示使用日语表达式来表示财务数字。我觉得奇怪的是,您的请求没有通过将locale 模块对货币值的使用和该货币的显示属性解耦来实现。 【参考方案1】:

请参阅locale 模块。

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

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

【讨论】:

如何正确格式化非本地货币,假设我以 GB 为单位显示日语报告的成本? @TokenMacGuy:这是一个技巧问题。日文报告表示日文逗号和小数位规则,但 GB 英镑货币符号 - 语言环境并不支持。您必须创建自定义的语言环境定义。 if giver number 为负数返回"()"之间的值,为什么? 这仍然对我不起作用,但我将其更改为 locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') 并且效果很好! @panchicore 括号中的负数表示法是会计界的常见做法。在 oocalc 或 excel 中尝试,并将数字格式化为会计类型。【参考方案2】:

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

我花了相当长的时间来解决这个问题,不同地区之间存在三个不同的主要问题: - 货币符号和方向 - 千位分隔符 - 小数点

我已经编写了自己的相当广泛的实现,它是 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【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

独立于操作系统

只是想在这里分享。

【讨论】:

但是我们在哪里称呼def moneyfmt(value, places=2, curr='', sep=',', dp='.', pos='', neg='-', trailneg='')【参考方案5】:

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

【讨论】:

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

如果您使用的是 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')

【讨论】:

locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') 对我有用【参考方案7】:

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

OP 给出的例子就是:

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

【讨论】:

很晚的注意:测试这个,它似乎没有智能地格式化货币,因为它只是在金额之前贴上适当的符号(格式化为您设置的区域设置,这是合理的),无论该货币是否实际使用其符号作为前缀。 @kungphu 你是什么意思?见babel.pocoo.org/en/latest/api/… @Julian 看起来 format_currencylocale 参数可以用来解决这个问题,但是四年前的文档中没有(当我写那条评论时)或者我刚刚测试了这个答案的代码,没有检查文档。 @kungphu Gotcha。我昨天一定没注意这个帖子的年龄。文档/功能更改似乎很有可能。干杯!【参考方案8】:

在函数内部计算它的 lambda,在 @Nate's answer 的帮助下

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'

【讨论】:

大多数国家/地区在金额后使用货币符号,而不是相反。 @jonas 也许这就是大多数国家所做的,但 OP 在金额之前有它,因此我在我的答案中也有它:)【参考方案9】:

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

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

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

【讨论】:

【参考方案10】:

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

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

代码:

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

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

【讨论】:

我的格式需要一些自定义,但这没关系,因为我能够使用此解决方案做到这一点。 好主意!使用 Python 3.6 和 f-strings,它看起来更漂亮:print(f'Value is: $value:,.2f'.replace('$-', '-$'))【参考方案11】:

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

from babel.numbers import format_decimal


format_decimal(188518982.18, locale='en_US')

【讨论】:

python 语言环境模块对我不起作用(无论我设置什么语言环境,它都会抱怨)但需要 babel 并使用此功能很好。值得一看 API 文档,因为有更多参数和更有用的功能(例如货币:format_currency)。【参考方案12】:

简单的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)

【讨论】:

您的代码返回类似"$2,129.1468284147656""$10,948.3742933""$1,0908" 的字符串。乱码字符串。 是的,我没有注意到。你也给出了答案。【参考方案13】:

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

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

【讨论】:

【参考方案14】:

受上面代码的启发: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

【讨论】:

【参考方案15】:

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

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

使用语言环境currency:

import locale
locale.setlocale(locale.LC_ALL, '') # this sets locale to the current Operating System value
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 方法传递一个语言环境,但它的值取决于操作系统,所以要小心。您也可以关闭该符号。

【讨论】:

以上是关于Python中的货币格式的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript中的货币格式[重复]

Oracle 中的自动格式化货币字段

如何使用 thymeleaf 格式化 HTML5 中的货币

如何处理文本字段中的格式化数字(货币)?

如何使用 Aspose 维护或强制 PDF 中的货币格式

使用 Angular 2 最新版本的 ag-grid 中的货币格式