/* #! /usr/bin/rexx */ /* Pour les systemes UNIX ou Gnu/LINUX, verifier et adapter la premiere ligne ci-dessus ; pour les autres : la retirer For Unix and Gnu/Linux, check and adapt the first line above, for others you can delete it DGNUMF - CONVERTISSEUR NOMBRES-MOTS EN LANGUE FRANÇAISE version 2.1.000 du 2026-09-11 Copyright 2002 2005 2026 Dominique Guebey https://www.dg77.net/tekno/manuel/dgnumf.htm COMMENTAIRES SUPPLEMENTAIRES : voir en fin de listing MORE COMMENTS : see at the bottom ****************************************** Ce programme a pour fonction la conversion d'un nombre en une proposition en francais. Voir des exemples dans les "commentaires" à la fin. ****************************************** CONDITIONS D'UTILISATION Ce programme est offert sans garantie de fonctionnement. Ce programme est librement utilisable, modifiable et diffusable, meme contre paiement, sous la condition que les memes termes seront applicables a la version ainsi distribuee. ****************************************** PARTICULARITES : language REXX, utilisation des fonctions integrees POS, LENGTH, STRIP, SUBSTR et TRUNC. La presente version s'applique a des nombres limité à 15 chiffres pour la partie entiere et autant pour la partie décimale. Pour des longueurs superieures, le programme restitue les donnees fournies en entrée. ****************************************** REGLES - Séparateur pour décimales : on peut utiliser indifféremment le point ou la virgule. ****************************************** PARAMETRES EN ENTREE 0- "num" : nombre a traiter. 1- "fem" : "f" ou "F" si feminin ("une"), facultatif si parametre suivant non utilise. Sinon tout autre caractere. 2- "unite" : unite ("EURO", "KILO", "BANANE"), par defaut le mot "VIRGULE" sera insere s'il y a lieu entre les unites et decimales. ATTENTION : si inutilisé mais présence d'un des paramètres suivants, alors mettre '*'. 3- "casse" : par défaut, sortie en majuscules. Facultatif, sauf si paramètre suivant utilisé, dans ce cas n'importe quel caractère convient si sortie en majuscule. Sinon : "min", "MIN", "low" ou "LOW" pour des caracteres minuscules. Cas particulier : unités et symboles - qui ne prennent pas la marque du pluriel, - conservent la casse, que les nombres soient en majuscules ou minuscules. Ex. : kg, km/h, USD, kWh, MWh. - nombres en minuscules : "min0", "MIN0", "low0" ou "LOW0", - nombres en majuscules : "maj0", "MAJ0", "upp0" ou "UPP0". 4- Cas particulier de 70, 90 (éventuellement 80) : - "b" ou "B" ("belgo-suisse") 70 -> "septante", 90 -> "nonante" - "r" ou "R" comme b et : 80 -> "huitante" (suisse romande) - "a" ou "A" comme b et : 80 -> "octante" (attesté en Acadie) /////////////////////////////////////////////////////////////////// */ /* INITIALISATIONS */ SIGNAL ON ERROR NAME err SIGNAL ON HALT NAME err SIGNAL ON SYNTAX NAME err phrase = "" flagm = "" flagu = "" flagt = "" /* Longueur maximale des nombres */ NUMERIC digits 18 /* ENTREE DES PARAMETRES //////////////////////////////////// */ PARSE arg numentre fem unite casse xante . num = numentre /* test/demo appel depuis la console */ IF num = '' THEN PARSE UPPER PULL num fem unite casse xante . PARSE UPPER VALUE fem WITH fem PARSE UPPER VALUE xante WITH xante PARSE UPPER VALUE casse WITH casse /* ////////////////////////////////////////////////////////// */ /* Virgule admise, remplacee d'abord par point */ IF POS(",",num) > 0 THEN DO num = SUBSTR(num,1,POS(",",num)-1) || '.' || SUBSTR(num,POS(",",num)+1) END /* Verifier si zone est numerique */ IF datatype(num, N) \= 1 THEN RETURN num unite /* ------------------------------------- */ IF casse = '' THEN casse = 'MAJ' /* ------------------------------------- */ /* gerer le signe */ SELECT WHEN num < 0 THEN DO phrase = "MOINS" signe = "-" m = num * -1 ; num = m END OTHERWISE phrase = "" END /* ------------------------------------- */ /* conserver les decimales */ calc = TRUNC(num, 0) xdec = num - calc entiers = 0 dec = 0 SELECT WHEN POS(".",num) > 0 THEN DO entiers = SUBSTR(num,1,POS(".",num)-1) dec = SUBSTR(num,POS(".",num)+1) END WHEN POS(",",num) > 0 THEN DO entiers = SUBSTR(num,1,POS(",",num)-1) dec = SUBSTR(num,POS(",",num)+1) END OTHERWISE DO entiers = num END END /* Ôte les zéros de gauche */ entiers = STRIP(entiers, L, '0') IF entiers == '' THEN DO zon = phrase "ZERO" ; phrase = zon END /* ///////////////////////// Partie entière ///////////////// */ call traite /* //////////////////////// Unité ///////////////// */ /* PLURIEL ***************************** */ plur = '' zonu = '' wunite = '' IF num >= 2 THEN plur = 'X' SELECT WHEN casse == '*' THEN DO PARSE UPPER VALUE unite WITH wunite END WHEN casse == 'MAJ0' | casse == 'UPP0' | casse == 'MIN0' | casse == 'LOW0' THEN wunite = unite WHEN casse == 'MIN' | casse == 'LOW' THEN PARSE LOWER VALUE unite WITH wunite WHEN casse == 'MAJ' | casse == 'UPP' THEN PARSE UPPER VALUE unite WITH wunite OTHERWISE wunite = unite END unite = wunite /* Unite (4e argument), application ou pas du pluriel */ IF plur == 'X' & unite \== '' & unite \== '*' & casse \== 'MAJ0' & casse \== 'MIN0' & casse \== 'UPP0' & casse \== 'LOW0' & num > 1 THEN DO lz = LENGTH(unite) IF lz < 3 THEN DO IF SUBSTR(wunite,lz,1) \== 'S' & SUBSTR(wunite,lz,1) \== 'X' & SUBSTR(wunite,lz,1) \== 'Z' THEN DO zonu = wunite || 'S' ; unite = zonu END ELSE unite = wunite END ELSE SELECT /* 3 caractères et plus */ WHEN (SUBSTR(wunite,lz-1,2) == "AL" | SUBSTR(wunite,lz-1,2) == "AU") & , (wunite \== 'VAL' & wunite \== 'AVAL' & wunite \== 'BAL' & wunite \== 'CARACAL' & , wunite \== 'CARNAVAL' & wunite \== 'CEREMONIAL' & wunite \== 'CHACAL' & , wunite \== 'CHORAL' & wunite \== 'COPAL' & wunite \== 'FESTIVAL' & , wunite \== 'FINAL' & wunite \== 'GAVIAL' & wunite \== 'MISTRAL' & , wunite \== 'NARVAL' & wunite \== 'NAVAL' & wunite \== 'NOPAL' & , wunite \== 'PAL' & wunite \== 'RECITAL' & wunite \== 'REGAL' & , wunite \== 'RORQUAL' & wunite \== 'SERVAL' & wunite \== 'SISAL') THEN DO ztrav = SUBSTR(wunite,1,(lz-1)) || 'UX' ; wunite = ztrav END WHEN (SUBSTR(wunite,lz-1,2) == "al" | SUBSTR(wunite,lz-1,2) == "au") & , (wunite \== 'val' & wunite \== 'aval' & wunite \== 'bal' & wunite \== 'caracal' & , wunite \== 'carnaval' & wunite \== 'cérémonial' & wunite \== 'chacal' & , wunite \== 'choral' & wunite \== 'copal' & wunite \== 'festival' & , wunite \== 'final' & wunite \== 'gavial' & wunite \== 'mistral' & , wunite \== 'narval' & wunite \== 'naval' & wunite \== 'nopal' & , wunite \== 'pal' & wunite \== 'récital' & wunite \== 'régal' & , wunite \== 'rorqual' & wunite \== 'serval' & wunite \== 'sisal') THEN DO ztrav = SUBSTR(wunite,1,(lz-1)) || 'ux' ; wunite = ztrav END WHEN (SUBSTR(wunite,lz-2,3) == "AIL") & , (wunite \== 'ATTIRAIL' & wunite \== 'BERCAIL' & wunite \== 'CAMAIL' & , wunite \== 'CHANDAIL' & wunite \== 'DETAIL' & wunite \== 'EPOUVANTAIL' & , wunite \== 'EVENTAIL' & wunite \== 'GOUVERNAIL' & wunite \== 'MAIL' & , wunite \== 'PORTAIL' & wunite \== 'RAIL' & wunite \== 'SERAIL') THEN DO ztrav = SUBSTR(wunite,1,(lz-2)) || 'UX' ; wunite = ztrav END WHEN (SUBSTR(wunite,lz-2,3) == "ail") & , (wunite \== 'attirail' & wunite \== 'bercail' & wunite \== 'camail' & , wunite \== 'chandail' & wunite \== 'detail' & wunite \== 'épouvantail' & , wunite \== 'eventail' & wunite \== 'gouvernail' & wunite \== 'mail' & , wunite \== 'portail' & wunite \== 'rail' & wunite \== 'serail') THEN DO ztrav = SUBSTR(wunite,1,(lz-2)) || 'ux' ; wunite = ztrav END /* mot > 2 car et fini par "ou" */ WHEN (SUBSTR(wunite,lz-1,2) == "OU") & (wunite == 'BIJOU' | wunite == 'CAILLOU' | wunite == 'CHOU' | , wunite == 'GENOU' | wunite == 'HIBOU' | wunite == 'JOUJOU' | , wunite == 'POU') THEN DO zonu = wunite || 'X' ; wunite = zonu END WHEN (SUBSTR(wunite,lz-1,2) == "ou") & (wunite == 'bijou' | wunite == 'caillou' | wunite == 'chou' | , wunite == 'genou' | wunite == 'hibou' | wunite == 'joujou' | , wunite == 'pou') THEN DO zonu = wunite || 'x' ; wunite = zonu END /* cas general */ /* ne rien faire pour mot termine par "s" ou "x" */ WHEN SUBSTR(wunite,lz,1) \== 'S' & SUBSTR(wunite,lz,1) \== 's' & SUBSTR(wunite,lz,1) \== 'X' & SUBSTR(wunite,lz,1) \== 'x' & SUBSTR(wunite,lz,1) \== 'Z' & SUBSTR(wunite,lz,1) \== 'z' THEN DO IF casse == "MAJ" | casse == "UPP" | casse == "*" THEN zonu = wunite || 'S' ELSE IF casse == "MIN" | casse == "LOW" THEN zonu = wunite || 's' wunite = zonu END OTHERWISE IF SUBSTR(wunite,lz,1) \== 'S' & SUBSTR(wunite,lz,1) \== 's' & SUBSTR(wunite,lz,1) \== 'X' & SUBSTR(wunite,lz,1) \== 'x' & SUBSTR(wunite,lz,1) \== 'Z' & SUBSTR(wunite,lz,1) \== 'z' THEN DO IF casse == "MAJ" | casse == "UPP" | casse == "*" THEN zonu = wunite || 'S' END ELSE zonu = wunite || 's' wunite = zonu /* Fin du SELECT */ END END phrase = phrase wunite /* ///////////////////////// Partie décimale //////////////// */ IF dec > 0 THEN DO IF unite == "" THEN DO unite = "VIRGULE" zon = phrase unite ; phrase = zon END /* "ZERO..." initiaux */ mult = 1 DO UNTIL ndec = 0 mult = mult * 10 calc = xdec * mult edec = TRUNC(calc, 0) IF edec == 0 THEN DO zon = phrase "ZERO" ; phrase = zon END ndec = calc - edec END /* num = calc */ num = dec call traite END /* ////////////////////////////////////////////////////////// */ /* SORTIE : cf aussi fin "err" */ sortie: /* AS400 */ /* 'CHGDTAARA DTAARA(*LDA (201 328)) VALUE('''phrase''')' */ /* EXIT */ /* Standard : */ /* Conversion en majuscules ou minuscules */ /*IF (casse == 'MIN' | casse = 'LOW') THEN PARSE LOWER VALUE phrase WITH phrase ELSE PARSE UPPER VALUE phrase WITH phrase*/ SAY phrase /* PULL */ RETURN phrase /* ////////////////////////////////////////////////////////// */ /* ************************************** TRAITE : separe le nombre en groupes de 3 chiffres, appelle TRANSF pour chacun ************************************** */ traite: wphrase = '' IF num > 999999999999999 THEN DO /* renvoie entree avec parties entiere et decimale */ phrase = numentre SAY phrase EXIT END wnum = num /* ------------------------------------- */ /* traiter les centaines de milliards */ IF num > 999999999999 THEN DO n = TRUNC(num % 1000000000000, 0) num = num // 1000000000000 dnum = wnum // 1000000000000 IF n > 0 THEN DO CALL TRANSF wphrase = wphrase "MILLE" END IF num < 1000000000 THEN wphrase = wphrase "MILLIARDS" END /* ------------------------------------- */ /* traiter les milliards */ IF num > 999999999 THEN DO n = TRUNC(num % 1000000000, 0) num = num // 1000000000 dnum = wnum // 1000000000 CALL TRANSF IF n == 1 THEN mot = "MILLIARD" ELSE mot = "MILLIARDS" zon = wphrase mot ; wphrase = zon END /* ------------------------------------- */ /* traiter les millions */ IF num > 999999 THEN DO n = TRUNC(num % 1000000, 0) num = num // 1000000 dnum = wnum // 1000000 IF n > 0 THEN DO CALL TRANSF IF n == 1 THEN mot = "MILLION" ELSE mot = "MILLIONS" zon = wphrase mot ; wphrase = zon END END /* ------------------------------------- */ /* traiter les milliers */ IF num > 999 THEN DO n = TRUNC(num % 1000, 0) num = num // 1000 dnum = wnum // 1000 IF n > 0 THEN DO flagm = "X" CALL TRANSF mot = "MILLE" zon = wphrase mot ; wphrase = zon END END /* ------------------------------------- */ /* traiter les unites */ IF num > 0 THEN DO n = num // 1000 dnum = 0 flagu = "X" CALL TRANSF END /* ------------------------------------- */ SELECT WHEN (casse == 'MAJ' | casse == 'MAJ0') THEN DO PARSE UPPER VALUE wphrase WITH wphrase END WHEN (casse == 'MIN' | casse == 'MIN0') THEN DO PARSE LOWER VALUE wphrase WITH wphrase END OTHERWISE wphrase = wphrase END phrase = phrase || wphrase RETURN /* Fin du sous-programme traite */ /* ////////////////////////////////////////////////////////// */ /* TRANSF : separe centaines (c) dizaines (d) unites(u) */ /* d'un nombre de trois chiffres, puis effectue la */ /* conversion en mots */ transf: cnb = n % 100 cent = cnb * 100 diz = TRUNC(n, 0) - cent dnb = diz % 10 utop = diz - (dnb * 10) /* CENTAINES */ mot = " " SELECT WHEN cnb == 2 THEN mot = "DEUX" WHEN cnb == 3 THEN mot = "TROIS" WHEN cnb == 4 THEN mot = "QUATRE" WHEN cnb == 5 THEN mot = "CINQ" WHEN cnb == 6 THEN mot = "SIX" WHEN cnb == 7 THEN mot = "SEPT" WHEN cnb == 8 THEN mot = "HUIT" WHEN cnb == 9 THEN mot = "NEUF" OTHERWISE END IF mot \== " " THEN DO zon = wphrase mot ; wphrase = zon END mot = " " IF cnb = 1 THEN mot = "CENT" IF cnb > 1 THEN DO testot = dnb + utop IF diz == 0 & dnum == 0 THEN mot = "CENTS" ELSE mot = "CENT" END IF mot \== " " THEN DO zon = wphrase mot ; wphrase = zon END /* DIZAINES */ mot = " " SELECT WHEN dnb == 1 THEN IF utop == 0 THEN mot = "DIX" WHEN dnb == 2 THEN mot = "VINGT" WHEN dnb == 3 THEN mot = "TRENTE" WHEN dnb == 4 THEN mot = "QUARANTE" WHEN dnb == 5 THEN mot = "CINQUANTE" WHEN dnb == 6 THEN mot = "SOIXANTE" WHEN dnb == 7 THEN IF xante = "B" | IF xante = "R" | xante = "A" THEN mot = "SEPTANTE" ELSE mot = "SOIXANTE" WHEN dnb == 8 THEN IF xante = "R" THEN mot = "HUITANTE" ELSE IF xante = "A" THEN mot = "OCTANTE" ELSE DO IF utop == 0 & dnum == 0 THEN mot = "QUATRE-VINGTS" ELSE mot = "QUATRE-VINGT" flagt = 'z' END WHEN dnb == 9 THEN DO IF xante == "B" | IF xante == "R" | xante == "A" THEN mot = "NONANTE" ELSE mot = "QUATRE-VINGT" flagt = 't' END OTHERWISE END IF mot \== " " THEN DO zon = wphrase mot ; wphrase = zon END /* UNITES */ mot = " " SELECT WHEN utop == 0 THEN SELECT /* WHEN dnb == 1 THEN mot = "DIX" */ WHEN dnb == 7 THEN IF xante \== "B" & xante \== "R" & xante \== "A" THEN mot = "DIX" WHEN dnb == 9 THEN IF xante \== "B" & xante \== "R" & xante \== "A" THEN mot = "DIX" OTHERWISE END WHEN utop == 1 THEN DO zun = "UN" IF flagu == "X" & fem == "F" THEN zun = "UNE" SELECT WHEN dnb == 0 & cnb > 0 & flagm == "X" THEN mot = zun WHEN dnb == 0 THEN if flagm \== "X" THEN mot = zun WHEN dnb == 8 THEN mot = zun WHEN dnb == 1 THEN mot = "ONZE" WHEN dnb == 7 THEN IF xante \== "B" & xante \== "R" & xante \== "A" THEN mot = "ET ONZE" ELSE mot = "ET" zun WHEN dnb == 9 THEN IF xante \== "B" & xante \== "R" & xante \== "A" THEN mot = "ONZE" ELSE mot = "ET" zun OTHERWISE mot = "ET" zun END END WHEN utop == 2 THEN SELECT WHEN dnb == 1 THEN mot = "DOUZE" WHEN dnb == 7 THEN IF xante \== "B" & xante \== "R" & xante \== "A" THEN mot = "DOUZE" ELSE mot = "DEUX" WHEN dnb == 9 THEN IF xante \== "B" & xante \== "R" & xante \== "A" THEN mot = "DOUZE" ELSE mot = "DEUX" OTHERWISE mot = "DEUX" END WHEN utop == 3 THEN SELECT WHEN dnb == 1 THEN mot = "TREIZE" WHEN dnb == 7 THEN IF xante \== "B" & xante \== "R" & xante \== "A" THEN mot = "TREIZE" ELSE mot = "TROIS" WHEN dnb == 9 THEN IF xante \== "B" & xante \== "R" & xante \== "A" THEN mot = "TREIZE" ELSE mot = "TROIS" OTHERWISE mot = "TROIS" END WHEN utop == 4 THEN SELECT WHEN dnb == 1 THEN mot = "QUATORZE" WHEN dnb == 7 THEN IF xante \== "B" & xante \== "R" & xante \== "A" THEN mot = "QUATORZE" ELSE mot = "QUATRE" WHEN dnb == 9 THEN IF xante \== "B" & xante \== "R" & xante \== "A" THEN mot = "QUATORZE" ELSE mot = "QUATRE" OTHERWISE mot = "QUATRE" END WHEN utop == 5 THEN SELECT WHEN dnb == 1 THEN mot = "QUINZE" WHEN dnb == 7 THEN IF xante \== "B" & xante \== "R" & xante \== "A" THEN mot = "QUINZE" ELSE mot = "CINQ" WHEN dnb == 9 THEN IF xante \== "B" & xante \== "R" & xante \== "A" THEN mot = "QUINZE" ELSE mot = "CINQ" OTHERWISE mot = "CINQ" END WHEN utop == 6 THEN SELECT WHEN dnb == 1 THEN mot = "SEIZE" WHEN dnb == 7 THEN IF xante \== "B" & xante \== "R" & xante \== "A" THEN mot = "SEIZE" ELSE mot = "SIX" WHEN dnb == 9 THEN IF xante \== "B" & xante \== "R" & xante \== "A" THEN mot = "SEIZE" ELSE mot = "SIX" OTHERWISE mot = "SIX" END WHEN utop == 7 THEN SELECT WHEN dnb == 1 THEN mot = "DIX SEPT" WHEN dnb == 7 THEN IF xante \== "B" & xante \== "R" & xante \== "A" THEN DO IF flagt == 't' THEN mot = "DIX-SEPT" ELSE mot = "DIX SEPT" END ELSE mot = "SEPT" WHEN dnb == 9 THEN IF xante \== "B" & xante \== "R" & xante \== "A" THEN DO IF flagt == 't' THEN mot = "DIX-SEPT" ELSE mot = "DIX SEPT" END ELSE mot = "SEPT" OTHERWISE mot = "SEPT" END WHEN utop == 8 THEN SELECT WHEN dnb == 1 THEN mot = "DIX HUIT" WHEN dnb == 7 THEN IF xante \== "B" & xante \== "R" & xante \== "A" THEN DO IF flagt == 't' THEN mot = "DIX-HUIT" ELSE mot = "DIX HUIT" END ELSE mot = "HUIT" WHEN dnb == 9 THEN IF xante \== "B" & xante \== "R" & xante \== "A" THEN DO IF flagt == 't' THEN mot = "DIX-HUIT" ELSE mot = "DIX HUIT" END ELSE mot = "HUIT" OTHERWISE mot = "HUIT" END WHEN utop == 9 THEN SELECT WHEN dnb == 1 THEN mot = "DIX NEUF" WHEN dnb == 7 THEN IF xante \== "B" & xante \== "R" & xante \== "A" THEN DO IF flagt == 't' THEN mot = "DIX-NEUF" ELSE mot = "DIX HUIT" END ELSE mot = "NEUF" WHEN dnb == 9 THEN IF xante \== "B" & xante \== "R" & xante \== "A" THEN DO IF flagt == 't' THEN mot = "DIX-NEUF" ELSE mot = "DIX HUIT" END ELSE mot = "NEUF" OTHERWISE mot = "NEUF" END OTHERWISE END IF mot \== " " THEN DO IF flagt \== 't' THEN DO zon = wphrase mot END ELSE DO zon = wphrase || '-' || mot END wphrase = zon flagt = '' END flagu = "" flagm = " " RETURN /* ////////////////////////////////////////////////////////// */ err: phrase = num /* AS400 */ /* 'CHGDTAARA DTAARA(*LDA (201 328)) VALUE('''phrase''')' */ /* EXIT */ /* standard : */ /*SAY phrase*/ /*PULL*/ /*RETURN phrase*/ /* ////////////////////////////////////////////////////////// */ /* COMMENTAIRES Variables du programme : flagt : pour mettre le tiret au lieu d'espace si "quatre-vingt..." flagm : pour omettre le "un" devant "mille" si c'est ..001000 flagu : pour savoir si "un" a la fin du groupe (..11, ou ..81 etc... plur : gerer le pluriel ****************************************** EXEMPLES 19.5 -> "DIX NEUF VIRGULE CINQ" -101101 f -> "MOINS CENT UN MILLE CENT UNE" 19.50 x EURO -> "DIX NEUF EUROS CINQUANTE" 91 f BANANE MIN b -> "nonante-et une bananes" 670 x KWh MIN0 -> "six cent soixante dix KWh" 93 x CHACAL -> "QUATRE-VINGT-TREIZE CHACALS" 93 x CHEVAL * B -> "NONANTE-TROIS CHEVAUX" ****************************************** HISTORIQUE VERSION 0.9.0 : 2002-05-09 VERSION 0.9.9 : 2002-06-01 - Optimisation : traitement commun partie entiere/partie decimale. - Nombres en quatre-vingt : separation par tirets et non pas espaces. - Gestion amelioree du pluriel de l'unite : - correction : pas de "s" ajoute si deja s ou x a la fin de l'unite. - test ameliore (mots en al et ail...). - plus besoin du 4eme parametre. VERSION 0.9.99 : 2002-10-04 - En cas d'erreur, retourne la valeur entree et non pas null. - Largeur des lignes limitee a 80 caracteres (facilite sur AS400). VERSION 0.9.999 : 2005-05-27 - Pluriels ameliores (ou...). VERSION 1.0.00 : 2026-08-22 - Fonctionne sur des nombres de 12 chiffres. - Optimisation. - Passage direct des paramètres. VERSION 2.0.00 : 2026-08-25 - Fonctionne sur des nombres de 15 chiffres. - Modification de l'ordre des paramètres. - Sortie au choix en caracteres majuscules ou minuscules. VERSION 2.1.00 : 2026-09-11 - Correction : "VAL" n'est plus VAUX au pluriel. - La virgule à la française est admise en place du point décimal. - Pluriel des noms en AU : AUX. - Options supplémentaires R et A pour "belgosuisse". - Unité : options spécifiques pour symboles et unités de mesure (maj0, min0) ****************************************** Reste a voir / TODO : - Les tirets (trente-deux...) voir règles exactes - "...[et] un" doit-il s'appliquer aussi à huitante/octante en version romande et acadienne (ex: 81 f * x a) ? - Utilisation de caractères accentués (utf-8...) */