如果Jinja2中没有十进制值,如何将小数点舍入为零?

kra*_*r65 3 python templates rounding jinja2 flask

我使用(出色的)Flask框架构建了一个网站,现在我想在其中显示一些数字。jinja2提供的舍入过滤器可以正常工作,除非没有十进制值:

{{ 1.55555|round(2) }} -> 1.56
{{ 1.5|round(2) }} -> 1.5
{{ 1.0|round(2) }} -> 1.0
{{ 1|round(2) }} -> 1.0
Run Code Online (Sandbox Code Playgroud)

但我希望最后两个显示像1(没有尾随.0)。有人知道我可以使用jinja2吗?欢迎所有提示!

[编辑]

我尝试使用trim(),但令我惊讶的是,以下代码段给出了TypeError: do_trim() takes exactly 1 argument (2 given)

{{ 1.0|round(2)|trim('.0') }}
Run Code Online (Sandbox Code Playgroud)

fal*_*tru 5

您可以使用stringfilter,然后使用str.rstrip

>>> import jinja2
>>> print(jinja2.Template('''
... {{ (1.55555|round(2)|string).rstrip('.0') }}
... {{ (1.5|round(2)|string).rstrip('.0') }}
... {{ (1.0|round(2)|string).rstrip('.0') }}
... {{ (1|round(2)|string).rstrip('.0') }}
... ''').render())

1.56
1.5
1
1
Run Code Online (Sandbox Code Playgroud)

注意

使用str.rstrip,您将获得一个空字符串0

>>> jinja2.Template('''{{ (0|round(2)|string()).strip('.0') }}''').render()
u''
Run Code Online (Sandbox Code Playgroud)

这是避免上述情况的解决方案(请致电rstrip两次;请致电一次,请致电0一次.

>>> print(jinja2.Template('''
... {{ (1.55555|round(2)|string).rstrip('0').rstrip('.') }}
... {{ (1.5|round(2)|string).rstrip('0').rstrip('.') }}
... {{ (1.0|round(2)|string).rstrip('0').rstrip('.') }}
... {{ (1|round(2)|string).rstrip('0').rstrip('.') }}
... {{ (0|round(2)|string).rstrip('0').rstrip('.') }}
... ''').render())

1.56
1.5
1
1
0
Run Code Online (Sandbox Code Playgroud)


Ric*_*nes 5

如果您要经常使用它,我认为最好编写一个自定义过滤器以避免混乱,如下所示:

from jinja2 import filters

def myround(*args, **kw):
    # Use the original round filter, to deal with the extra arguments
    res = filters.do_round(*args, **kw)
    # Test if the result is equivalent to an integer and
    # return depending on it
    ires = int(res)
    return (res if res != ires else ires)
Run Code Online (Sandbox Code Playgroud)

注册它,你就完成了。交互式解释器中的示例:

>>> from jinja2 import Environment
>>> env = Environment()
>>> env.filters['myround'] = myround
>>> env.from_string("{{ 1.4|myround(2) }}").render()
u'1.4'
>>> env.from_string("{{ 1.4|myround }}").render()
u'1'
>>> env.from_string("{{ 0.3|myround }}").render()
u'0'
Run Code Online (Sandbox Code Playgroud)