Nombres en Lettres

Nombres en Lettres

Un programme informatique devant retranscrire un nombre en lettres peut sembler une tâche simple…

Mais, les bizarreries de la langue française rendent très difficile la création d’un tel algorithme de conversion.

 

En liminaire :

La règle : Les nombres <100 qui sont composés de numéraux sont unis par un trait d’union (exemple « dix-huit »),

Sauf : les composés « et un » exemple « trente et un » (La réforme de l’académie française de 1990 autorise les traits d’union sur « et un » donc par exemple ce n’est plus une faute d’écrire « vingt-et-un » au lieu de « vingt et un »).

 

Concernant les unités :

Pas de problème… chaque chiffre a un correspondant littéral :

0 zéro,

1 un,

2 deux,

3 trois,

4 quatre,

5 cinq,

6 six,

7 sept,

8 huit,

9 neuf

 

Concernant les dizaines : cela se complique…

En effet :

a)     dans la dizaine « 10 » il y des « exceptions »

b)     les dizaines ont un correspondant littéral sauf pour 70 et 90 et aussi 80 qui est « capricieux »

c)     Exceptions dans la composition au niveau des « 1 » de chaque dizaine


Alors, ne parlons plus de « d’exceptions » mais « particularités » à gérer…

 

Pour a)

Les « particularités » dans la dizaine « 10 » sont majeures donc pas de règle :

  • 11 onze (et non « dix-un » ni « dix et un »),
    12 douze,
    13 treize,
    14 quatorze,
    15 quinze,
    16 seize
  • Par contre les suivants sont « conformes » :
    17 dix-sept,
    18 dix-huit
    et 19 dix-neuf

 

Pour b)

10 dix,
20 vingt,
30 trente,
40 quarante,
50 cinquante,
60 soixante :
tout est ok

mais

70 s’écrit « soixante-dix » (60+10) et non « septante » (comme en Belgique ou Suisse équivalent « seventy » aux Anglo-Saxons à traduction égale)

90 s’écrit « quatre-vingt-dix » (80+10) et non « nonante » (comme en Belgique ou Suisse équivalent «ninety » aux Anglo-Saxons à traduction égale)

Reste 80 qui s’écrit chez nous « quatre-vingts », (4 x 20 !?) on pourrait le prendre comme une « littéral » mais il en est rien du tout car c’est bien 4 fois le vingt et il prend donc un « s » (s’il n’est pas suivi d’un nombre, tout comme « 100 » mais on y reviendra plus tard).
Donc « quatre-vingts » prend un « s » mais 84 « quatre-vingt-quatre » n’en prend pas. Il aurait pu s’appeler « octante » ou « huitante » (comme en Belgique ou en Suisse ou équivalent «eighty » Anglo-Saxons à traduction égale)

 

Pour c)

La règle : Les 1 de chaque dizaines s’écrivent avec « et un » sans trait d’union. Donc 21 « vingt et un »,
31 « trente et un »,
41 « quarante et un »,
51 « cinquante et un »,
61 « soixante et un »

Sauf : 11 « onze », 71 « soixante-et-onze », 91 « quatre-vingt-onze » et le vilain 81 « quatre-vingt-un » (par de « et un » et sans le ‘s’ à vingt… car il est suivi d’un nombre…)

 

La suite

         Centaines (100)

a)     Comme VINGT, le CENT il y a une règle : il prend la marque du pluriel s’il est multiplié par un nombre ET (exception à la règle) s’il n’est pas suivi d’un nombre. Exemple 200 = « deux cents », 201 = « deux cent un »

b)     Pour 100 : On écrit CENT et non UN CENT


Milliers (1000)

         a) Mille est invariable (n’a pas de « s ») et n’a pas de trait d’union.
         Historiquement cela s’expliquerait ( ?) par le fait que « Mille » est le pluriel de « mil »…

         b) pour 1000 : on écrit MILLE et non UN MILLE

 

MILLION et MILLIARD

a) Les mots million et milliard sont des noms, ils prennent donc la marque du pluriel. (1 milliard, 2 milliards)

b) pour 1 000 000 on écrit « UN MILLION »

         c) c’est un nom et non un adjectif numéral : donc « huit millions deux euros » (contrairement à « deux cent deux euros »)

 

Les textes des nombres de cette classe ont été vérifiés dans le « petit Robert » et le « Larousse » (qui semblent d’accord pour une fois).

 

 

Pour information

Word sait convertir des chiffres en lettres !

Il fait des fautes et ne gère pas les décimales : mais c’est un bon début

 

Pour transformer un nombre en lettre dans word :

Tapez : CTRL F9

Dans les accolades tapez : =98 \*CardText

 

 

Concernant ma classe :

 

Avant de l’écrire j’ai cherché une solution existante (ne pas ré-inventer la roue),

         J’ai trouvé une fonction publiée en novembre 2004 par « Aumeric » (Alias Eric Leisseler) Lien : http://www.atoutfox.org/articles.asp?ACTION=FCONSULTER&ID=0000000067

 

Je lui ai trouvée plusieurs bugs (sur les vingt et cent mais surtout après 1 million), j’ai essayé de les corriger, et comme elle ne gère pas la conformité des traits d’unions et surtout les décimales, et qu’elle est orientée pour des unités monétaires entières et elle ajoute des ‘s’ : J’ai décidé de réaliser une classe plutôt qu’une fonction, cela m’a pris un week-end complet pour me documenter sur les règles et exceptions et coder : Ce n’est pas un exercice simple !

J’imagine que Eric a du galérer aussi !

 

Ma classe commence par créer une collection des exceptions.
Puis travaille dessus récursivement par nombre de 3 chiffres.

Le but est de pouvoir gérer des valeurs numéraires, mais aussi des dates, et tous autres chiffres comme les températures, numéros de téléphone, pourcentages, etc…

 

La classe a comme propriétés :

nNombre = 0  && nombre a convertir

cUnitesEntiers = "euros"  && Unité du nombre au pluriel

cUnitesDecimales  = "centimes"   && Unité des décimales au pluriel

nDecimales = 2  && nombre de décimales à mettre en lettres

cLiaison = "et"  && libellé de la liaison

lLettresDecimaleSiZero = .F.  && si la décimale vaut 0, afficher "et zéro centime" ?

 

La classe a comme méthodes:

Convert([surchage nNombre], ;
[surchage cUnitesEntiers], ;
[surchage cUnitesDecimales], ;
[surchage nDecimales], ;
[cLiaison])

 

Je pense enrichir et facilement rapidement la classe d’une fonction « speak() » lisant dans le haut parleur du PC le nombre sélectionné.

 

Cordialement

Francis Faure

Téléchargez la classe (14.58 Ko)

Reproduction totale ou partielle strictement interdite • KitWebWan Again