Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; enchiffres_struct has a deprecated constructor in /home/_om/om/pub/www.miakinen.net/vrac/nec.php on line 177
Écriture des nombres en français

Écriture des nombres en français

1. Historique de cette page

Le 31 mars 2003, un contributeur du groupe francophone news:fr.comp.lang.php demanda s'il était possible d'adapter pour le langage PHP un programme écrit dans un autre langage et réalisant la conversion en lettres d'un montant écrit en chiffres.

Étant passionné à la fois par les nombres, par la langue française et par la programmation, je me suis aussitôt approprié la question. J'ai commencé par étudier quelques-uns des nombreux programmes que j'ai pu trouver sur le web : chacun de ceux que j'ai lus contenait au moins une erreur et aucun n'expliquait clairement ses choix d'écriture. De plus, la plupart des programmes étaient incapables de représenter des nombres plus grands que quelques centaines de milliards. J'en ai trouvé un capable d'écrire n'importe quel nombre, aussi grand soit-il [graner], mais son auteur avait fait le choix d'éviter le mot milliard que j'estimais indispensable.

Tout ceci m'a convaincu d'écrire par moi-même un programme qui soit le plus complet possible, en documentant précisément chaque choix d'écriture. Pour cela j'ai commencé par collecter toutes les informations que j'ai pu, tant dans les livres dont je dispose (le Quid 1997 [quid], le Petit Robert 1990 et 2002 [robert]) que sur Internet et sur Usenet.

La page que vous lisez contient le résultat de cette recherche documentaire, ainsi que le programme et son mode d'emploi.

2. Écriture des nombres en lettres

Où mettre des traits d'union

La règle traditionnelle est relativement simple. On utilise des traits d'union pour écrire les nombres composés plus petits que cent sauf autour du mot et (qui remplace alors le trait d'union). Partout ailleurs, il n'y a que des espaces. Exemples : dix-sept (17), vingt et un (21), trente-deux mille cinq cent soixante et onze (32 571).

Avec les recommandations orthographiques de 1990 c'est encore plus facile, du moins pour les nombres pas trop grands. Tous les numéraux composés sont unis par des traits d'union : trente-deux-mille-cinq-cent-soixante-et-onze (32 571). Seuls les noms tels que millier, million ou milliard ne sont ni précédés ni suivis d'un trait d'union : trente-deux millions cinq-cent-soixante-et-onze-mille (32 571 000). Rappelons à toutes fins utiles qu'il ne s'agit que de recommandations et qu'elles ne sont nullement obligatoires.

Accord de cent et de quatre-vingts

Le mot cent est invariable sauf quand il est précédé d'un nombre qui le multiplie et n'est pas suivi par un autre nombre cardinal.

Pour mettre cent au pluriel, il faut donc (première condition) qu'il soit précédé d'un nombre qui le multiplie. Par exemple deux cents (200) (deux fois cent) mais mille cent (1 100) (mille plus cent).

La deuxième condition est qu'il ne doit pas être suivi par un autre nombre cardinal. Ainsi on écrira deux cent trois (203) et deux cent mille (200 000). En revanche, on écrit deux cents millions (200 000 000) et deux cents milliards (200 000 000 000) car million et milliard sont des noms et pas des adjectifs cardinaux.

Le mot vingt dans quatre-vingts (80) suit exactement la même règle que le mot cent. On écrira quatre-vingt-un (81) et quatre-vingt mille (80 000) mais quatre-vingts millions (80 000 000).

Notez que dans certaines expressions vingt et cent peuvent être multipliés par des nombres plus grands que dix. Exemples : onze cents (synonyme de mille cent) et les Quinze-Vingts (hospice fondé à Paris par Saint Louis pour 300 aveugles). Selon Hanse-Blampain [hanse], la numérotation par centaines est courante jusqu'à 1999 (dix-neuf cent quatre-vingt-dix-neuf), et on dit beaucoup plus souvent onze cents, douze cents que mille cent, mille deux cents. On dit même onze cent mille hommes (1 100 000).

À propos de mille

Historiquement, mille était le pluriel de mil, ce qui explique pourquoi mille est invariable. L'écriture mil n'est possible que pour des dates, et elle n'est nullement obligatoire. Comme l'écrit Dominique Didier, la distinction entre les deux graphies est parfaitement oiseuse si on veut encore la pratiquer aujourd'hui (source : http://www.langue-fr.net/index/M/mille.htm#complements). Ceci est d'ailleurs confirmé par Hanse-Blampain [hanse].

