Projet

Général

Profil

Development #57983

Ajouter des filtres pour convertir un nombre en toutes lettres

Ajouté par Valentin Deniaud il y a plus de 2 ans. Mis à jour il y a plus de 2 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
19 octobre 2021
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

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

Lié à Hobo - Development #57813: mutualiser dans hobo les filtres de gabarit utilisés dans combo et w.c.s.Fermé13 octobre 2021

Actions

Révisions associées

Révision 1e2cf7f6 (diff)
Ajouté par Valentin Deniaud il y a plus de 2 ans

templatetags: add as_numeral filters (#57983)

Historique

#3

Mis à jour par Valentin Deniaud il y a plus de 2 ans

Ç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.

#4

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.

#5

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'
#6

Mis à jour par Valentin Deniaud il y a plus de 2 ans

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.

#7

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é
#8

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

  • Statut changé de Solution proposée à Solution validée

Ok.

#9

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)
#10

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
#11

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 ?)

#12

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.

#13

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.

#14

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.

Formats disponibles : Atom PDF