51

float をカンマ区切りの通貨としてフォーマットしようとしています。例えば543921.9354​​となり$543,921.94ます。Python関数ではなく Pythonformatの演算子を模倣しているように見える、Jinja テンプレートでフィルターを使用していますか?%format

Jinja でこの書式設定を行うにはどうすればよいですか? formatフィルターを使用することは可能ですか?これは私がこれまでに持っているもので、コンマを除くすべてを達成しています:

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

もちろん、これは

$543921.94

4

6 に答える 6

88

更新: Jinja2 と Python 3 を使用すると、カスタム コードを定義する必要なく、テンプレートで非常にうまく機能しました。

{{ "${:,.2f}".format(543921.9354) }}

この機能を実現するための依存関係が正確にはわかりませんが、この回答を読んでいる他の人は、カスタムフィルターについて心配する前に、少なくとも試してみるとよいでしょう。

于 2015-07-01T10:29:26.247 に答える
52

そのためのカスタム フィルターを記述します。Python 2.7 を使用している場合は、次のようになります。

def format_currency(value):
    return "${:,.2f}".format(value)
于 2012-08-22T20:07:09.730 に答える
10

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
于 2018-04-28T09:44:37.613 に答える
7

@alex vasiの答えを拡張するために、私は間違いなくカスタムフィルターを作成しますが、locale通貨のグループ化とシンボルを処理するpython独自の機能も使用します。

def format_currency(value):
    return 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'
于 2016-01-28T17:53:36.010 に答える
3

Python 2.6 以降を使用している場合:

1 つの目的のためにカスタム フィルターを作成することもできますが、より広範なソリューションとして、フォーマット フィルター自体を更新することもできます。

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().

于 2013-09-25T14:20:09.880 に答える