2012-08-22 113 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'