【问题标题】:Do math using Django template filter?使用 Django 模板过滤器做数学运算?
【发布时间】:2011-09-13 05:29:42
【问题描述】:

在我的数据库中,我有一个存储价格信息的整数字段,例如“10399”、“84700”。 显示时,应为“$103.99”和“$847.00”。

我需要显示 int*0.01。

我想知道是否有办法使用 Django 模板过滤器来做到这一点?喜欢:

{{ item.price|int_to_float_and_times_0.01 }}

另一个问题,实际上我选择整数是因为我认为它比在数据库中使用浮点数更有效。这是真的吗?

【问题讨论】:

  • 整数几乎总是被认为是存储货币的最佳方式。

标签: python django templates filter


【解决方案1】:

您可以使用widthratio templatetag进行除法:

${% widthratio item.price 100 1 %}

(如果a,b,c是widthratio的3个参数,则结果为(a/b)*c)

将导致:$103.99(对于 10399)

【讨论】:

  • widthratio 返回一个整数{% widthratio 10399 100 1 %} 给出104,而不是103.99
【解决方案2】:

不知道能不能返回浮点数,但是可以把数字格式化成字符串:

from django import template
register = template.Library()

def int_to_float_and_times(value):
  value = float(value) * .01
  return u'${0:.2f}'.format(value)

register.filter('int_to_float_and_times', int_to_float_and_times)

您如何定义高效?通常,货币值以尝试进行精确计算的特殊格式存储。

编辑:函数名称中不允许使用 0.01

【讨论】:

    【解决方案3】:

    您可以在将整数传递给模板上下文之前简单地修改它们,例如使用列表推导:

    context['prices'] = [float(item) * 0.01 for item in Model.objects.all()]
    

    (如果您的 Python 版本支持,您也可以通过删除括号使其成为生成器,这将使您的代码使用更少的内存。)

    使用int 代替float 似乎不太可能让您的网站明显更快。 如果您想要一个安全的价格类型,请使用decimalhttp://docs.python.org/library/decimal.html

    【讨论】:

      【解决方案4】:

      您可以制作自己的模板过滤器,只需将输入除以 100 即可满足您的需求。例如:

      在 my_app/templatetags/currency_helper.py 中:

      from django import template
      register = template.Library()
      
      @register.filter
      def to_currency(value):
          return float(value) / 100.0
      

      然后在你的模板中:

      {% load currency_helper %}
      
      etc...
      
      {{item.price|to_currency}}
      

      另外,如果我是你,我会将货币值作为十进制字段存储在你的数据库中,以避免这样做或处理舍入错误带来的麻烦。

      【讨论】:

        猜你喜欢
        • 2015-01-31
        • 2012-06-03
        • 1970-01-01
        • 2011-03-29
        • 2020-10-28
        • 2011-09-11
        • 2011-06-18
        • 2014-09-02
        • 2011-04-12
        相关资源
        最近更新 更多