C'est aussi Hanse-Blampain [hanse] qui signale que mille n'est pas suivi directement de et quand il s'agit d'un nombre précis, mille et un exprimant généralement un grand nombre indéterminé (Les mille et une nuits).

Grands nombres : 1270-1961, sept siècles d'histoire

Depuis son invention vers 1270, le mot million a toujours représenté la même chose, à savoir mille milliers (1 000 000). Au delà du million en revanche la nomenclature des nombres a une histoire un peu plus mouvementée. Au final, on se retrouve avec deux règles distinctes – et contradictoires – pour nommer les grands nombres : la règle (N), dite aussi échelle longue ; et la règle (n-1) ou règle latine, dite aussi échelle courte.

Un petit aperçu des deux règles de nommage.
nombre
en chiffres
règle (N) ou
échelle longue
règle (n-1) ou
échelle courte
106 = 1 000 000 106×1million 103×2million
109 (milliard) 103×3billion
1012 106×2billion 103×4trillion
1015 (billiard) 103×5quadrillion
1018 106×3trillion 103×6quintillion
1021 (trilliard) 103×7sextillion
106N, 103n 106×N{N}illion 103×n{n-1}illion

C'est en 1484 que l'algoriste français Nicolas Chuquet rédige le Triparty en la science des nombres. Dans cet ouvrage, il propose d'écrire les grands nombres par tranches de six chiffres séparées par des points, créant donc naturellement l'échelle longue. Il n'était d'ailleurs pas le premier à le faire puisque la première attestation date de 1475, par Jehan Adam. L'ouvrage de Chuquet ne sera pas publié avant 1880, mais sa nomenclature est reprise par Estienne de la Roche en 1520 dans Larismetique nouellement composee.

J'ai d'abord trouvé sur la toile deux extraits du Triparty : l'image sur le site d'Alain Bois, lui-même l'ayant trouvée sur The MacTutor History of Mathematics archive (page en anglais) ; le texte en clair dans un article d'André Cauty, complété par moi-même et par Jean Poulain sur [f.l.l.f.].

En avril 2004, un lecteur de mon site, Bernhard Graf, me signala quelques erreurs d'interprétation. Le texte qui suit tient compte de ses remarques.

Extrait en image de l'ouvrage de Nicolas Chuquet
« Item lon doit savoir que ung million vault mille milliers de unitez, et ung byllion vault mille milliers de millions, et [ung] tryllion vault mille milliers de byllions, et ung quadrillion vault mille milliers de tryllions et ainsi des aultres : Et de ce en est pose ung exemple nombre divise et punctoye ainsi que devant est dit, tout lequel nombre monte 745324 tryllions 804300 byllions 700023 millions 654321. Exemple : 745324'8043000'700023'654321. »

L'histoire serait trop simple si elle devait s'arrêter là. Au 17e siècle, des mathématiciens réussissent à imposer en France une corruption du système de Chuquet qu'ils trouvent plus pratique : l'échelle courte. La plupart des autres pays ayant conservé l'échelle longue, il en résulte une belle pagaille, avec toutes les difficultés de communication que l'on imagine. En 1948, la neuvième Conférence Générale des Poids et Mesures déconseille l'usage de l'échelle courte. Enfin, le 3 mai 1961, l'échelle longue devient la seule légale en France.

Hélas, parmi les très rares pays à avoir adopté l'échelle courte figurent les États-Unis d'Amérique. Depuis quelques années, l'influence des USA se fait sentir sur d'autres pays jusqu'ici conservateurs, en particulier la Grande-Bretagne : en 1974, le gouvernement du premier ministre Harold Wilson annonce que le terme billion désignera le nombre 109 au lieu de 1012 dans les communications officielles. J'ai trouvé ce dernier renseignement, ainsi que d'autres très intéressants, sur A Dictionary of Units of Measurement (page en anglais). Entre un système pratiqué dans la plupart des pays d'Europe et un autre pratiqué aux États-Unis, il n'est pas sûr que l'on parvienne un jour à un terrain d'entente.

En avril 2004, profitant de la remarque de Bernhard Graf pour faire une nouvelle recherche sur le sujet, j'ai trouvé deux autres liens passionnants, quoique en anglais. Le premier, sur la Home Page of Sizes, comprend de larges extraits de documents anciens, dont le Triparty. L'autre est un article de Bernard Comrie sur la LINGUIST List qui, après une partie historique, fait le point sur l'étendue géographique des deux systèmes en 1996.

