2012-08-22 10 views
26

Sto provando a formattare un float come valuta separata da virgole. Per esempio. 543921.9354 diventa $543,921.94. Sto usando il filtro format nei modelli Jinja, che sembra imitare l'operatore % in Python piuttosto che la funzione Python format?Modelli Jinja - Formatta un float come valuta separata da virgola

Come posso eseguire questa formattazione in Jinja? È possibile utilizzare il filtro format? Questo è quello che ho finora, che compie tutto tranne le virgole:

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

che naturalmente rese

$543921.94

risposta

39

Scrivi una custom filter per questo. Se si sta utilizzando Python 2.7, può assomigliare a questo:

def format_currency(value): 
    return "${:,.2f}".format(value) 
3

Se si dispone di Python 2.6 o più recente:

Si potrebbe scrivere un filtro personalizzato per uno scopo, ma, come una soluzione più ampia , si potrebbe anche aggiornare il filtro formato stesso:

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, 
}) 

Questo sostituirà l'format filtro esistente (come di Jinja 2.7.1). La maggior parte della funzione è stata strappata direttamente dalla sorgente format. L'unica differenza tra questa funzione e quella di jinja è che utilizza la funzione str.format() per formattare la stringa.

Vedendo che Jinja2 (al momento della stesura di questo articolo) non supporta più Python 2.5, scommetto che non ci vorrà molto prima che il filtro format usi Python str.format().

36

Aggiornamento: Usando Jinja2 e Python 3, questo ha funzionato abbastanza bene nel modello senza dover definire un codice personalizzato:

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

io non sono sicuro di quello che le dipendenze sono di avere questo lavoro, ma IMHO chiunque altro leggendo questa risposta farebbe bene almeno provarlo prima di preoccuparsi dei filtri personalizzati.

+1

Questo funziona anche per me su Python 2.7. Bella risposta! – hamx0r

+0

qualche idea su come nascondere la parte rotonda e visualizzare solo i decimali? –

3

Per estendere @alex risposta di vasi, avrei sicuramente scrivere un filtro personalizzato, ma mi piacerebbe anche uso proprio locale funzionalità di Python, che gestisce il raggruppamento di valuta, e il simbolo,

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

La cosa principale da prendere nota dell'uso di locale è che non funziona con le impostazioni locali predefinite di "C", quindi è necessario impostarlo in modo tale che sia disponibile sulla macchina.

Per quello che stai cercando, probabilmente è necessario,

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

ma se si voleva sterline, devi usare,

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' 
Problemi correlati