2013-07-30 20 views
7

Ho il seguente codice nel mio modello:Jinja2 filtro round non arrotondamento

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

mi aspetto i dati arrotondato a 1 decimale. Tuttavia, quando ho visualizza la pagina o la fonte, questa è l'uscita sto ottenendo:

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

Questo non viene arrotondato a 1 cifra decimale. Funziona senza errori di template o altro, ma produce output errati. La mia comprensione from the documentation e anche a related stack overflow question, è che il mio formato dovrebbe funzionare. Cosa mi sto perdendo o sto sbagliando?

+0

Sembra che il tuo codice arrotonda '100' invece del ** prodotto ** di' deet.value * 100'. Probabilmente dovresti preferire la moltiplicazione nel codice e non nel modello. – bernie

+0

Gotcha, prendo il tuo punto, ma sono passato a 100 * deet.value | round (3) e questo lo ha risolto per me. Grazie! – Mittenchops

risposta

7

Non si rendeva conto che l'operatore del filtro aveva la precedenza sulla moltiplicazione!

In seguito al commento di Bernie, sono passato

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

a

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

che ha risolto il problema. Sono d'accordo che l'elaborazione dovrebbe avvenire nel codice altrove, e sarebbe una pratica migliore.

+0

Questo ovviamente non funziona per la divisione. In tal caso, Jinja non è in grado di arrotondare il risultato. Non sono d'accordo con l'idea che la matematica debba essere eseguita in un controller piuttosto che in vista. È un cattivo odore mascherato da un buon odore. – sobri

18

È possibile inserire i parenti attorno al valore che si desidera arrotondare. (Questo funziona per la divisione e, contrariamente a quanto ha scritto @sobri.)

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

NOTA: round restituisce un float quindi se si vuole veramente il int si deve passare il valore attraverso quel filtro pure.

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

mi sono imbattuto in questo ... int necessario (mem_total/4) a Jinja. L'ho risolto effettuando due operazioni:

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