Pour conclure cet historique, voici un résumé des dates clés en France :

vers 1270
Invention du million.
1475
Jehan Adam utilise déjà les mots bymillion et trimillion selon l'échelle longue.
1484
Nicolas Chuquet écrit le Triparty en la science des nombres.
Les nombres byllion, tryllion, quadrillion, quillion, sixlion, septyllion, octyllion et nonyllion suivent l'échelle longue.
1520
Estienne de la Roche : Larismetique nouellement composee.
1544
Invention du milliart, cité par Jacques Peletier en 1549.
1688
Nouvelle graphie pour le milliard.
17e siècle
Passage à l'échelle courte, avec les noms billion, trillion, quadrillion, quintillion et sextillion.
1880
Publication du Triparty.
1948
La 9e CGPM déconseille l'usage de l'échelle courte.
1961
Décret n° 61-501 du 3 mai 1961.
Retour à l'échelle longue, avec les noms billion, trillion, quatrillion, quintillion et sextillion.

Grands nombres : zillions et zilliards

Compter jusqu'au sextillion c'est bien. Mais après ? Comment s'appelle le septième nombre en -illion ? Et le vingtième, le centième, le millionième, le sextillionième ? Pour répondre à cette angoissante question, John Conway et Allan Wechsler ont inventé un système permettant de nommer n'importe quel « zillion », aussi grand soit-il. Le sujet était suffisamment riche pour que j'en fasse une page à part, d'autant plus que la nomenclature de Conway et Wechsler est loin d'avoir la reconnaissance officielle des six premiers zillions. Ayant pris moi-même la responsabilité de la francisation du système, je me suis permis d'appeler immodestement cette page Les zillions selon Conway, Wechsler... et Miakinen.

Notez que Nicolas Graner, sur sa page Le nom des nombres, emploie aussi un système adapté de celui de Conway et Wechsler. Comme moi Nicolas a francisé le quatrillion et accentué le décillion. En revanche, il a laissé les autres préfixes non accentués et il a conservé le quinqua de Conway et Wechsler.

En marge de ce système, on trouve aussi le milliard qui vaut mille millions, et par extension le billiard qui vaut mille billions, le trilliard qui vaut mille trillions, etc. Pour le milliard, quoiqu'il ne fasse pas partie de la dénomination légale, il n'en est pas illégal pour autant. Il est simplement en dehors du champ d'application du décret – qui ne légifère qu'à partir de 1012 – mais il est d'usage parfaitement courant. Au contraire, les billiards, trilliards et autres zilliards n'existent pas en français bien qu'on les trouve parfois cités sur des pages anglophones.

Septante, huitante ou octante, nonante

Là où le français de référence utilise maintenant soixante-dix (70), quatre-vingts (80) et quatre-vingt-dix (90), des formes plus anciennes sont toujours employées, et même d'usage courant, selon les pays ou les régions.

Sur le sujet, une excellente lecture semble être le Dictionnaire suisse romand d'André Thibault. Un résumé par Jean Fontaine se trouve sur http://www.langue-fr.net/index/S/septante.htm.

Les ordinaux

Tandis qu'un nombre cardinal sert à exprimer une quantité (un livre de cent soixante pages), un nombre ordinal exprime un numéro d'ordre (le vingtième chapitre ou le chapitre vingt).

Un nombre ordinal est invariable : la page quatre-vingt (80), l'année mille neuf cent (1900). Bien qu'il soit plutôt rare d'avoir besoin de très grands ordinaux, http://www.langue-fr.net/index/M/mille.htm#essentiel indique que tous les éléments d'un ordinal sont invariables. Ainsi, on écrira que le numéro quatre-vingt milliard cinq cent million (80 500 000 000) est le quatre-vingt milliard cinq cent millionième.

3. Programme de conversion en lettres

Le programme que j'ai écrit pour convertir des Nombres En Lettres se trouve dans le fichier nel.php dont vous pouvez télécharger ici le code source.

Syntaxe

string enlettres(string chiffres [, int options [, string séparateur ]])

chiffres est le nombre en chiffres à écrire en lettres. Il est de type string (chaîne de caractères) pour pouvoir traiter des grands entiers, mais les conversions de type implicites de PHP permettent de passer un entier en paramètre.

