2010-11-04 53 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