Author: Jean Claude Servaye
Converting integer to plain text in French
Answer:
1 function IntToLetters(N: Integer): string;
2
3 function Mille(N: Integer; P: Integer): string;
4
5 // Calcul des nombre de 0..99
6 function Cent(N: Integer): string;
7 const
8 X: array[0..20] of string =
9 ('zero', 'un', 'deux', 'trois', 'quatre', 'cinq', 'six', 'sept', 'huit',
10 'neuf',
11 'dix',
12 'onze', 'douze', 'treize', 'quatorze', 'quinze', 'seize', 'dix-sept',
13 'dix-huit', 'dix-neuf', 'vingt');
14 Y: array[2..10] of string =
15 ('vingt', 'trente', 'quarante', 'cinquante', 'soixante', 'soixante',
16 'quatre-vingt', 'quatre-vingt', 'cent');
17 var
18 A, B: Integer;
19 R, C: string;
20 begin
21 // Si le nombre est inferieur ou egal a 20 on a la solution directe
22 if (N <= 20) then
23 begin
24 R := X[N];
25 end;
26 // Si le nombre est superieur a 20
27 if (N > 20) and (N < 100) then
28 begin
29 // on prend la dizaine
30 A := N div 10;
31 // on pend l'unité
32 B := N mod 10;
33 // si l'unité est un, le séparateur est 'et'
34 if (B = 1) and (A in [2, 3, 4, 5, 6, 7]) then
35 C := ' et '
36 else
37 C := ' ';
38 // si l'unite est supérieure a 1, le séparateur est un '-'
39 if (B > 1) and (A in [2, 3, 4, 5, 6, 7, 8, 9]) then
40 C := '-';
41 // si la dizaine est 7 ou 9 on compte les unités de 10 ? 19
42 if (A = 7) or (A = 9) then
43 B := B + 10;
44 // On calcule la solution
45 if (B = 0) then
46 R := Y[A]
47 else
48 R := Y[A] + C + X[B];
49 end;
50 Result := R;
51 end;
52
53 // Calcul des nombres de 100..999
54 var
55 A, B: Integer;
56 R: string;
57 begin
58 if (N >= 100) then
59 begin
60 // on prend la centaine
61 A := N div 100;
62 // on prend le reste
63 B := N mod 100;
64 if (A = 0) or (A = 1) then
65 begin
66 // si la centaine est 0 ou 1
67 // on calcule et on 'cent' est au singulier
68 if (B = 0) then
69 R := 'cent '
70 else
71 R := 'cent ' + Cent(B);
72 end
73 else
74 begin
75 // si la centaine est > 1
76 if (P = 0) then
77 begin
78 // si c'est la fin d'un nombre (P=0)
79 // on mets 'cents' au pluriel si pas d'unité sinon on met 'cent' au
80 singulier
81 if (B = 0) then
82 R := Cent(A) + ' cents '
83 else
84 R := Cent(A) + ' cent ' + Cent(B);
85 end
86 else
87 begin
88 // si ce n'est pas la fin d'un nombre 'cent' est au singulier
89 if (B = 0) then
90 R := Cent(A) + ' cent '
91 else
92 R := Cent(A) + ' cent ' + Cent(B);
93 end;
94 end;
95 end
96 else
97 begin
98 // si le nombre est inférieur a 100 on le calcule directement
99 R := Cent(N);
100 end;
101 Result := R;
102 end;
103
104 // Function principale
105 const
106 Z: array[0..3] of string =
107 ('', 'mille', 'million', 'milliard');
108 var
109 B, I: Integer;
110 R, M: string;
111 begin
112 R := '';
113 I := 0;
114 // On va décomposer en tranche de 1000 en partant de la droite
115 while (N > 0) do
116 begin
117 // prend une tranche (reste de la division par 1000)
118 B := N mod 1000;
119 // le pluriel est utilisé a partir des milliers
120 if (I = 0) then
121 M := ' '
122 else
123 M := 's ';
124 if I = 1 then
125 begin
126 // on calcule la tranche des milliers
127 // si le nombre de milliers est supérieur a 1 on ecrit le nombre et 'milles'
128 if (B > 1) then
129 R := Mille(B, I) + ' ' + Z[I] + M + R;
130 // sinon on éecrit 'mille' et pas 'un mille'
131 if (B = 1) then
132 R := Z[I] + ' ' + R;
133 end
134 else
135 begin
136 // on calcule les millions et suivants
137 // on mets un 's' au pluriel
138 if (B > 1) then
139 R := Mille(B, I) + ' ' + Z[I] + M + R;
140 // on n'en met pas au singulier
141 if (B = 1) then
142 R := Mille(B, I) + ' ' + Z[I] + ' ' + R;
143 end;
144 // on decale de 3 rangs vers la droite
145 N := N div 1000;
146 I := I + 1;
147 end;
148 if (R = '') then
149 R := 'zéro';
150 Result := R;
151 end;
|