options peut prendre comme valeur n'importe laquelle des constantes entières définies dans les sections suivantes. Sauf cas particuliers, il est possible de combiner plusieurs constantes au moyen d'un « OU binaire : | » ; certaines combinaisons sont d'ailleurs prédéfinies. La valeur par défaut est 0 (aucune option).

séparateur est une chaîne de caractères qui ne sert que pour les grands nombres. Elle est utilisée pour séparer les grands blocs de nombres, et ne se retrouve qu'après les noms tels que million(s), milliard(s), billion(s), etc., sauf s'il s'agit du tout dernier mot. La valeur par défaut est une chaîne constituée d'une seule espace : ' '.

void enlettres_options(int options [, string séparateur ])

Plutôt que d'appeler la fonction enlettres() plusieurs fois avec les mêmes options et/ou le même séparateur, il est plus pratique de les positionner une fois pour toute grâce à la fonction enlettres_options().
« enlettres_options(0, ' '); » restitue les valeurs originales.

ASTUCE : Pour ces deux fonctions, il est possible de modifier le paramètre options sans changer de séparateur, simplement en omettant ce dernier paramètre. Mais il est aussi possible de ne changer que séparateur : il suffit de donner à options la valeur NULL.

Utilisation

L'utilisation de base est on ne peut plus simple. Il suffit d'inclure le script PHP, puis d'appeler la fonction enlettres() en lui passant comme paramètre l'entier à convertir. La sortie du script ci-dessous sera : « un million quarante-huit mille cinq cent soixante-seize ».

<?php
include_once('nel.php');
echo enlettres(1048576);
?>

Notez que le nombre peut être passé sous la forme d'une chaîne de caractères, encadré par des guillemets simples ou doubles. C'est même indispensable pour les grands nombres, PHP risquant sinon de les transformer en nombres à virgule flottante, avec perte des derniers chiffres.

echo enlettres('1099511627776');
echo enlettres("1099511627776");

Tout ce qui n'est pas un chiffre dans le paramètre est ignoré. C'est très pratique car cela permet de passer à la fonction un nombre déjà formaté pour l'écriture en chiffres, avec des espaces (usage actuel), ou des points (usage ancien), ou des virgules (usage anglo-américain), ou n'importe quoi d'autre, par exemple des espaces insécables HTML (&nbsp;).

echo enlettres('1 099 511 627 776');
echo enlettres('1.099.511.627.776');
echo enlettres('1,099,511,627,776');

$nombre = '1&nbsp;099&nbsp;511&nbsp;627&nbsp;776';
echo "enlettres($nombre) = " . enlettres($nombre);

Le dernier exemple donne : « enlettres(1 099 511 627 776) = un billion quatre-vingt-dix-neuf milliards cinq cent onze millions six cent vingt-sept mille sept cent soixante-seize ».

Attention ! La contrepartie de la souplesse décrite ci-dessus, c'est qu'il faut s'assurer que la chaîne de caractères contient bien un entier positif et rien d'autre. Par exemple, enlettres('+10,48 et -5,76') et enlettres(1.048500000E76) retourneront tous deux la même valeur que enlettres('1048576'), à savoir : « un million quarante-huit mille cinq cent soixante-seize ».

Rectifications orthographiques de 1990

Par défaut la règle traditionnelle est utilisée, c'est-à-dire que l'on ne trouve de traits d'union que dans les nombres plus petits que cent, sauf autour du mot et. Pour appliquer la rectification de 1990 qui remplace toutes les espaces par des traits d'union dans les nombres inférieurs au million, il faut utiliser l'option NEL_RECTIF_1990.

enlettres('31 612 322')
trente et un millions six cent douze mille trois cent vingt-deux
enlettres('31 612 322', NEL_RECTIF_1990)
trente-et-un millions six-cent-douze-mille-trois-cent-vingt-deux

Grands nombres : après les sextillions

Par défaut, le programme n'utilise pour écrire les grands nombres que les six premiers noms en -illion, ceux définis par le décret du 3 mai 1961 : million, billion, trillion, quatrillion, quintillion et sextillion, cela bien sûr selon l'échelle longue. Au delà, ce sont des millions de sextillions, des sextillions de sextillions ou des billions de sextillions de sextillions de sextillions.

Pour avoir des septillions au lieu de millions de sextillions, ou des vigintillions au lieu de billions de sextillions de sextillions de sextillions, il faut utiliser l'option NEL_TOUS_ZILLIONS. Les règles précises de construction de ces nombres sont détaillées dans Les zillions selon Conway, Wechsler... et Miakinen.

