2011-06-11 85 views
1

在我的數據庫中,我有一個整數字段存儲價格信息,如「10399」,「84700」。 顯示時,它們應該是「$ 103.99」和「$ 847.00」。使用Django模板過濾器進行數學運算嗎?

我需要int * 0.01來顯示。

我想知道是否有使用Django模板過濾器的方法嗎?像:

{{ item.price|int_to_float_and_times_0.01 }} 

另一個問題,其實我選擇了整數,因爲我認爲它會比在數據庫中使用float更高效。真的嗎?

+0

整數幾乎總是認爲代表錢儲存PU的最佳方式rposes。 – cwallenpoole 2011-06-11 23:26:02

回答

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}} 

另外,如果我是你,我會在你的數據庫中存儲的貨幣值小數場,以避免這樣做或處理的頭痛舍入誤差。通過如果你Python版本支持它去掉括號

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

(你也可以把它生成:

0

您可以將它們傳遞給模板背景下,例如與列表理解之前只需修改整數,它會讓你的代碼使用更少的內存。)

使用int而不是float似乎不太可能使您的網站顯着更快。 如果你想要一個安全的類型,價格,使用decimalhttp://docs.python.org/library/decimal.html

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是不是在一個函數名允許

0

可以使用widthratio templatetag除法:

${% widthratio item.price 100 1 %} 

(結果是(A/B)* C,如果A,B,C對於widthratio的3個參數)

將導致:$103.99(10399對)

+0

'widthratio'返回一個整數'{%widthratio 10399 100 1%}'給出'104',而不是'103.99' – guival 2016-05-23 16:21:43