2012-08-22 119 views
26

我試圖格式化浮動爲逗號分隔的貨幣。例如。 543921.9354變成$543,921.94。我在Jinja模板中使用format過濾器,似乎模仿Python中的%運算符而不是Python format函數?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或更新版本:

你可以寫一個自定義過濾器爲一個目的,但是,作爲一個更廣泛的解決方案,你也可以更新格式過濾器本身:

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()函數來格式化字符串。我認爲在format過濾器使用Python的str.format()之前不會再支持Python 2.5,我敢打賭,它不會很長時間纔會使用Python的str.format()

36

更新:使用Jinja2的和Python 3,這個工作相當不錯的模板,而不必定義任何自定義代碼:

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

我不知道到底是什麼的依賴是有這個工作,但恕我直言,任何閱讀這個答案的人都會做得很好,至少在擔心自定義過濾器之前嘗試一下。

+1

這也適用於我在Python 2.7中。很好的答案! – hamx0r

+0

關於如何隱藏圓形部分和只顯示小數的任何想法? –

3

爲了延長@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'