2012-08-22 14 views
26

Estoy intentando formatear un flotante como una moneda separada por comas. P.ej. 543921.9354 se convierte en $543,921.94. Estoy usando el filtro format en plantillas Jinja, que parece imitar el operador % en Python en lugar de la función Python format?Plantillas de Jinja: formatea un flotador como moneda separada por comas

¿Cómo puedo lograr este formato en Jinja? ¿Es posible usar el filtro format? Esto es lo que tengo hasta ahora, que lleva a cabo todo excepto las comas:

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

que por supuesto rendimientos

$543921.94

Respuesta

39

de ayuda custom filter para eso. Si está utilizando Python 2.7, que puede tener este aspecto:

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

Si tiene Python 2.6 o posterior:

Se puede escribir un filtro personalizado para un propósito, pero, como una solución más amplia , también se puede actualizar el filtro de formato en sí mismo:

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

Esto reemplazará el filtro format existente (a partir de Jinja 2.7.1). La mayoría de la función se extrajo directamente de la fuente format. La única diferencia entre esta función y la de jinja es que usa la función str.format() para formatear la cadena.

Al ver que Jinja2 (en el momento de escribir esto) ya no es compatible con Python 2.5, apuesto a que no pasará mucho tiempo antes de que el filtro format use Python's str.format().

36

Actualización: Usando Jinja2 y Python 3, esto funcionó bastante bien en la plantilla sin tener que definir cualquier código personalizado:

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

No estoy seguro exactamente lo que las dependencias han de tener este trabajo, pero En mi humilde opinión, cualquier otra persona que lea esta respuesta haría bien en intentarlo al menos antes de preocuparse por los filtros personalizados.

+1

Esto también me funciona en Python 2.7. ¡Gran respuesta! – hamx0r

+0

alguna idea sobre cómo ocultar la parte redonda y solo mostrar decimales? –

3

Extender @alex respuesta de vasi, definitivamente me gustaría escribir un filtro personalizado, pero también usarían propia funcionalidad locale de pitón, que se ocupa de la agrupación de divisas y el símbolo,

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

Lo principal a tenga en cuenta que el uso de locale es que no funciona con la configuración regional 'C' predeterminada, por lo que debe configurarlo para que esté disponible en su máquina.

Por lo que está buscando, es probable que tenga,

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

pero si quería libras esterlinas, que tendría que utilizar,

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' 
Cuestiones relacionadas