在Django模板中格式化数字

我正在尝试格式化数字。 例子:

1 => 1 12 => 12 123 => 123 1234 => 1,234 12345 => 12,345 

这是一个相当普遍的事情,但我无法弄清楚我应该使用哪个filter。

编辑:如果你有一个通用的Python方式来做到这一点,我很高兴在我的模型中添加一个格式化的字段。

Django贡献的人性化应用程序是这样做的:

 {% load humanize %} {{ my_num|intcomma }} 

一定要将'django.contrib.humanize'添加到settings.py文件的INSTALLED_APPS列表中。

build立在其他答案,扩展到浮动,你可以这样做:

 {% load humanize %} {{ floatvalue|floatformat:2|intcomma }} 

关于Ned Batchelder的解决scheme,这里有2个小数点和一个美元符号。

 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:]) 

然后你可以

 {{my_dollars | currency}} 

如果你不想涉及到语言环境,这是一个格式化数字的函数:

 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) 

从这个函数创build一个自定义模板filter是微不足道的。

如果您的网站是英文的, 人性化的解决scheme是很好的。 对于其他语言,您需要另一种解决scheme:我build议使用Babel 。 一种解决scheme是创build一个自定义模板标签来正确显示数字。 方法如下:只需在your_project/your_app/templatetags/sexify.py创build以下文件:

 # -*- 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) 

然后你可以在你的模板中使用这个模板标签:

 {% load sexy_number from sexify %} {% sexy_number 1234.56 %} 
  • 对于美国用户(区域设置en_US),显示1,234.56。
  • 对于法语用户(locale fr_FR),这将显示1 234,56。

当然你可以使用variables来代替:

 {% sexy_number some_variable %} 

注意:我的示例中目前没有使用context参数,但是我把它放在那里以表明您可以轻松地调整此模板标记,以使其使用模板上下文中的任何内容。

尝试在settings.py中添加以下行:

 USE_THOUSAND_SEPARATOR = True 

这应该工作。

请参阅文档 。

人性化的应用程序提供了一个很好的和快速的格式化数字的方法,但是如果您需要使用不同于逗号的分隔符,只需重复使用人性化应用程序中的代码 ,replace分隔符char并创build自定义filter就很简单。 例如,使用空格作为分隔符:

 @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) 

那么我找不到一个Django的方式,但我从我的模型里面find一个python的方式:

 def format_price(self): import locale locale.setlocale(locale.LC_ALL, '') return locale.format('%d', self.price, True) 

稍微偏离主题:

我发现这个问题,同时寻找一种方法来格式化一个数字为货币,如下所示:

 $100 ($50) # negative numbers without '-' and in parens 

我结束了:

 {% if var >= 0 %} ${{ var|stringformat:"d" }} {% elif var < 0 %} $({{ var|stringformat:"d"|cut:"-" }}) {% endif %} 

你也可以这样做,例如{{ var|stringformat:"1.2f"|cut:"-" }}显示为$50.00 (2位小数,如果这是你想要的。

也许稍微在哈克一边,但也许别人会发现它有用。

请注意,更改区域设置是全过程的,而不是线程安全的(iow。,可能有副作用或可能影响同一进程内执行的其他代码)。

我的build议是:检查巴别克包。 一些与Django模板集成的方法是可用的。

不知道为什么这没有提到,但:

 {% load l10n %} {{ value|localize }} 

https://docs.djangoproject.com/en/1.11/topics/i18n/formatting/#std:templatefilter-localize

你也可以通过调用localize(number)在你的Django代码(外部模板)中使用它。

基于muhuk答案我做了这个简单的标签封装python string.format方法。

  • 在您的应用程序文件夹中创build一个templatetags标签。
  • 在其上创build一个format.py文件。
  • 添加到它:

     from django import template register = template.Library() @register.filter(name='format') def format(value, fmt): return fmt.format(value) 
  • 将它加载到您的模板中{% load format %}
  • 用它。 {{ some_value|format:"{:0.2f}" }}