Development #27699
Créer un filtre Django |Decimal
0%
Description
Il est déjà dans la doc et dois permettre de transformer une variable texte en nombre.
Message Jabber de Fred : il pourrait être plus intelligent que le Decimal() pur de Python, genre il accepterait les virgules comme séparateur.
Fichiers
Révisions associées
Historique
Mis à jour par Thomas Noël il y a plus de 5 ans
Oui mais bon, j'ai du mal à voir l'usage exact, car Django ne permet pas d'opération de calcul ensuite (ce qui est le cas d'usage des décimaux)
Mis à jour par Frédéric Péters il y a plus de 5 ans
- Fichier 0001-misc-add-a-decimal-template-tag-27699.patch 0001-misc-add-a-decimal-template-tag-27699.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Mis à jour par Paul Marillonnet il y a plus de 5 ans
Pareil je vois pas l'usage.
Sinon s/confort/comfort/
dans le patch (une des lignes de commentaire).
Mis à jour par Frédéric Péters il y a plus de 5 ans
L'exemple dans la documentation c'est :
form_var_nombre_de_reservations|decimal > 1 : À partir de deux réservations, la condition sera vérifiée.
Oui ça marcherait aussi bien avec un |int à inventer ou le natif |floatformat, ou un hack façon |add:0 mais |decimal offre ici quelque chose de plus clair à lire, je trouve.
Mis à jour par Thomas Noël il y a plus de 5 ans
Sur le cas d'usage :
form_var_nombre_de_reservations|decimal > 1
En Django ça va crasher sur '' > 1
→ TemplateSyntaxError
Il faudrait plutôt renvoyer None quand on n'arrive pas à décoder.
In [7]: Template('{% if 2 > 1 %}ok{% endif %}').render(Context({})) Out[7]: u'ok' In [8]: Template('{% if None > 1 %}ok{% endif %}').render(Context({})) Out[8]: u'' In [9]: Template('{% if '' > 1 %}ok{% endif %}').render(Context({})) TemplateSyntaxError: Not expecting '>' in this position in if tag.
Mis à jour par Frédéric Péters il y a plus de 5 ans
- Fichier 0001-misc-add-a-decimal-template-tag-27699.patch 0001-misc-add-a-decimal-template-tag-27699.patch ajouté
Les chaines en template django c'est "", pas '', c'est ça qui fait échouer cette affaire.
Retourner la chaine vide, c'est le comportement usuel des filtres Django, ce que fait |floatformat, en version très courte :
try: input_val = repr(text) d = Decimal(input_val) except UnicodeEncodeError: return ''
ou |first,
@register.filter(is_safe=False) def first(value): """Returns the first item in a list.""" try: return value[0] except IndexError: return ''
(patch actualisé avec "comfort" et des tests de condition)
Mis à jour par Thomas Noël il y a plus de 5 ans
- Statut changé de Solution proposée à Solution validée
Frédéric Péters a écrit :
Les chaines en template django c'est "", pas '', c'est ça qui fait échouer cette affaire.
Quel boulet. On verra ce qui se passera avec Python3, autre affaire, pour plus tard.
Retourner la chaine vide, c'est le comportement usuel des filtres Django, ce que fait |floatformat, en version très courte :
Ok.
Reste le passage avec le .normalize() dont je n'étais pas sûr, parce que
In [26]: Decimal('1000').quantize(Decimal('1.0000')).normalize() Out[26]: Decimal('1E+3')
mais ça passe, Django affiche bien "1000".
Autre truc pas bien compris mais je suis fatigué, Decimal('toto') ça fait chez moi une InvalidOperation et pas une ArithmeticError.
Mais vu que les tests passent, ack.
Mis à jour par Frédéric Péters il y a plus de 5 ans
Autre truc pas bien compris mais je suis fatigué, Decimal('toto') ça fait chez moi une InvalidOperation et pas une ArithmeticError.
class DecimalException(ArithmeticError): ... class InvalidOperation(DecimalException): ...
Mis à jour par Frédéric Péters il y a plus de 5 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit 9e2226a713910ffc07826eb5104b22bf0cfcb647 Author: Frédéric Péters <fpeters@entrouvert.com> Date: Wed Oct 31 12:06:20 2018 +0100 misc: add a |decimal template tag (#27699)
Mis à jour par Frédéric Péters il y a plus de 5 ans
- Statut changé de Résolu (à déployer) à Solution déployée
misc: add a |decimal template tag (#27699)