Answers:
Django的贡献人性化应用程序执行以下操作:
{% load humanize %}
{{ my_num|intcomma }}
确保将文件添加'django.contrib.humanize'
到INSTALLED_APPS
列表中settings.py
。
在其他答案的基础上,要将其扩展到浮点数,可以执行以下操作:
{% load humanize %}
{{ floatvalue|floatformat:2|intcomma }}
文档:floatformat
,intcomma
。
关于Ned Batchelder的解决方案,此处为2个小数点和一个美元符号。这就像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)
那么你就可以
{% load my_filters %}
{{my_dollars | currency}}
>>> currency(0.99958) u'$0.00'
尝试在settings.py中添加以下行:
USE_THOUSAND_SEPARATOR = True
这应该工作。
请参阅文档。
更新于2018-04-16:
还有一种执行此操作的python方法:
>>> '{:,}'.format(1000000)
'1,000,000'
如果您不想参与语言环境,则可以使用以下函数来格式化数字:
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)
从此函数创建自定义模板过滤器很简单。
该人文化的解决方案是好的,如果你的网站是英文的。对于其他语言,您需要另一种解决方案:我建议使用Babel。一种解决方案是创建一个自定义模板标签以正确显示数字。方法如下:只需在中创建以下文件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)
然后,您可以像下面这样在模板中使用此模板标记:
{% load sexy_number from sexify %}
{% sexy_number 1234.56 %}
当然,您可以改用变量:
{% sexy_number some_variable %}
注意:该context
参数当前未在我的示例中使用,但我将其放在此处表明您可以轻松地调整此模板标签以使其使用模板上下文中的任何内容。
该人文化的应用程序提供了一个很好和格式化号码的快捷方式,但如果你需要使用一个分离器不同于逗号,它的简单,只是重复使用从人文化的应用程序的代码,则更换分隔字符,并创建一个自定义过滤器。例如,使用空格作为分隔符:
@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)
稍微偏离主题:
我在寻找一种将数字格式化为货币的方法时发现了这个问题,如下所示:
$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位小数。
也许稍微有点怪癖,但也许其他人会发现它很有用。
好吧,我找不到Django方式,但确实从模型内部找到了python方式:
def format_price(self):
import locale
locale.setlocale(locale.LC_ALL, '')
return locale.format('%d', self.price, True)
s really not correct not giving any reason. Here it
很容易:Django有特定的模板(类似于Jinja2-或它的Jinja2),该模板不允许使用标准的python函数。所以这个答案根本没有用。更重要的是,Django有自己的功能来管理它,并编写任何有效的新方法确实不是一个好主意……
不知道为什么还没有提到:
{% load l10n %}
{{ value|localize }}
https://docs.djangoproject.com/zh-CN/1.11/topics/i18n/formatting/#std:templatefilter-localize
您还可以通过调用在Django代码(外部模板)中使用此代码localize(number)
。
基于muhuk的答案,我做了这个简单的标记封装python string.format
方法。
templatetags
在您的应用程序文件夹中。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}" }}