我使用(优秀)Flask framework构建网站,我现在想要显示一些数字。 jinja2提供的round filter工作正常,除非没有小数值:
{{ 1.55555|round(2) }} -> 1.56
{{ 1.5|round(2) }} -> 1.5
{{ 1.0|round(2) }} -> 1.0
{{ 1|round(2) }} -> 1.0
但我希望最后两个显示为1
(没有尾随.0
)。有谁知道我如何用jinja2做到这一点?欢迎所有提示!
[编辑]
我尝试使用trim(),但令我惊讶的是,下面的代码段为TypeError: do_trim() takes exactly 1 argument (2 given)
:
{{ 1.0|round(2)|trim('.0') }}
答案 0 :(得分:5)
您可以使用string
filter,然后使用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
注意强>
使用str.rstrip
,您将获得0
的空字符串。
>>> jinja2.Template('''{{ (0|round(2)|string()).strip('.0') }}''').render()
u''
以上是避免上述的解决方案(两次致电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
答案 1 :(得分:4)
如果你要经常使用它,我认为最好编写一个自定义过滤器以避免混乱,如下所示:
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)
注册它,你就完成了。交互式解释器中的示例:
>>> 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'
答案 2 :(得分:0)
更好的解决方案,避免60.0变为6和0.0变为空,
代替:
(( YOURNUMBER )|string).rstrip('0')
执行此操作:
(( YOURNUMBER )|string )[:-2]
这将截断字符串的最后2个字符。由于round(0)始终会产生一个以.0结尾的数字,因此可以很好地解决该问题。
答案 3 :(得分:0)
你总是可以的
{{ ((1|round(2))|string).split('.')[0] }}
流程分解:
1|round(2)
-> 1.0
|string
会将输出转换为字符串,以便我们可以使用 split()
.split('.')
将使用 .
分隔符分割字符串 -> ["1", "0"]
.split()
返回一个数组时,[0]
之后会得到第0个位置的字符串-> "1"|int