如果Jinja2没有小数值,如何舍入到零小数?

时间:2015-02-11 15:47:41

标签: python templates flask rounding jinja2

我使用(优秀)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') }}

4 个答案:

答案 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. 1|round(2) -> 1.0
  2. |string 会将输出转换为字符串,以便我们可以使用 split()
  3. .split('.') 将使用 . 分隔符分割字符串 -> ["1", "0"]
  4. .split()返回一个数组时,[0]之后会得到第0个位置的字符串-> "1"
  5. [可选] 如果您希望结果的数据类型为数字,请在最后执行 |int