2013-07-30 15 views
7

Mam następujący kod w moim szablonu:Jinja2 okrągły filtr nie zaokrąglania

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

Oczekuję dane w zaokrągleniu do 1 miejsca po przecinku. Jednak gdy wyświetlam stronę lub źródło, otrzymuję dane wyjściowe:

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

To nie jest zaokrąglone do 1 miejsca po przecinku. Działa bez błędu szablonu lub czegokolwiek, ale generuje niepoprawne dane wyjściowe. Moje zrozumienie from the documentation, a nawet a related stack overflow question, to mój format powinien działać. Czego mi brakuje lub robię źle?

+0

Wygląda na to, że twój kod zaokrągla "100" zamiast ** produktu ** z 'deet.value * 100'. Powinieneś raczej preferować mnożenie w kodzie, a nie w szablonie. – bernie

+0

Mam, rozumiem, ale zmieniłem na 100 * deet.value | round (3) i to rozwiązało dla mnie. Dzięki! – Mittenchops

Odpowiedz

7

Nie zdawałem sobie sprawy, że operator filtru ma pierwszeństwo przed mnożeniem!

Nawiązując do komentarza Berniego, przeszedłem

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

do

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

który rozwiązał problem. Zgadzam się, że przetwarzanie powinno odbywać się w innym miejscu kodu, co byłoby lepszą praktyką.

+0

To oczywiście nie działa dla podziału. W takim przypadku Jinja nie jest w stanie zaokrąglić wyniku. Nie zgadzam się z ideą, że matematyka powinna być wykonywana w kontrolerze, a nie w widoku. To nieprzyjemny zapach zamaskowany jako dobry zapach. – sobri

18

Możesz umieścić pareny wokół wartości, którą chcesz zaokrąglić. (Działa to do podziału, a także, wbrew temu, co @sobri napisał.)

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

UWAGA: round zwraca float więc jeśli naprawdę chcesz int trzeba przekazać wartość przez ten filtr, jak również.

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

Przebiegłem przez to ... potrzebne int (mem_total/4) w jinja. Rozwiązałem go, wykonując dwie operacje:

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