2013-07-30 14 views
7

我已經在我的模板下面的代碼:Jinja2的圓形的過濾器不四捨五入

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,是我的格式應該工作。我錯過了什麼或做錯了什麼?

+0

它看起來像你的代碼舍入'100'而不是**產品**的'deet.value * 100'。您應該更喜歡在代碼中進行乘法運算,而不是在模板中進行乘法運算。 – bernie

+0

Gotcha,我接受你的觀點,但我改用100 * deet.value |輪(3),併爲我解決它。謝謝! – Mittenchops

回答

7

沒有意識到過濾器運算符優先於乘法!

在伯尼的意見之後,我切換

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

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

這解決了這個問題。我同意處理應該在其他地方的代碼中發生,這將是更好的做法。

+0

這顯然不適用於劃分。在這種情況下,Jinja無法將結果舍入。我不同意數學應該在控制器而不是視圖中完成的想法。這是一種難聞的氣味,被掩蓋爲一種很好的氣味。 – sobri

18

你可以把你想要的值放在你的周圍。 (本工程爲師,以及,相反的是@sobri寫道。)

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

注意:如果你真的想round返回float所以int你必須通過該過濾器來傳遞價值以及。

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

我碰到了這個......需要int(mem_total/4)在jinja中。我解決了它的兩個操作:

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