1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238
| unit UConversionNombreLettres;
{$mode delphi}{$H+}
// Traduction du code de Pyramidev en C++ pour convertir un nombre en toutes lettres
// Trois approches sont possibles en Pascal : procédurale, objet et composant.
// Celle-ci est la version procédurale.
// (c) Thierryc 2018
interface
uses
Classes, SysUtils;
type TEntierBorneParle = 0..99;
type TContexteLangue = (clParDefaut, clFrance, clQuebec, clBelgique, clSuisseRomande, clSuisseRomandeGeneve, clSenegal);
type TNombreEnChaine = type string;
type EConversioNombre = class(Exception);
function ConvertirNombreEnChaine( unEntier: TEntierBorneParle; unContexte: TContexteLangue): TNombreEnChaine;
implementation
type TUnites = 0..9;
type TUnitesComposees = 0..19;
type TDizainesNormales = 2..6;
type TDizaines = 0..9;
//toutes les chaines déclarées dans un block "resourceString" sont modifiables dans l'éxecutable par un éditeur de ressources.
resourceString
//séparateurs de nombres
rsEspaceNombre = ' ';
rsTiretNombre = '-';
rsEt = ' et ';
//Unités:
rsZero = 'zéro';
rsUn = 'un';
rsDeux = 'deux';
rsTrois = 'trois';
rsQuatre = 'quatre';
rsCinq = 'cinq';
rsSix = 'six';
rsSept = 'sept';
rsHuit = 'huit';
rsNeuf = 'neuf';
//Entre dix et dix-neuf
rsDix = 'dix';
rsOnze = 'onze';
rsDouze = 'douze';
rsTreize = 'treize';
rsQuatorze = 'quatorze';
rsQuinze = 'quinze';
rsSeize = 'seize';
//dizaines
rsVingt = 'vingt';
rsTrente = 'trente';
rsQuarante = 'quarante';
rsCinquante = 'cinquante';
rsSoixante = 'soixante';
//entiers par contexte..
rs70ParDefault = 'soixante-dix';
rs70Belge = 'septante';
rs80ParDefault = 'quatre-vingts';
rs80SuisseRomande = 'huitante';
rs90ParDefault = 'quatre-vingt-dix';
rs90Belge = 'nonante';
//messaqes d'erreur:
eUniteNonComprise = 'unité non comprise';
eDizaineNonComprise = 'dizaine non comprise';
eNombrePasCompris = 'Nombre pas compris';
procedure DecomposerNombre( unEntier : TEntierBorneParle; out lUnite: TUnites; out laDizaine: TDizaines);
begin
lUnite := unEntier mod 10;
laDizaine := unEntier div 10;
end;
function ConvertirNombreEntre00et10( unEntier: TUnites; unContexte: TContexteLangue = clParDefaut): TNombreEnChaine;
begin
case unEntier of
0 : result := rsZero;
1 : result := rsUn;
2 : result := rsDeux;
3 : result := rsTrois;
4 : result := rsQuatre;
5 : result := rsCinq;
6 : result := rsSix;
7 : result := rsSept;
8 : result := rsHuit;
9 : result := rsNeuf;
10 : result := rsDix;
else
raise EConversioNombre.Create( eUniteNonComprise) ;
end;
end;
function ConvertirDizaines( uneDizaine: TDizainesNormales; unContexte: TContexteLangue = clParDefaut): TNombreEnChaine;
begin
case uneDizaine of
2 : result := rsVingt;
3 : result := rsTrente;
4 : result := rsQuarante;
5 : result := rsCinquante;
6 : result := rsSoixante;
else
raise EConversioNombre.Create( eDizaineNonComprise);
end;
end;
function ComposerChainesDizainesEtUnites( laDizaine: TNombreEnChaine; lUnite: TNombreEnChaine) : TNombreEnChaine;
begin
if lUnite = rsZero then
result := laDizaine
else if ((lUnite=rsUn) or (lUnite=rsOnze)) and (laDizaine<>rs80ParDefault) then
result := laDizaine + rsEt + lUnite
else
result := laDizaine + rsTiretNombre + lUnite;
end;
function ConvertirNombreEntre11et19( unEntier: TEntierBorneParle; unContexte: TContexteLangue): TNombreEnChaine;
begin
case unEntier of
11 : result := rsOnze;
12 : result := rsDouze;
13 : result := rsTreize;
14 : result := rsQuatorze;
15 : result := rsQuinze;
16 : result := rsSeize;
17..19 : result := rsDix + rsTiretNombre + ConvertirNombreEntre00et10( unEntier mod 10);
else
raise EConversioNombre.Create(eNombrePasCompris);
end;
end;
function ConvertirNombreEntre20et69( unEntier: TEntierBorneParle; unContexte: TContexteLangue): TNombreEnChaine;
var
laDizaine : TDizainesNormales;
lUnite : TUnites;
nbreDizaines : TNombreEnChaine;
nbreUnites : TNombreEnChaine;
begin
DecomposerNombre(unEntier, lUnite, laDizaine);
nbreDizaines := ConvertirDizaines(laDizaine);
nbreUnites := ConvertirNombreEntre00et10(lUnite);
result := ComposerChainesDizainesEtUnites(nbreDizaines, nbreUnites);
end;
function ConvertirNombreEntre70et79( unEntier: TEntierBorneParle; unContexte: TContexteLangue): TNombreEnChaine;
var
lUnite : TUnites;
lUniteComp : TUnitesComposees;
nbreDizaines : TNombreEnChaine;
nbreUnites : TNombreEnChaine;
begin
case unContexte of
clBelgique, clSuisseRomande, clSuisseRomandeGeneve :
begin
lUnite:= unEntier - 70;
nbreDizaines := rs70Belge;
nbreUnites := ConvertirNombreEntre00et10(lUnite);
result := ComposerChainesDizainesEtUnites(nbreDizaines, nbreUnites);
end
else
begin
nbreDizaines := rsSoixante;
lUniteComp := unEntier - 60;
nbreUnites := ConvertirNombreEnChaine(lUniteComp, unContexte);
result := ComposerChainesDizainesEtUnites(nbreDizaines, nbreUnites);
end;
end;
end;
function ConvertirNombreEntre80et89( unEntier: TEntierBorneParle; unContexte: TContexteLangue): TNombreEnChaine;
var
laDizaine : TDizainesNormales;
lUnite : TUnites;
nbreDizaines : TNombreEnChaine;
nbreUnites : TNombreEnChaine;
begin
DecomposerNombre(unEntier, lUnite, laDizaine);
case unContexte of
clSuisseRomande : nbreDizaines := rs80SuisseRomande;
else
nbreDizaines := rs80ParDefault;
end;
nbreUnites:=ConvertirNombreEntre00et10(lUnite);
result := ComposerChainesDizainesEtUnites(nbreDizaines, nbreUnites);
end;
function ConvertirNombreEntre90et99( unEntier: TEntierBorneParle; unContexte: TContexteLangue): TNombreEnChaine;
var
laDizaine : TDizainesNormales;
lUniteComp : TUnitesComposees;
lUnite : TUnites;
nbreDizaines : TNombreEnChaine;
nbreUnites : TNombreEnChaine;
begin
case unContexte of
clBelgique, clSuisseRomande, clSuisseRomandeGeneve :
begin
lUnite := unEntier - 90;
nbreDizaines := rs90Belge;
nbreUnites := ConvertirNombreEntre00et10(lUnite);
result := ComposerChainesDizainesEtUnites(nbreDizaines, nbreUnites);
end
else
begin
nbreDizaines := rs80ParDefault;
lUniteComp := unEntier - 80;
nbreUnites := ConvertirNombreEnChaine(lUniteComp, unContexte);
result := ComposerChainesDizainesEtUnites(nbreDizaines, nbreUnites);
end;
end;
end;
function ConvertirNombreEnChaine( unEntier: TEntierBorneParle; unContexte: TContexteLangue): TNombreEnChaine;
begin
case unEntier of
00..10 : result := ConvertirNombreEntre00et10(unEntier, unContexte);
11..19 : result := ConvertirNombreEntre11et19(unEntier, unContexte);
20..69 : result := ConvertirNombreEntre20et69(unEntier, unContexte);
70..79 : result := ConvertirNombreEntre70et79(unEntier, unContexte);
80..89 : result := ConvertirNombreEntre80et89(unEntier, unContexte);
90..99 : result := ConvertirNombreEntre90et99(unEntier, unContexte);
end;
end;
end. |
Partager