【发布时间】:2011-02-14 15:08:55
【问题描述】:
我想要类似于string formatting from the standard library 的东西。
'%' 百分比。乘以数字 100 并以固定 ('f') 显示 格式,后跟百分号。
【问题讨论】:
标签: django formatting django-templates
我想要类似于string formatting from the standard library 的东西。
'%' 百分比。乘以数字 100 并以固定 ('f') 显示 格式,后跟百分号。
【问题讨论】:
标签: django formatting django-templates
我正在寻找几乎相同的问题,并找到了 widthratio 模板标签。 您可以使用此标签从原始值和计算百分比的总值计算模板中的百分比,而不是像在您的问题中那样计算百分比。如果您只需要一个没有精度的整数百分比,它就可以完成这项工作:
{% widthratio value total_value 100 %}
参考:https://docs.djangoproject.com/en/dev/ref/templates/builtins/#widthratio
【讨论】:
如果有人正在寻找答案,这就是我使用自定义模板标签解决问题的方法:
from django import template
register = template.Library()
@register.filter
def percentage(value):
return format(value, "%")
【讨论】:
return format(value, ".2%")(两位小数)
这是我正在使用的(顺便说一下,我们只显示小数,不显示浮点数):
@register.filter
def as_percentage_of(part, whole):
try:
return "%d%%" % (float(part) / whole * 100)
except (ValueError, ZeroDivisionError):
return ""
像这样使用它:
Monkeys constitute {{ monkeys|as_percentage_of:animals }} of all animals.
如果猴子是 3,动物是 6,你会得到:
50%
【讨论】:
这就是我解决问题的方法:
from django import template
register = template.Library()
def percentage(value):
return '{0:.2%}'.format(value)
register.filter('percentage', percentage)
【讨论】:
string.Formatter() 的新颖性意味着 Django 不太可能内置支持它。编写或找到实现它的模板标签或过滤器。
【讨论】:
更好的国际化解决方案适用于 python 2.5。
from django import template
register = template.Library()
from django.template.defaultfilters import floatformat
@register.filter
def percent(value):
if value is None:
return None
return floatformat(value * 100.0, 2) + '%'
【讨论】:
用百分比格式化数字的最短方法,例如“65%”:
{{ number|stringformat:"d%%" }}
【讨论】:
将我的 2 美分作为之前的大多数答案已经很好了,但我花了一些时间寻找一个完全可定制且灵活的解决方案,并想分享我的发现。
完全可定制和灵活意味着编写自定义过滤器,所以让我们这样做。在您应用的根目录中,创建“templatetags”包和“templatetags/mytags.py”文件,内容如下:
# mytags.py
from django import template
register = template.Library()
@register.filter(is_safe=True)
def format_percent(value: float, args: str=""):
"""
Format a numeric value as percentage
:param value: the numeric value
:param args: a CSV string of arguments to the formatting operation
:return: the formatted value
"""
# splits the arguments string into a list of arguments
arg_list = [arg.strip() for arg in args.split(',')] if args else []
# sets the precision (number of decimal digits)
precision = int(arg_list[0]) if len(arg_list) > 0 else 0
# should the "%" symbol be included?
include_symbol = bool(arg_list[1]) if len(arg_list) > 1 else True
symbol = " %" if include_symbol else ""
# builds and returns the formatted value
return f"{value * 100.0:.{precision}f}{symbol}"
您可以为自定义过滤器的文件选择任何您喜欢的名称,但请注意您选择的名称是您稍后将用于加载标签的名称,因此请确保选择不会冲突的名称在另一个应用程序中使用自定义标签和过滤器。
还要注意,“templatetags”不是一个简单的目录,而是一个 Python 包,因此请确保您还包含标准的 __init__.py。
最后请注意,我必须在过滤器中恢复使用“args”技巧,因为 Django 不支持具有多个参数的自定义过滤器。
现在您可以使用新标签,如下例所示:
# mytemplate.html
# note that the app that contains the custom tags must be in INSTALLED_APPS
# in order for the {% load %} tag to work
{% load mytags %}
<p>{{ 0.1234|format_percent}}</p>
<p>{{ 0.1234|format_percent:"1"}}</p>
<p>{{ 0.1234|format_percent:"2,False" }}</p>
这将呈现如下内容:
12%
12.3%
12.34%
我相信这是一个非常灵活的解决方案,因为如果需要,您可以轻松地向自定义过滤器添加更多格式参数。
【讨论】: