2010-11-04 10 views
3

Dans mon projet, je demande à l'utilisateur des mesures, des prix et des poids. Je veux stocker les données sous la forme d'une valeur décimale. Je suppose que je devrais utiliser DecimalField au lieu de FloatField, parce que je n'ai pas besoin de beaucoup de précision.Comment utiliser floatformat de façon centralisée dans Django

Lorsque j'imprime des valeurs dans mes modèles, je ne souhaite pas que les nombres décimaux non significatifs soient imprimés.

Exemples:

10,00 doit simplement montrer 10

10,05 annonciez 10,05

Je ne veux pas utiliser le filtre floatformat dans chaque modèle I afficher la valeur, trop d'endroits. Donc, je me demandais s'il y avait un moyen d'affecter la valeur rendue pour toute l'application, de manière centralisée.

Merci

+1

Dans '10.00' comment savoir si le' .00' est significatif ou non? "zéro décimales non significatives" suppose que quelqu'un a déclaré ce qui est significatif. Comment cela va-t-il être spécifié? –

+0

significatif de la manière mathématique des nombres. les zéros décimaux n'ont pas d'importance, c'est ce que je veux dire avec des décimales non significatives. Je ne veux pas que les zéros soient affichés s'ils ne changent rien. – maraujop

+0

@maraujop: "ne change rien" est un jugement qu'une personne fait. C'est une question de définition. 2.0 n'est pas ** identique à 2. Le chiffre peut être significatif car un ingénieur doit connaître l'exactitude de la mesure. Vous ne pouvez pas laisser tomber au hasard des zéros à la fin.Vous devez d'abord définir combien de zéros sont significatifs, puis vous pouvez supprimer des zéros supplémentaires non significatifs. –

Répondre

2

Avez-vous essayé le plug-in django Humanize?

Vous trouverez peut-être ce que vous cherchez.

Modifier

Votre raison, Humaniser filtres ne font pas le travail ici. Après avoir creusé autour des filtres et des tags intégrés de django, je n'ai rien trouvé qui résout votre problème. Par conséquent, je pense que vous avez besoin d'un filtre personnalisé pour cela. Quelque chose comme ...

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 

Et dans votre modèle de django que vous pourriez faire quelque chose comme ...

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

Pour les valeurs x et y, 1.0 et 1.1 respectivement qui montreraient:

1 
    1.1 

J'espère que cela aide.

+0

Je connais le plugin et je ne vois pas comment ça peut m'aider. – maraujop

+0

@maraujop vous avez raison. Je pense que vous avez besoin d'un filtre personnalisé pour cela. Voir réponse nouvelle édition. –

+0

Merci msalvadores pour votre effort, mais je pense qu'il y a un tag de filtre intégré appelé floatformat qui fait déjà le travail. Mon problème est que je ne veux pas éditer tous mes modèles, pour ajouter un filtre chaque fois que je rends ces valeurs. C'est plus de 300 fois. Je pourrais faire un grep | sed, mais je cherche une solution centralisée, qui n'implique pas de changer les templates, d'ajouter des filtres, des tags ou des processeurs de contexte. – maraujop

0

Que diriez-vous d'une propriété dans le modèle de telle sorte que:

_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