enlettres('1 000000 000000 000000 000000 000000 000000 000000')
un million de sextillions
enlettres('1 000000 000000 000000 000000 000000 000000 000000', NEL_TOUS_ZILLIONS)
un septillion

Grands nombres : milliards et autres zilliards

Conformément à l'usage, le programme écrit par défaut un milliard plutôt que mille millions, mais il n'utilise aucun autre mot en -illiard. Il est possible de changer ce comportement par défaut, soit en utilisant l'option NEL_SANS_MILLIARD qui supprime l'usage du milliard, soit en utilisant l'option NEL_AVEC_ZILLIARD qui au contraire rajoute l'usage du billiard, du trilliard, etc. (jusqu'au sextilliard si l'option NEL_TOUS_ZILLIONS n'est pas positionnée, sans limite si elle l'est).

enlettres('1001 002002 003003 004004')
mille un trillions deux mille deux billions trois milliards trois millions quatre mille quatre
enlettres('1001 002002 003003 004004', NEL_SANS_MILLIARD)
mille un trillions deux mille deux billions trois mille trois millions quatre mille quatre
enlettres('1001 002002 003003 004004', NEL_AVEC_ZILLIARD)
un trilliard un trillion deux billiards deux billions trois milliards trois millions quatre mille quatre

Notez que les options NEL_SANS_MILLIARD et NEL_AVEC_ZILLIARD sont mutuellement exclusives, et que le comportement du programme n'est pas défini si elles sont positionnées toutes les deux.

Grands nombres : faciliter la lecture

Pour améliorer la lisibilité des très grands nombres, il est possible d'utiliser l'option NEL_RECTIF_1990 déjà vue plus haut. Mais on peut aussi modifier la chaîne de caractères séparant les grands blocs de nombres – les millions, milliards, etc.

Par défaut il s'agit d'une simple espace, comme partout où il n'y a pas de traits d'union. Selon les besoins, on peut vouloir ajouter une virgule ou remplacer l'espace par un saut de ligne. Dans une page HTML, c'est la séquence <br> qui réalise le saut de ligne. (<br /> pour du XHTML).

enlettres('1111 002222 003333 004444')
mille cent onze trillions deux mille deux cent vingt-deux billions trois milliards trois cent trente-trois millions quatre mille quatre cent quarante-quatre
enlettres('1111 002222 003333 004444', NEL_RECTIF_1990)
mille-cent-onze trillions deux-mille-deux-cent-vingt-deux billions trois milliards trois-cent-trente-trois millions quatre-mille-quatre-cent-quarante-quatre
enlettres('1111 002222 003333 004444', NULL, ', ')
mille cent onze trillions, deux mille deux cent vingt-deux billions, trois milliards, trois cent trente-trois millions, quatre mille quatre cent quarante-quatre
enlettres('1111 002222 003333 004444', NULL, '<br>')
mille cent onze trillions
deux mille deux cent vingt-deux billions
trois milliards
trois cent trente-trois millions
quatre mille quatre cent quarante-quatre
enlettres('1111 002222 003333 004444', NEL_RECTIF_1990, ',<br>')
mille-cent-onze trillions,
deux-mille-deux-cent-vingt-deux billions,
trois milliards,
trois-cent-trente-trois millions,
quatre-mille-quatre-cent-quarante-quatre

Variantes régionales

La forme de base pour l'écriture des nombres de 70 à 99 est le français de référence. Des variantes sont possibles en utilisant une ou plusieurs des options suivantes :

Les options NEL_HUITANTE et NEL_OCTANTE sont bien sûr mutuellement exclusives, mais toute autre combinaison de deux ou trois options est possible et généralement souhaitable. D'ailleurs les combinaisons suivantes sont prédéfinies :

NEL_BELGIQUE
Vaut (NEL_SEPTANTE|NEL_NONANTE) et correspond à l'usage en Belgique et en Suisse romande sauf quelques cantons.
NEL_VVF
Vaut (NEL_SEPTANTE|NEL_HUITANTE|NEL_NONANTE) et correspond à l'usage dans les cantons de Vaud, Valais et Fribourg.
NEL_ARCHAIQUE
Vaut (NEL_SEPTANTE|NEL_OCTANTE|NEL_NONANTE). Sauf erreur, octante n'est plus employé du tout, du moins pas en Belgique ou en Suisse.

