【问题标题】:Jinja2 round filter not roundingJinja2圆形过滤器不四舍五入
【发布时间】:2013-07-31 05:15:14
【问题描述】:

我的模板中有以下代码:

data: [{% for deet in deets %} {{ deet.value*100|round(1) }}{% if not loop.last %},{% endif %} {% endfor %}]

我希望数据四舍五入到小数点后 1 位。但是,当我查看页面或源时,这是我得到的输出:

data: [ 44.2765833818,  44.2765833818,  44.2765833818,  44.2765833818,  44.2765833818,  44.2765833818,  44.2765833818,  44.2765833818,  44.2765833818,  44.2765833818 ]

这没有四舍五入到小数点后 1 位。它运行时没有模板错误或任何东西,但会产生不正确的输出。我的理解from the documentation,甚至a related stack overflow question,是我的格式应该有效。我错过了什么或做错了什么?

【问题讨论】:

  • 看起来您的代码正在舍入 100 而不是 deet.value*100product。您可能更喜欢在代码中而不是在模板中进行乘法运算。
  • 明白了,我同意你的观点,但我切换到 100*deet.value | round(3) 并为我解决了它。谢谢!

标签: python flask jinja2 template-engine


【解决方案1】:

没有意识到过滤运算符优先于乘法!

根据伯尼的评论,我切换了

{{ deet.value*100|round(1) }}

{{ 100*deet.value|round(1) }}

解决了这个问题。我同意处理应该在其他地方的代码中进行,这将是更好的做法。

【讨论】:

  • 这显然不适用于除法。在这种情况下,Jinja 无法对结果进行四舍五入。我不同意数学应该在控制器而不是视图中完成的想法。那是一种难闻的气味,掩盖了一种好气味。
【解决方案2】:

您可以在要舍入的值周围加上括号。 (这也适用于除法,与@sobri 所写的相反。)

{{ (deet.value/100)|round }}

注意:round 返回 float,因此如果您真的想要 int,您还必须通过该过滤器传递值。

{{ (deet.value/100)|round|int }}

【讨论】:

    【解决方案3】:

    我遇到了这个...在 jinja 中需要 int(mem_total / 4)。我通过进行两次操作来解决它:

    {% set LS_HEAP_SIZE = grains['mem_total'] / 4 %}
    {% set LS_HEAP_SIZE = LS_HEAP_SIZE | round | int %}
    

    【讨论】:

      【解决方案4】:

      试试这个

      {{ (deet.value*100)|round(1) }}
      

      如果我们不加括号,round 只会对 100 做而不是对结果。

      【讨论】:

        【解决方案5】:

        如果过滤运算符有优先级,那么你应该在“{{ 100*deet.value|round(1) }}”中使用round(3)而不是round(1)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-03-27
          • 1970-01-01
          • 2016-10-10
          • 2023-01-12
          • 1970-01-01
          • 2012-08-04
          • 2023-03-26
          相关资源
          最近更新 更多