我正在尝试将浮点格式化为逗号分隔的货币。例如。 543921.9354
变为$543,921.94
。我在Jinja模板中使用format
过滤器,它似乎模仿Python中的%
运算符而不是Python format
函数?
如何在Jinja中完成此格式化?是否可以使用format
过滤器?这就是我到目前为止所做的事情,除了逗号外,它还能完成所有事情:
"$%.2f"|format(543921.9354)
当然会产生
$543921.94
答案 0 :(得分:54)
更新:使用Jinja2和Python 3,这在模板中运行得非常好,无需定义任何自定义代码:
{{ "${:,.2f}".format(543921.9354) }}
我不确定依赖是什么让这项工作,但恕我直言,其他任何读这个答案的人都会好好至少尝试一下,然后再担心自定义过滤器。
答案 1 :(得分:45)
为此写一个custom filter。如果您使用的是python 2.7,它可能如下所示:
def format_currency(value):
return "${:,.2f}".format(value)
答案 2 :(得分:4)
为了扩展@alex vasi的答案,我肯定会写一个自定义过滤器,但我也使用python自己的locale
功能,它处理货币分组,以及符号,
def format_currency(value):
locale.currency(value, symbol=True, grouping=True)
要注意使用locale
的主要原因是它不能使用默认的' C'语言环境,因此您必须将其设置为可在您的计算机上使用的内容。
对于你正在寻找的东西,你可能需要,
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
但如果你想要英镑,你可以使用
locale.setlocale(locale.LC_ALL, 'en_GB.UTF_8')
import locale
locale.setlocale(locale.LC_ALL, 'en_US')
locale.currency(543921.94, symbol=True, grouping=True)
> '$543,921.94'
locale.setlocale(locale.LC_ALL, 'en_GB')
> '£543,921.94'
答案 3 :(得分:4)
def numberFormat(value):
return format(int(value), ',d')
@app.template_filter()
def numberFormat(value):
return format(int(value), ',d')
@app.app_template_filter()
def numberFormat(value):
return format(int(value), ',d')
{{ '1234567' | numberFormat }}
#prints 1,234,567
{{ format('1234567', ',d') }}
#prints 1,234,567
答案 4 :(得分:3)
如果你有Python 2.6或更新版本:
您可以为一个目的编写自定义过滤器,但是,作为更广泛的解决方案,您还可以更新格式过滤器本身:
from jinja import Environment, FileSystemLoader
def format(fmt_str, *args, **kwargs):
if args and kwargs:
raise jinja2.exceptions.FilterArgumentError(
"can't handle positional and keyword "
"arguments at the same time"
)
ufmt_str = jinja2.utils.soft_unicode(fmt_str)
if kwargs:
return ufmt_str.format(**kwargs)
return ufmt_str.format(*args)
env = Environment(loader=FileSystemLoader('./my/template/dir'))
env.filters.update({
'format': format,
})
这将取代现有的format
过滤器(从Jinja 2.7.1开始)。大部分功能都是从format
源直接撕掉的。这个函数和jinja的唯一区别是它使用str.format()
函数来格式化字符串。
看到Jinja2(在撰写本文时)不再支持Python 2.5,我敢打赌,在format
过滤器使用Python的str.format()
之前不久。
答案 5 :(得分:0)
使用Babel的自定义过滤器(也可以用于设置其他货币的格式)
安装Babel(http://babel.pocoo.org/en/latest/api/numbers.html)
pip install Babel
自定义Jinja过滤器
from babel.numbers import format_currency
@app.template_filter()
def usdollar(value):
return format_currency(value, 'USD', locale='en_US')
app.jinja_env.filters['usdollar'] = usdollar
在Jinja模板中的用法:
{{ '-10000.500' | usdollar }}
Output : -$10,000.50