2010-11-04 33 views
3

在我的項目中,我要求用戶提供一些度量,價格和權重。我想將數據存儲爲一個兩位十進制值。我想我應該使用DecimalField而不是FloatField,因爲我不需要太高的精度。如何在Django中集中使用floatformat

當我在我的模板中打印值時,我不希望打印零非顯着小數。

例子:

10.00應顯示簡單的10

10.05應顯示10.05

我不想使用floatformat過濾器在每個模板我顯示值,太多的地方。所以我想知道是否有一些方法能夠以集中的方式影響爲所有應用程序提供的值。

感謝

+1

在'10.00'你怎麼知道'.00'是否重要? 「零非重要小數」假定有人宣稱什麼是重要的。這是如何指定的? – 2010-11-04 17:04:40

+0

在數字的數學方法中很重要。小數零不重要,這就是我的意思是非重要的小數。如果不改變任何東西,我不想顯示零。 – maraujop 2010-11-04 17:22:21

+0

@maraujop:「不要改變什麼」是一個人的判斷。這是一個定義問題。 2.0是**不是**與2相同。數字可能很重要,因爲工程師需要知道測量的準確性。您不能隨機刪除尾隨零。您需要首先定義有多少個零是重要的,然後可以丟棄不重要的多餘零。 – 2010-11-04 21:37:57

回答

2

你試過Django的插件Humanize

你可能會在那裏找到你要找的東西。

編輯

你是對的,人性化過濾器不會在這裏做的工作。 在挖掘了django內置過濾器和標籤後,我找不到任何解決您問題的東西。因此,我認爲你需要一個自定義過濾器。喜歡的東西...

from django import template 

register = template.Library() 

def my_format(value): 
    if value - int(value) != 0: 
     return value 
    return int(value) 

register.filter('my_format',my_format) 
my_format.is_safe = True 

而且在你的Django模板,你可以做這樣的事情......

{% load my_filters %} 
<html> 
<body> 
{{x|my_format}} 
<br/> 
{{y|my_format}} 
</body> 
</html> 

對於價值xy1.01.1分別將顯示:

1 
    1.1 

我希望這有助於。

+0

我知道這個插件,我不明白它是如何幫助我的。 – maraujop 2010-11-04 16:41:08

+0

@maraujop你是對的。我認爲你需要一個自定義過濾器。查看答案新版本。 – 2010-11-04 18:04:01

+0

感謝msalvadores爲您的努力,但我認爲有一個名爲floatformat的內置過濾器標籤已經可以完成這項工作。我的問題是,我不想編輯我的所有模板,每次渲染這些值時都要添加一個過濾器。這是超過300倍。我可以做一個grep | sed,但我正在尋找一個集中式解決方案,並不意味着要更改模板,添加過濾器,標籤或上下文處理器。 – maraujop 2010-11-04 18:45:31

0

如何以這樣的方式在模型的屬性是:

_weight = models.DecimalField(...) 
weight = property(get_weight) 

def get_weight(self): 
    if self._weight.is_integer(): 
     weight = int(self._weight) 
    else: 
     weight = self._weight 
    return weight