是否有django模板过滤器来显示百分比?

时间:2010-05-01 19:36:13

标签: django formatting django-templates

我想要类似于string formatting from the standard library

  

'%'百分比。将数字相乘   100并显示固定('f')   格式,后跟百分号。

8 个答案:

答案 0 :(得分:53)

我正在寻找几乎相同的问题并找到了 widthratio 模板标签。 您可以使用此标记从原始值和计算百分比的总值计算模板中的百分比,而不是像您的问题中那样计算百分比。如果您只需要一个没有精度的整数百分比,它就能完成这项工作:

{% widthratio value total_value 100 %}

参考:https://docs.djangoproject.com/en/dev/ref/templates/builtins/#widthratio

答案 1 :(得分:23)

如果有人在寻找答案,我就是用自定义模板标签解决问题的方法:

from django import template

register = template.Library()

@register.filter
def percentage(value):
    return format(value, "%")

答案 2 :(得分:14)

这是我正在使用的(顺便说一下,我们只显示小数,而不是浮点数):

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

答案 3 :(得分:7)

这就是我解决问题的方法:

from django import template

register = template.Library()

def percentage(value):
    return '{0:.2%}'.format(value)

register.filter('percentage', percentage)

答案 4 :(得分:2)

string.Formatter()的新颖性意味着Django不太可能支持它内置。编写或查找实现它的模板标记或过滤器。

答案 5 :(得分:2)

国际化的更好解决方案适用于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) + '%' 

答案 6 :(得分:0)

将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

最后请注意,由于Django不支持带有多个参数的自定义过滤器,因此我不得不恢复过滤器中的“ args”技巧。

现在,您可以像下面的示例一样使用新标签:

# 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%

我相信这是一个非常灵活的解决方案,因为如果需要,您可以轻松地向自定义过滤器添加更多格式参数。

答案 7 :(得分:-1)

以百分比格式表示数字的最快捷方法,例如“ 65%”:

{{ number|stringformat:"d%%" }}