Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Formatting floats with decimal dots and limited decimal part in Django templates

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 filter stringformat:"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?

like image 859
gerosalesc Avatar asked Dec 11 '15 20:12

gerosalesc


2 Answers

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" }}
like image 93
Florian Avatar answered Sep 16 '22 22:09

Florian


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

like image 32
maazza Avatar answered Sep 20 '22 22:09

maazza