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
| { ======================================================================== }
Function TF_Princ.NombreEnLettres(Valeur : Real; SM : String = '' ; SSM : String = '' ; France : Boolean = True ; Ancien : Boolean = True ) : string;
// Conversion d'un réel à 2 décimales en lettre avec symbole monétaire en option
// Valeur : nombre à convertir
// SM : symbole monétaire (Exemple ou £)
// SSM : sous symbole monétaire (Exemple le centime par défaut)
// France : langue française, sinon belge
// Ancien : si vrai nouvelle orthographe avec trait d'union entre chiffres
Const
Unite : array[1..19] of string = ('un','deux','trois','quatre','cinq','six',
'sept','huit','neuf','dix','onze','douze',
'treize','quatorze','quinze','seize',
'dix-sept','dix-huit','dix-neuf');
DizaineF : array[2.. 9] of string = ('vingt','trente','quarante','cinquante',
'soixante','','quatre-vingt','');
DizaineB : array[2.. 9] of string = ('vingt','trente','quarante','cinquante',
'soixante','septante','octante','nonante');
Coefs : array[0.. 3] of string = ('cent','mille','million','milliard');
Var
Temp : String;
c, d, u : Integer; // centaine, dizaine et unité
Coef : Integer; // Puissance de 10
i : Integer;
Negatif : boolean; // Vrai si nombre négatif
n : Integer ;
Decimales : Real ; // nombre après la virgule
Nombre : Real ; // nombre avant la virgule
Centimes : String ; // Libellé du ou des centimes
Penny : Boolean ; // Vrai si SSM = penny ou pence
Livre : Boolean ; // Vrai pour la livre sterling (cas de une au lieu de un)
Separ : Char ; // Séparateur : espace ou trait d'union
Et : Boolean ; // Présence du 'et'
Begin
Result := '';
// Cas particulier de zéro
If Valeur = 0 Then
Begin
Result := ' zero '+SM;
exit;
End;
// Mémorisation du signe
Negatif := Valeur < 0;
If Negatif Then Valeur := -Valeur;
// Nouvelle ou ancienne orthographe (avec ou sans traits d'union)
If Ancien Then Separ := ' ' Else Separ := '-' ;
// Traitement des décimales
n := Trunc(Valeur) ;
Nombre := n ;
Decimales := Round(Frac(Valeur) * 100) ; // 2 premières décimales
// Traitement de l'unité monétaire : cas spécial de la Livre sterling
Livre := False ;
If ((lowerCase(SM) = 'livre') or (SM = '£')) Then Livre := True ;
// Traitement de la sous unité monétaire
SSM := LowerCase(Trim(SSM)) ;
// Cas spécial du penny
Penny := False ;
If ((SSM = 'penny') or (SSM = 'pence')) Then Penny := True ;
If (SSM = '') Then SSM := 'centime' // cas général si SSM oublié : le centime
Else
Begin
If (SSM[Length(SSM)] = 's') Then
Begin
Delete(SSM, Length(SSM), 1) ; // on met au singulier
End;
End ;
// Traitement de l'unité Monétaire SM
If SM <> EmptyStr Then
If (LowerCase(SM[Length(SM)]) = 's') Then
Begin
Delete(SM, Length(SM), 1) ; // on met au singulier
End;
// Traitement du nombre
Coef := 0 ;
Repeat
Et := False ;
// Récupération de l'unité du bloc de trois chiffres en cours
u:=n mod 10; n:=n div 10;
// Récupération de la dizaine du bloc de trois chiffres en cours
d:=n mod 10; n:=n div 10;
// Traitement des dizaines
Temp := '';
// Passage sur la dizaine inférieure pour 10 à 19
// et pour 70-79 90-99 dans le cas de la France
If (d=1) Or ((d in [7,9])And France) Then
Begin
Dec(d);
Inc(u,10);
End;
If d > 1 Then
Begin
If France Then
Begin
Temp := Separ + DizaineF[d];
Et := False ;
// Ajout du cas particulier de 'et' entre la dizaine et 1
If (d < 8) and ((u = 1) or (u = 11)) Then
Begin
Temp := Temp + Separ + 'et';
Et := True ;
End ;
End
Else
Begin
Temp := Separ + DizaineB[d];
Et := False ;
// Ajout du cas particulier de 'et' entre la dizaine et 1
If (u = 1) Then
Begin
Temp := Temp + Separ + 'et';
Et := True ;
End ;
End;
End;
// Récupération de la centaine du bloc de trois chiffres en cours
c := n mod 10; n := n div 10; {Récupère centaine}
// ajout du trait d'union avant l'unité si nombre < 100 et deux mots
If (((d > 0) or (not Ancien)) And (not Et) And (u <> 0) ) Then
Temp := Temp + '-'
Else If (u > 0) Then Temp := Temp + ' ' Else Temp := Temp + '' ; // Cas de 80 ou de 300 par exemple
// ajout du texte de l'unité
If u > 0 Then
If ((u = 1) And Livre) Then Temp := Temp + 'une' // une livre et non un livre
Else Temp := Temp + Unite[u]; // avant les unités
// ajout du 's' à Quatre-vingt si rien ne suit
If (Result = '') and (d = 8) and (u = 0) and France Then Result := 's';
Result := Temp + Result;
// Traitement de la centaine du bloc de trois chiffres en cours
If c > 0 Then
Begin
Temp := '';
If c > 1 Then Temp := Separ + Unite[c] + Temp;
Temp := Temp + Separ+ Coefs[0]; // Avant cent
// Traitement du cas particulier du 's' à cent si rien ne suit
If (Result = '') and (c > 1) Then Result := 's';
Result := Temp + Result;
End;
// Traitement du prochain groupe de 3 chiffres
If n > 0 Then
Begin
Inc(Coef);
I := n mod 1000;
If (i > 1) and (Coef > 1) Then Result := 's' + Result;
If i > 0 Then Result := Separ+ Coefs[Coef] + Result; // Avant mille
// Traitement du cas particulier 'mille' ( non pas 'un mille' )
If (i = 1) and (Coef = 1) Then Dec(n);
End;
until n = 0;
SM := Trim(SM) ;
If (SM <> '') Then
Begin
If ((Nombre > 1 ) And (Length(SM) > 3)) Then // Ajout ou non d'un s à SM
Result := Trim(Result)+ ' '+ SM + 's'
Else
Result := Trim(Result)+ ' '+ SM ;
If Penny Then // Traitement spécial du penny
Begin
If (Decimales > 0 ) Then
Begin
Centimes := ' penny' ;
If (Trunc(Decimales) > 1) Then Centimes := ' pence' ;
Result := Result + ' et '+IntToStr(Trunc(Decimales)) + Centimes ;
End ;
End
Else
Begin // Autres sous unités
If (Decimales > 0 ) Then
Begin
Centimes := ' '+ SSM ;
If (Trunc(Decimales) > 1) Then Centimes := centimes + 's' ;
Result := Result + ' et '+IntToStr(Trunc(Decimales)) + Centimes ;
End ;
End ;
End
Else
Begin
Result := Trim(Result);
If (Decimales > 0 ) Then
Begin
If (Decimales < 10) Then
Result := Result + ' virgule zéro '+NombreEnLettres(Decimales)
Else
Result := Result + ' virgule '+NombreEnLettres(Decimales) ;
End ;
End ;
// Suppression du - en première position
If (Result[1] = '-') Then Delete(Result,1 , 1) ;
// Ajout du signe en cas de besoin
If Negatif Then Result := 'moins ' + Result;
End;
{ ======================================================================== } |
Partager