Le choix de ces combinaisons et de leurs noms m'a été suggéré par le contenu de la page http://www.langue-fr.net/index/S/septante.htm. Toute information supplémentaire de même que toute suggestion d'amélioration seront accueillies avec bienveillance.

Suit un tableau récapitulant les différences entre le français de référence et les trois variantes prédéfinies. Notez qu'une variante linguistique est typiquement un cas pour lequel on appéciera l'utilisation de enlettres_options().

options70-7980-8990-99
0soixante-dix
soixante et onze
soixante-douze
...
quatre-vingts
quatre-vingt-un
quatre-vingt-deux
...
quatre-vingt-dix
quatre-vingt-onze
quatre-vingt-douze
...
NEL_BELGIQUEseptante
septante et un
septante-deux
...
quatre-vingts
quatre-vingt-un
quatre-vingt-deux
...
nonante
nonante et un
nonante-deux
...
NEL_VVFseptante
septante et un
septante-deux
...
huitante
huitante et un
huitante-deux
...
nonante
nonante et un
nonante-deux
...
NEL_ARCHAIQUEseptante
septante et un
septante-deux
...
octante
octante et un
octante-deux
...
nonante
nonante et un
nonante-deux
...

Ordinaux

Pour écrire un nombre ordinal plutôt qu'un nombre cardinal, on peut utiliser l'une des deux options suivantes.

Notez que enlettres(1, NEL_NIEME) retourne « premier » au masculin et qu'il n'existe aucune option pour lui faire retourner le féminin « première ». On peut raisonnablement penser qu'il est plus facile de traiter cet unique cas à part, plutôt que de rajouter une option qui sera inutile dans tous les autres cas.

Par ailleurs, enlettres(0, NEL_NIEME) retourne « zéroïème » et pas « zéroième ». Alors que je l'avais toujours écrit sans tréma, une discussion avec Pierre Hallet sur [f.l.l.f.] en septembre 2003 m'a convaincu que j'avais tort. Quant à « zérotième » que l'on trouve parfois, je ne l'envisage pas une seule seconde.

4. Écriture des nombres en chiffres

L'écriture des petits nombres entiers en chiffres ne pose pas de problèmes : 37 ou 215. Pour faciliter la lecture, les nombres plus grands peuvent être partagés en tranches de trois chiffres par un petit espace, par exemple 1 048 576 (1).

