2012-08-22 14 views
26

フロートをコンマ区切りの通貨としてフォーマットしようとしています。例えば。 543921.9354$543,921.94になります。私はformatフィルタをJinjaテンプレートで使用していますが、これはPython format関数ではなく、%演算子をPythonで模倣しているようです。Jinjaテンプレート - 浮動小数点をコンマ区切りの通貨でフォーマットする

Jinjaでこのフォーマットを実行するにはどうすればよいですか? formatフィルタを使用することは可能ですか?

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

もちろんの利回り

$543921.94

答えて

39

そのためcustom filterを書く:これは私がコンマ以外のすべてを達成しており、これまで持っているものです。あなたのpython 2.7を使用している場合、それは次のようになります。

def format_currency(value): 
    return "${:,.2f}".format(value) 
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フィルタを交換します(神社2.7.1のように):、あなたはまた、フォーマットフィルタ自体を更新することができます。関数の大部分は、formatソースから直接リッピングされました。この関数とjinjaの唯一の違いは、str.format()関数を使用して文字列を書式設定することです。

Jinja2(本書の執筆時点では)はPython 2.5をサポートしていないことを見て、フィルタがPythonのstr.format()を使用するまでには時間がかかりません。

36

更新:Jinja2のとPython 3を使用して、これは任意のカスタムコードを定義しなくても、テンプレートに非常にうまく働いていた:私は依存関係は、この作品を持っている正確にわからないんだけど、

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

をIMHOこの回答を読んでいる人なら誰でも、カスタムフィルタについて心配する前に少なくともそれを試してみるのが良いでしょう。

+1

これはPython 2.7でも動作しています。素晴らしい答え! – hamx0r

+0

どのように丸い部分を非表示にして小数点のみを表示するかに関する考え方はありますか? –

3

@alex VASIの答えを拡張するには、私は間違いなく、カスタムフィルタを書くだろうが、私はまたに

def format_currency(value): 
    locale.currency(value, symbol=True, grouping=True) 

、主なものをPythonの独自のlocale通貨のグループ化を扱う機能、および記号を使用したいです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' 
関連する問題