oli
Estoy tratando de formatear números. Ejemplos:
1 => 1
12 => 12
123 => 123
1234 => 1,234
12345 => 12,345
Parece algo bastante común, pero no puedo averiguar qué filtro se supone que debo usar.
Editar: si tiene una forma genérica de Python para hacer esto, me complace agregar un campo formateado en mi modelo.
Ned Batchelder
Django contribuyó humanizar aplicación hace esto:
{% load humanize %}
{{ my_num|intcomma }}
Asegúrate de agregar 'django.contrib.humanize'
para usted INSTALLED_APPS
lista en el settings.py
expediente.
-
¿Hay alguna razón por la que estos pocos filtros simples no formen parte de los filtros integrados?
– PawelRoman
19 de julio de 2013 a las 9:59
-
@PawelRoman Para evitar la carga de un montón de filtros y etiquetas que rara vez se usan (y así acelerar la representación de la plantilla)
– Maxime Lorant
18 mayo 2014 a las 12:43
-
Agregué ‘django.contrib.humanize’ en INSTALLED_APPS y también incluí {% load humanize %} en mi plantilla y reinicié el servidor. Sin embargo, cuando trato de usar el filtro “intcoma”, aparece este error – Filtro no válido: ‘intcoma’ El seguimiento de depuración muestra ‘django.contrib.humanize’ incluido en settings.py. ¿Cuál podría ser el posible problema?
– Manish
7 de marzo de 2015 a las 8:35
-
Obtuve la respuesta a mi propio problema aquí: había incluido {% cargar humanizar%} en la plantilla base (ya que lo necesito para muchas plantillas). Parece que no funciona: cuando lo agregué en las plantillas relevantes, ¡funcionó bien! 🙂
– Manish
7 de marzo de 2015 a las 9:34
-
Si no funciona, puede deberse a la localización. Pruebe {{ my_num|intcomma:False }} en ese caso
– José Cherián
24 de enero de 2020 a las 2:00
Vinod Kurup
Sobre la base de otras respuestas, para extender esto a los flotadores, puede hacer:
{% load humanize %}
{{ floatvalue|floatformat:2|intcomma }}
Documentación: floatformat
, intcomma
.
David Aarón Smith
En cuanto a la solución de Ned Batchelder, aquí está con 2 puntos decimales y un signo de dólar. Esto va a algún lugar como my_app/templatetags/my_filters.py
from django import template
from django.contrib.humanize.templatetags.humanize import intcomma
register = template.Library()
def currency(dollars):
dollars = round(float(dollars), 2)
return "$%s%s" % (intcomma(int(dollars)), ("%0.2f" % dollars)[-3:])
register.filter('currency', currency)
Entonces tú puedes
{% load my_filters %}
{{my_dollars | currency}}
-
Error en el código anterior, prueba esto:
>>> currency(0.99958) u'$0.00'
– Ahsan
5 de abril de 2012 a las 7:39
-
Este código debe ir en su propio archivo en [your_project]/[your_app]/etiquetas de plantilla/[filtername].py. Luego debe cargarse en la plantilla con {% load [filtername] %}. Ver docs.djangoproject.com/en/1.10/howto/custom-template-tags para obtener información más útil y específica.
– pila poderosa
5 de marzo de 2017 a las 1:50
carton.columpio
Intente agregar la siguiente línea en settings.py:
USE_THOUSAND_SEPARATOR = True
Esto debería funcionar.
Referirse a documentación.
actualización en 2018-04-16:
También hay una forma de Python para hacer esto:
>>> '{:,}'.format(1000000)
'1,000,000'
Si no quiere involucrarse con las configuraciones regionales, aquí hay una función que da formato a 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)
Creando un filtro de plantilla personalizado de esta función es trivial.
los humanizar la solución 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: simplemente cree 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)
Entonces puede usar esta etiqueta de plantilla en sus plantillas de esta manera:
{% load sexy_number from sexify %}
{% sexy_number 1234.56 %}
- Para un usuario estadounidense (locale en_US), esto muestra 1.234,56.
- Para un usuario francés (locale fr_FR), esto muestra 1 234,56.
- …
Por supuesto, puedes usar variables en su lugar:
{% sexy_number some_variable %}
Nota: la context
Actualmente, el parámetro no se usa en mi ejemplo, pero lo puse allí para mostrar que puede modificar fácilmente esta etiqueta de plantilla para que use cualquier cosa que esté en el contexto de la plantilla.
Enis Afgan
los aplicación humanizar ofrece una forma agradable y rápida de formatear un número, pero si necesita usar un separador diferente de la coma, es simple reutilizarlo el código de la aplicación humanizarreemplace el carbón separador 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)
-
Gracias. ¡Necesitaba una versión de puntos y tu sugerencia me salvó! ¡Salud!
– estratos
24 de abril de 2014 a las 5:13
Tenga cuidado si sus usuarios objetivo también están en Europa. Algunos países europeos como Alemania usan , como marca decimal.
– tobltobs
20 de enero de 2017 a las 21:12