En principe, cette séparation des milliers ne s'applique qu'aux nombres désignant des quantités, et pas aux nombres ordinaux. Ainsi, on doit écrire la chambre 2502 ou l'an 2003, et il en va de même pour les codes postaux : 94600. Néanmoins, pour des nombres de plus de cinq ou six chiffres, je pense – et je ne suis pas le seul – que l'on devrait tout de même séparer les chiffres pour des raisons de lisibilité (source : propos de Franck Antoni et Sébastien Morin dans [f.l.l.f.], archivés sur http://www.langue-fr.net/index/M/mille.htm#fllf).

Pour les nombres non entiers, une virgule sépare la partie entière de la partie décimale (4 502,35 euros) mais certains pays ont conservé l'usage britannique de mettre un point à la place de la virgule, et parfois aussi une virgule entre les blocs de trois chiffres (4,502.35).

Dans quelques pays (Inde et Pakistan), les chiffres sont séparés par paires, sauf les 3 premiers (10,00,000 = 1 000 000) [quid].

(1) Pour être cohérent, je devrais utiliser ici l'espace fine, c'est-à-dire « &thinsp; » ou « &#8201; ». Néanmoins, ce caractère est encore peu supporté par les navigateurs, aussi j'ai choisi d'utiliser l'espace insécable « &nbsp; » à la place.

5. Programme de conversion en chiffres

Le programme que j'ai écrit pour convertir des Nombres En Chiffres se trouve dans le fichier nec.php dont vous pouvez télécharger ici le code source.

Il est en fait constitué de deux fonctions. La première analyse le nombre en lettres et rend un nombre sous forme compacte (tous les chiffres à la suite), ce qui le rend utilisable pour des calculs. L'autre formate le nombre en l'« aérant » (c'est-à-dire typiquement en rajoutant des espaces), dans un but d'affichage.

Syntaxe

string enchiffres(string lettres)

lettres est le nombre en lettres à écrire en chiffres.

Le résultat est de type string (chaîne de caractères) pour pouvoir supporter des grands entiers. Néanmoins, si le nombre n'est pas trop grand, il peut être utilisé directement comme un entier grâce aux conversions de type implicites de PHP.

string enchiffres_aerer(string chiffres [, string blanc [, string virgule [, int tranche ]]])

chiffres est le nombre en chiffres à « aérer ». Les paramètres suivants définissent le type de traitement à effectuer.

blanc est le séparateur utilisé entre les tranches de chiffres. En français il s'agit d'un espace blanc. L'anglais britannique semble utiliser un blanc aussi, tandis qu'en anglais américain c'est une virgule. La valeur par défaut est ' '.

virgule est le séparateur utilisé pour les nombres non entiers, entre la partie entière et la partie décimale. Il est reconnu par la fonction pour savoir dans quel sens compter les tranches de chiffres (de droite à gauche pour la partie entière, de gauche à droite pour la partie décimale). Ce séparateur est une virgule en français, un point en anglais. La valeur par défaut est ','.

tranche est la taille d'une tranche de chiffres. Cette taille est la même pour l'ensemble du nombre, et la fonction enchiffres_aerer() ne peut donc pas être utilisée pour formater un nombre selon l'usage en vigueur en Inde et au Pakistan (10,00,000). La valeur par défaut est 3.

Utilisation

Là encore l'utilisation de base est on ne peut plus simple. La sortie du script ci-dessous sera : « 10 503 ».

<?php
include_once('nec.php');
$nombre = enchiffres('dix mille cinq cent trois');
echo enchiffres_aerer($nombre);
?>

Notez que la fonction enchiffres_aerer() permet de diviser et punctoyer les nombres comme l'entendait Nicolas Chuquet dans le Triparty, et par la même occasion de s'apercevoir que son exemple contenait un zéro de trop !

enchiffres_aerer('7453248043000700023654321', ' · ', ',', 6)
7 · 453248 · 043000 · 700023 · 654321
enchiffres_aerer('745324804300700023654321', ' · ', ',', 6)
745324 · 804300 · 700023 · 654321

Principe de la conversion

Tandis que le programme de conversion en lettres est assez élémentaire (élémentaire dans le sens d'univoque plutôt que de facile), le principe de la conversion en chiffres mérite quelques explications. En effet, alors que toute suite de chiffres décimaux, quels qu'ils soient et dans n'importe quel ordre, donne toujours un nombre correct, ce n'est plus vrai pour les nombres écrits en lettres. Par exemple, « cinq mille deux cents » est un nombre mais « cinq deux mille cents » ou « cents mille deux cinq » n'en sont pas.

Il serait particulièrement difficile d'écrire un programme capable d'analyser une suite de mots en français pour déterminer si oui ou non il s'agit d'un nombre. Un tel programme devrait par exemple accepter « vingt et un » et « vingt-deux », refuser « vingt-un » et « vingt et deux », mais accepter « mille et un » comme « mille un ». On pourrait même imaginer des règles plus complexes, par exemple accepter aussi bien « septante » que « soixante-dix », sauf s'ils sont tous les deux présents dans le même nombre (septante mille soixante-dix).

Ce projet d'intelligence artificielle est tout-à-fait hors de portée de mes humbles ambitions et du temps que j'envisage d'y consacrer. Par ailleurs, il serait considérablement plus gros, plus complexe et plus lent que le petit programme que je propose ici.

Pour rester dans le domaine du raisonnable, mon programme suppose que le nombre en lettres qu'on lui passe est correct. Si c'est bien le cas, alors il rendra un nombre en chiffres correspondant à ce qu'on lui aura fourni en entrée. Sinon, le résultat sera probablement fantaisiste mais il n'y aura aucun message d'erreur. Garbage In, Garbage Out.

Grâce à cette hypothèse préalable, il n'est plus nécessaire de connaître l'ensemble des mots utilisés (le programme ignore les mots et, de et zéro), ni la place des traits d'union ou les règles de pluriel. On peut accepter indifféremment les deux graphies mille ou mil, ainsi que toutes les variantes régionales.

Algorithme

L'algorithme de base est le suivant pour les nombres inférieurs au million : « lire de gauche à droite, ajouter les nombres plus petits, et multiplier par les nombres plus grands ».

Ajouter les nombres plus petits :
mille cent soixante-dix-sept (1 177) vaut 1 000 + 100 + 60 + 10 + 7.
Multiplier par les nombres plus grands :
deux cent mille (200 000) vaut 2 × 100 × 1 000.
Combinaisons diverses :
cinq cent quatre-vingt-six mille vingt et un (586 021) vaut (((5×100) + (4×20) + 6) × 1 000) + 20 + 1.

La principale difficulté réside dans la détermination de l'ordre des opérations. En effet, dans mille quatre-vingts (1 080) il faut effectuer la multiplication avant l'addition (1 000 + (4 × 20)) alors que dans vingt-quatre mille (24 000) c'est l'inverse ((20 + 4) × 1 000).

J'ai vu un autre piège mais qui ne se rencontre que pour des cas très particuliers, par exemple onze cent mille (1 100 000). L'erreur consisterait à effectuer les calculs intermédiaires avant de déterminer s'il faut additionner ou multiplier. Un algorithme simpliste calculerait 11 × 100 = 1 100, puis déciderait d'ajouter 1 000 du fait que 1 100 est supérieur à 1 000, donnant donc le résultat faux 2 100. En réalité, il faut bien multiplier 1 100 par 1 000 car 100 est inférieur à 1 000.

6. Tester les programmes

Tout d'abord, sachez que tous les exemples de cette page utilisent abondamment les deux programmes nel.php et nec.php.

Par ailleurs, une page de test vous permet d'essayer les programmes de conversion dans un sens et dans l'autre, avec toutes les options que vous voulez.

7. Références

[quid]
Quid 1997, Éditions Robert Laffont.
On y trouve les règles d'écriture en chiffres, et aussi l'énoncé des grands nombres.
[robert]
Petit Robert 1, Éditions Le Robert.
L'édition 1990 inclut un tableau des noms des nombres.
L'édition 2002 est plus claire sur les règles d'accord de cent et quatre-vingts.
[hanse]
Hanse-Blampain, quatrième édition électronique 2001.
http://www.deboeck.be/prod/hanse/
Je n'y ai malheureusement pas accès moi-même, mais (sic) en a cité de large extraits sur f.l.l.f.
[langue-fr]
Langue française
http://www.langue-fr.net
Cet excellent site de Luc Bentz sur la langue française est indispensable pour qui ne possède pas la collection complète de tous les dictionnaires de bons usages ou de difficultés, ou qui ne lit pas f.l.l.f. en permanence depuis des années. À voir absolument
[aparo]
Association Pour l'Application des Recommandations Orthographiques
http://www.fltr.ucl.ac.be/FLTR/ROM/ess.html
C'est sur ce site belge, en particulier dans le paragraphe 5 du chapitre II, que j'ai trouvé les rectifications proposées pour l'écriture des nombres.
[f.l.l.f.]
news:fr.lettres.langue.francaise
« [Ce] forum traite de tout ce qui concerne la langue française, orale ou écrite, dans ses divers aspects [...] » [http://www.langue-fr.net/faq/charte.htm].
Grâce à l'enthousiasme de ses participants, j'y ai vite trouvé de nombreuses réponses... et surtout de nouvelles questions ! C'est ainsi par exemple que j'ai intégré à mon programme les rectifications orthographiques de 1990 ou les ordinaux.
[google]
Google
http://www.google.com ou http://www.google.fr
Un moteur de recherche sur Internet, très pratique pour rechercher sur le web des pages traitant d'un sujet donné. Notez que pour se servir le plus efficacement possible d'un tel outil, il est particulièrement utile de savoir ouvrir un lien dans une nouvelle fenêtre.
[ggroupes]
Google Groupes
http://groups.google.fr/advanced_group_search
La version « groupes de discussion » du moteur de recherche Google. La page de recherche avancée permet de limiter sa recherche, par exemple, au groupe de discussions fr.lettres.langue.francaise [f.l.l.f.].
[graner]
Le nom des nombres
http://www.graner.net/nicolas/nombres/nom.php
Nicolas Graner propose un programme écrit en Perl pour afficher les nombres en lettres (mais si vous lui demandez gentiment il vous enverra probablement la version PHP). C'est sur cette page que j'ai découvert la nomenclature de Conway et Wechsler.

8. Remerciements

Je voudrais remercier toutes les personnes grâce auxquelles cette page a vu le jour.


Date de création : mardi 15 avril 2003.
Date de dernière modification : samedi 1er mai 2004.

Pour toute remarque, critique, demande d'amélioration, etc. concernant cette page, n'hésitez pas à me contacter. Olivier Miakinen