【问题标题】:Is there a django template filter to display percentages?是否有 django 模板过滤器来显示百分比?
【发布时间】:2011-02-14 15:08:55
【问题描述】:

我想要类似于string formatting from the standard library 的东西。

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

【问题讨论】:

    标签: django formatting django-templates


    【解决方案1】:

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

    {% widthratio value total_value 100 %}
    

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

    【讨论】:

    • 仅用于复制粘贴。 {% widthratio float_value 1 100 %}
    • 我希望有一种方法可以将此标记为不仅仅是投票的答案。标记的答案在某种意义上是正确的(尽管它不包括实现),但问题是问是否有内置过滤器可以做到这一点并且有......
    • 在模板中包含这种逻辑并不是一个很好的做法。在模型属性中执行此操作要好得多,并在模板中按原样显示。
    【解决方案2】:

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

    from django import template
    
    register = template.Library()
    
    @register.filter
    def percentage(value):
        return format(value, "%")
    

    【讨论】:

    • 如果你想控制小数位:return format(value, ".2%")(两位小数)
    【解决方案3】:

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

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

    【讨论】:

    • 对于整数舍入,最好使用@JeromeParadis 解决方案。对于浮动百分比,这是我的首选方式,但返回:"%.1f%%" % (float(part) / whole * 100)
    【解决方案4】:

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

    from django import template
    
    register = template.Library()
    
    def percentage(value):
        return '{0:.2%}'.format(value)
    
    register.filter('percentage', percentage)
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          用百分比格式化数字的最短方法,例如“65%”:

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

          【讨论】:

            【解决方案8】:

            将我的 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%
            

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

            【讨论】:

              猜你喜欢
              • 2012-01-16
              • 2023-03-16
              • 2015-01-22
              • 2021-07-31
              • 1970-01-01
              • 2014-05-23
              • 2022-09-25
              • 2012-06-03
              • 1970-01-01
              相关资源
              最近更新 更多