Development #57983
Ajouter des filtres pour convertir un nombre en toutes lettres
0%
Description
Soit les filtres |as_numeral et |as_numeral_currency, en utilisant la lib num2words https://github.com/savoirfairelinux/num2words.
D'ordinaire les filtres sont dupliqués dans combo et wcs, tentative ici de les mutualiser via hobo.
Fichiers
Demandes liées
Révisions associées
Historique
Mis à jour par Valentin Deniaud il y a plus de 2 ans
- Fichier 0001-templatetags-add-as_numeral-filters-57983.patch 0001-templatetags-add-as_numeral-filters-57983.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Ça fonctionne bien mais on sent que c'est pas une lib des plus robustes, genre en conversion en monnaie '42' la chaîne de caractères donne « quarante-deux euros » mais 42 le nombre donne « zéro euros et quarante-deux centimes » (d'où le stringfilter
qui masque ça en convertissant tout en string comme si de rien n'était).
Les filtres arrivent bien utilisables dans wcs et combo, juste pour wcs j'espère qu'il n'y a pas de situation où ça planterait sur une variable lazy.
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
- Statut changé de Solution proposée à Solution validée
Valentin Deniaud a écrit :
Ça fonctionne bien mais on sent que c'est pas une lib des plus robustes, genre en conversion en monnaie '42' la chaîne de caractères donne « quarante-deux euros » mais 42 le nombre donne « zéro euros et quarante-deux centimes » (d'où le
stringfilter
qui masque ça en convertissant tout en string comme si de rien n'était).
J'ai l'impression qu'il y a une règle implicite que les nombres entiers qui sont passés sont forcément des centimes.
Les filtres arrivent bien utilisables dans wcs et combo, juste pour wcs j'espère qu'il n'y a pas de situation où ça planterait sur une variable lazy.
Faut tester via inspect.
Mis à jour par Frédéric Péters il y a plus de 2 ans
j'espère qu'il n'y a pas de situation où ça planterait sur une variable lazy.
Ça va se vautrer.
In [22]: LazyFormDefObjectsManager(formdef)[0].submission_agent.var.zipcode Out[22]: <wcs.variables.LazyFieldVar at 0x7f86c3afa880> In [23]: from num2words import num2words In [24]: num2words(LazyFormDefObjectsManager(formdef)[0].submission_agent.var.zipcode, lang='fr') --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-24-5220576f20fb> in <module> ----> 1 num2words(LazyFormDefObjectsManager(formdef)[0].submission_agent.var.zipcode, lang='fr') ~/src/eo/venv3-2.2-39/lib/python3.9/site-packages/num2words/__init__.py in num2words(number, ordinal, lang, to, **kwargs) 86 raise NotImplementedError() 87 ---> 88 return getattr(converter, 'to_{}'.format(to))(number, **kwargs) ~/src/eo/venv3-2.2-39/lib/python3.9/site-packages/num2words/base.py in to_cardinal(self, value) 108 109 out = "" --> 110 if value < 0: 111 value = abs(value) 112 out = self.negword TypeError: '<' not supported between instances of 'LazyFieldVar' and 'int'
Mis à jour par Valentin Deniaud il y a plus de 2 ans
- Fichier 0001-templatetags-add-as_numeral-filters-57983.patch 0001-templatetags-add-as_numeral-filters-57983.patch ajouté
- Statut changé de Solution validée à Solution proposée
Frédéric Péters a écrit :
Ça va se vautrer.
Je m'en doutais un peu mais comme les filtres dans wcs ne font pas systématiquement unlazy(), je me disais que peut-être avec les filtres simples sur des nombres ce n'était pas nécessaire.
Revoilà avec unlazy() systématique.
Mis à jour par Paul Marillonnet il y a plus de 2 ans
- Lié à Development #57813: mutualiser dans hobo les filtres de gabarit utilisés dans combo et w.c.s. ajouté
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
- Statut changé de Solution proposée à Solution validée
Ok.
Mis à jour par Valentin Deniaud il y a plus de 2 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit 1e2cf7f6188630432deff5eb6b9a1cb3a2bb23a3 Author: Valentin Deniaud <vdeniaud@entrouvert.com> Date: Tue Oct 19 16:29:38 2021 +0200 templatetags: add as_numeral filters (#57983)
Mis à jour par Frédéric Péters il y a plus de 2 ans
- Statut changé de Résolu (à déployer) à Solution déployée
Mis à jour par Frédéric Péters il y a plus de 2 ans
+ assert t.render(Context({'number': 42.15})) == 'quarante-deux virgule un cinq'
(personne ne parle comme ça, si ?)
Mis à jour par Thomas Noël il y a plus de 2 ans
Frédéric Péters a écrit :
(personne ne parle comme ça, si ?)
Si c'était une vrai question : non, personne, du moins pas dans les pays francophones que je connais.
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
Pour currency ça marche à peu près bien et c'est la seule chose qui nous intéresse ici, on pourrait virer l'autre (c'est avec la version 0.5.6 sur la machine combo1.node1.test.saas):
In [12]: num2words.num2words(42, lang='fr', to='currency') Out[12]: 'quarante-deux euros' In [13]: num2words.num2words(42.15, lang='fr', to='currency') Out[13]: 'quarante-deux euros et quinze centimes'
On peut virer l'autre convertisseur s'il déconne trop, Toulouse n'a besoin de que valeurs monétaires (et je pense que c'est le seul cas où on a vraiment ce besoin pour l'instant.
Mis à jour par Paul Marillonnet il y a plus de 2 ans
Benjamin Dauvergne a écrit :
On peut virer l'autre convertisseur s'il déconne trop, Toulouse n'a besoin de que valeurs monétaires (et je pense que c'est le seul cas où on a vraiment ce besoin pour l'instant.
J’ai jeté un coup d’œil au code, c’est un bug oui, il n’y a pas d’option pour une orthographe naturelle des décimales.
On peut soit virer, soit donner un peu d’intelligence au filtre pour, dans le cas d’un flottant, appeler num2words sur les parties entière et décimale séparément.
templatetags: add as_numeral filters (#57983)