thousands template number linebreaksbr intcomma ifequal examples bootstrap python django

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 de templatetags 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 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.



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.