使用Django模板过滤器进行数学运算?

时间:2011-06-11 23:16:57

标签: python django templates filter

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

我需要显示int * 0.01。

我想知道是否有办法使用Django模板过滤器?像:

{{ item.price|int_to_float_and_times_0.01 }}

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

4 个答案:

答案 0 :(得分:7)

您可以制作自己的模板过滤器,只需将输入除以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}}

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

答案 1 :(得分:0)

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

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

(如果你的Python版支持它,你也可以通过删除括号使它成为一个生成器,它会使你的代码使用更少的内存。)

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

答案 2 :(得分:0)

我不知道你是否可以返回一个浮点数,但你可以将数字格式化为字符串:

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 :(得分:0)

您可以使用widthratio templatetag进行分割:

${% widthratio item.price 100 1 %}

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

将导致:$103.99(对于10399)