Formatting floats with decimal dots and limited decimal part in Django templates
Solution 1
just use the localize/unlocalize format separator
https://docs.djangoproject.com/en/1.9/topics/i18n/formatting/#std:templatefilter-localize
For example:
{% load l10n %}
{{ value|localize }}
To disable localization on a single value, use unlocalize. To control localization over a large section of a template, use the localize template tag. unlocalize¶
Forces a single value to be printed without localization.
For example:
{% load l10n %}
{{ value|unlocalize }}
To force localization of a single value, use localize. To control localization over a large section of a template, use the localize template tag.
edit:
see https://docs.djangoproject.com/en/1.9/topics/i18n/translation/#switching-language-in-templates
{% load i18n %}
{% get_current_language as LANGUAGE_CODE %}
<!-- Current language: {{ LANGUAGE_CODE }} -->
<p>{% trans "Welcome to our page" %}</p>
{% language 'en' %}
{% get_current_language as LANGUAGE_CODE %}
<!-- Current language: {{ LANGUAGE_CODE }} -->
<p>{% trans "Welcome to our page" %}</p>
{% endlanguage %}
you can switch languages to force the display if localize/unlocalize does not work
Solution 2
Note, that localization (and therefore the unlocalize
filter and localize
tags) have NO effect on the output of floatformat
! At the time of writing there is an open issue about better documentation.
While switching the language to "en" is a workaround, it is not necessary to achieve (a) always using a dot and (b) limiting the number of decimals and in my opinion taking advantage of a language feature side-effect is less than ideal.
To properly format a float with Django template filters independent of localization you can use stringformat
! Printf-style formatting does not only accept a single conversion (like "f"
), but several optional parameters like "precision". See the linked Python docs for details.
To format your float 1.54233 as 1.54 simply use:
{{ float_value|stringformat:".2f" }}
gerosalesc
Java/Python Full stack developer engineer looking for challenges
Updated on June 05, 2022Comments
-
gerosalesc about 2 years
I know I can limit the number of decimals in a float by using the filter
floatformat:2
which output a localized float and also I know the filterstringformat:"f"
which outputs a dotted float like 1.54 instead of a localized comma float like 1,54.For instance, if the original float is 1.54233 I would like to print 1.54 and not 1,54 or 1.54233. Can this be achieved without the need of a custom filter?
-
gerosalesc over 8 yearscan I use this after a
floatformat
filter? like{{ val|floaformat:2|unlocalize}}
? -
gerosalesc over 8 yearsfor some reason it is not working, I mean the floats are still being printed with a comma as decimal separator even using the
localize off
I think thefloatfomat
filter is not considering it -
gerosalesc over 8 yearsIt's weird, I had to disable I10N for the commas to stop showing but the
unlocalize
didn't worked -
gerosalesc over 8 yearsTesting a little bit more I confirmed that
floatformat
indeed Ignores theunlocalize
filter and thelocalize off
tag, so what to do there? -
maazza over 8 yearsspecify a custom separator( see links above) and file a bug report at django on github
-
Arany about 6 yearsUsing
floatformat
withlanguage
still works, so you can do{% language 'en'%}{{ value|floatformat:'1' }}{% endlanguage %}
to get an "unlocalized" value. if you need a real number