python - template - Formatee los números en plantillas django
intcomma django (13)
Estoy tratando de formatear números. Ejemplos:
1 => 1
12 => 12
123 => 123
1234 => 1,234
12345 => 12,345
Parece una cosa bastante común pero no puedo descifrar qué filtro debo usar.
Editar: si tiene una forma genérica de Python para hacer esto, me alegra agregar un campo formateado en mi modelo.
Bueno, no pude encontrar una forma de Django, pero encontré una forma de pitón desde mi modelo:
def format_price(self):
import locale
locale.setlocale(locale.LC_ALL, '''')
return locale.format(''%d'', self.price, True)
En base a la respuesta muhuk hice esta simple etiqueta que encapsula el método python string.format
.
- Crea una
templatetags
detemplatetags
en la carpeta de tu aplicación. - Crea un archivo
format.py
en él. Agregue esto a esto:
from django import template register = template.Library() @register.filter(name=''format'') def format(value, fmt): return fmt.format(value)
- Carguelo en su plantilla
{% load format %}
- Úselo.
{{ some_value|format:"{:0.2f}" }}
En caso de que alguien se tropiece con esto, en Django 2.0.2
puede usar esto
Mil separadores . Asegúrese de leer la localización del formato también.
En cuanto a la solución de Ned Batchelder, aquí está con 2 puntos decimales y un signo de dólar.
from django.contrib.humanize.templatetags.humanize import intcomma
def currency(dollars):
dollars = round(float(dollars), 2)
return "$%s%s" % (intcomma(int(dollars)), ("%0.2f" % dollars)[-3:])
Entonces tú puedes
{{my_dollars | currency}}
Intente agregar la siguiente línea en settings.py:
USE_THOUSAND_SEPARATOR = True
Esto debería funcionar.
Consulte la documentation .
actualización en 2018-04-16:
También hay una forma de python para hacer esto:
>>> ''{:,}''.format(1000000)
''1,000,000''
La humanize ofrece una buena y rápida manera de formatear un número, pero si necesita usar un separador diferente de la coma, es simple reutilizar el código de la aplicación de humanización , reemplazar el separador de caracteres y crear un filtro personalizado . Por ejemplo, use espacio como separador:
@register.filter(''intspace'')
def intspace(value):
"""
Converts an integer to a string containing spaces every three digits.
For example, 3000 becomes ''3 000'' and 45000 becomes ''45 000''.
See django.contrib.humanize app
"""
orig = force_unicode(value)
new = re.sub("^(-?/d+)(/d{3})", ''/g<1> /g<2>'', orig)
if orig == new:
return new
else:
return intspace(new)
La aplicación de humanize aportada por Django hace esto:
{% load humanize %}
{{ my_num|intcomma }}
Asegúrese de agregar ''django.contrib.humanize''
a su lista INSTALLED_APPS
en el archivo settings.py
.
La solución de humanize está bien si su sitio web está en inglés. Para otros idiomas, necesita otra solución: recomiendo usar Babel . Una solución es crear una etiqueta de plantilla personalizada para mostrar los números correctamente. He aquí cómo: solo crea el siguiente archivo en your_project/your_app/templatetags/sexify.py
:
# -*- coding: utf-8 -*-
from django import template
from django.utils.translation import to_locale, get_language
from babel.numbers import format_number
register = template.Library()
def sexy_number(context, number, locale = None):
if locale is None:
locale = to_locale(get_language())
return format_number(number, locale = locale)
register.simple_tag(takes_context=True)(sexy_number)
Luego puede usar esta etiqueta de plantilla en sus plantillas como esta:
{% load sexy_number from sexify %}
{% sexy_number 1234.56 %}
- Para un usuario estadounidense (configuración regional en_US), muestra 1,234.56.
- Para un usuario francés (configuración regional fr_FR), esto muestra 1 234,56.
- ...
Por supuesto, puedes usar variables en su lugar:
{% sexy_number some_variable %}
Nota: el parámetro de context
no se usa actualmente en mi ejemplo, pero lo puse allí para mostrar que puede modificar fácilmente esta etiqueta de plantilla para hacer que use cualquier cosa que esté en el contexto de la plantilla.
No estoy seguro de por qué esto no se ha mencionado aún:
{% load l10n %}
{{ value|localize }}
https://docs.djangoproject.com/en/1.11/topics/i18n/formatting/#std:templatefilter-localize
También puede usar esto en su código Django (plantillas externas) llamando a localize(number)
.
Si no desea involucrarse con las configuraciones regionales, aquí hay una función que formatea los números:
def int_format(value, decimal_points=3, seperator=u''.''):
value = str(value)
if len(value) <= decimal_points:
return value
# say here we have value = ''12345'' and the default params above
parts = []
while value:
parts.append(value[-decimal_points:])
value = value[:-decimal_points]
# now we should have parts = [''345'', ''12'']
parts.reverse()
# and the return value should be u''12.345''
return seperator.join(parts)
Crear un filtro de plantilla personalizado desde esta función es trivial.
Sobre la base de otras respuestas, para ampliar esto a flotadores, puede hacer:
{% load humanize %}
{{ floatvalue|floatformat:2|intcomma }}
Tenga en cuenta que cambiar la configuración regional es todo el proceso y no es seguro para subprocesos (por ejemplo, puede tener efectos secundarios o puede afectar a otros códigos ejecutados dentro del mismo proceso).
Mi proposición: mira el paquete de Babel . Algunos medios de integración con las plantillas de Django están disponibles.
Un poco fuera de tema:
Encontré esta pregunta mientras buscaba una forma de formatear un número como moneda, así:
$100
($50) # negative numbers without ''-'' and in parens
Terminé haciendo:
{% if var >= 0 %} ${{ var|stringformat:"d" }}
{% elif var < 0 %} $({{ var|stringformat:"d"|cut:"-" }})
{% endif %}
También podría hacer, por ejemplo, {{ var|stringformat:"1.2f"|cut:"-" }}
para que se muestre como $50.00
(con 2 lugares decimales si eso es lo que desea).
Tal vez un poco hacky, pero tal vez alguien más lo encuentre útil.