Jinja模板 - 将浮点数格式化为逗号分隔的货币

时间:2012-08-22 17:41:59

标签: python flask jinja2

我正在尝试将浮点格式化为逗号分隔的货币。例如。 543921.9354变为$543,921.94。我在Jinja模板中使用format过滤器,它似乎模仿Python中的%运算符而不是Python format函数?

如何在Jinja中完成此格式化?是否可以使用format过滤器?这就是我到目前为止所做的事情,除了逗号外,它还能完成所有事情:

"$%.2f"|format(543921.9354)

当然会产生

$543921.94

6 个答案:

答案 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)

Python3.6:

def numberFormat(value):
    return format(int(value), ',d')

Flask全局过滤器

@app.template_filter()
def numberFormat(value):
    return format(int(value), ',d')

Flask全局过滤器蓝图

@app.app_template_filter()
def numberFormat(value):
    return format(int(value), ',d')

调用此全局过滤器

{{ '1234567' | numberFormat }}
#prints 1,234,567

在Jinja中调用它而不指定全局过滤器

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