Modèles Jinja-formater un flottant en tant que monnaie séparée par des virgules

J'essaie de formater un flottant en tant que Devise séparée par des virgules. Par exemple 543921.9354 devient $543,921.94. J'utilise le filtre format dans les modèles Jinja, qui semble imiter l'opérateur % en Python plutôt que la fonction Python format?

Comment puis-je accomplir ce formatage dans Jinja? Est-il possible d'utiliser le filtre format? C'est ce que j'ai jusqu'à présent, qui accomplit tout sauf les virgules:

"$%.2f"|format(543921.9354)

Ce qui donne bien sûr

$543921.94

31
demandé sur Kyle Johnson 2012-08-22 21:41:59

5 réponses

Écrire un filtre personnalisé pour que. Si vous utilisez Python 2.7, cela peut ressembler à ceci:

def format_currency(value):
    return "${:,.2f}".format(value)
43
répondu alex vasi 2012-08-22 20:07:09

Mise à jour: en utilisant Jinja2 et Python 3, cela a très bien fonctionné dans le modèle sans avoir à définir de code personnalisé:

{{ "${:,.2f}".format(543921.9354) }}

Je ne suis pas sûr exactement quelles sont les dépendances pour avoir ce travail, mais à mon humble avis, toute autre personne lisant cette réponse ferait bien d'essayer au moins avant de se soucier des filtres personnalisés.

46
répondu biomiker 2015-11-13 04:01:14

Pour étendre la réponse de @alex vasi, j'écrirais certainement un filtre personnalisé, mais j'utiliserais également la propre fonctionnalité locale de python, qui gère le regroupement de devises, et le symbole,

def format_currency(value):
    locale.currency(value, symbol=True, grouping=True)

La principale chose à prendre note de l'utilisation de locale est que cela ne fonctionne pas avec les paramètres régionaux 'C' par défaut, donc vous devez le définir de manière à ce que quelque chose soit disponible sur votre machine.

Pour ce que vous cherchez, vous avez probablement besoin,

locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')

Mais si vous vouliez des livres sterling, vous utilisation,

locale.setlocale(locale.LC_ALL, 'en_GB.UTF_8')

.

import locale
locale.setlocale(locale.LC_ALL, 'en_US')
locale.currency(543921.94, symbol=True, grouping=True)
> '$543,921.94'
locale.setlocale(locale.LC_ALL, 'en_GB')
> '£543,921.94'
4
répondu seaders 2016-01-28 17:53:36

Si vous avez python 2.6 ou plus récent:

Vous pouvez écrire un filtre personnalisé dans un seul but, mais, comme solution plus large, vous pouvez également mettre à jour le filtre de format lui-même:

from jinja import Environment, FileSystemLoader

def format(fmt_str, *args, **kwargs):
    if args and kwargs:
        raise jinja2.exceptions.FilterArgumentError(
            "can't handle positional and keyword "
            "arguments at the same time"
        )
    ufmt_str = jinja2.utils.soft_unicode(fmt_str)
    if kwargs:
        return ufmt_str.format(**kwargs)
    return ufmt_str.format(*args)


env = Environment(loader=FileSystemLoader('./my/template/dir'))
env.filters.update({
    'format': format,
})

Cela remplacera le filtre format existant (à partir de Jinja 2.7.1). La majorité de la fonction a été arrachée directement de la format source. La seule différence entre cette fonction et jinja est qu'il utilise le str.format() fonction pour formater la chaîne.

Voir ça Jinja2 (au moment d'écrire ces lignes) ne supporte plus python 2.5, je parie qu'il ne faudra pas longtemps avant que le filtre format utilise Python str.format().

3
répondu OozeMeister 2013-09-25 14:20:09

Python3. 6:

def numberFormat(value):
    return format(int(value), ',d')

Filtre global du flacon

@app.template_filter()
def numberFormat(value):
    return format(int(value), ',d')

Flacon filtre global pour Plan

@app.app_template_filter()
def numberFormat(value):
    return format(int(value), ',d')

Appelez ce filtre global

{{ '1234567' | numberFormat }}
#prints 1,234,567

L'appeler dans Jinja sans affecter un filtre global

{{ format('1234567', ',d') }}
#prints 1,234,567
2
répondu Yongju Lee 2018-04-28 09:44:37