Salut,
Cet algorithme existe peut-être, mais c'est amusant à bricoler par soi-même. Voilà le principe que j'adopterais : Pour les nombres de 0 à 99, j'encoderais les montants dans un fichier texte (une ligne par montant) que tu charges en mémoire dans un TStringList. L'item[0] = 'zéro', l'item[12] = 'douze'... Il faut convertir ton nombre en string et créer une fonction qui va analyser ce string en fonction de sa longueur (si tu as besoin de décimales, il faudra d'abord traiter la partie entière, puis la partie fractionnaire).
Exemple : 2354 à convertir.
function Transform(var S: string): string; begin case Length(S) of 1,2 : begin Result:= MonStringList.Items[StrToInt(S)]; S:= ''; end; 3: begin if StrToInt(S[1] >= 2 then Result:= MonStringList.Items[StrToInt(S[1])] + ' cent ' else Result:= ' cent '; // problème ici : il faut gérer 'cent' ou 'cents' selon qu'il y a des chiffres après Delete(S,1,1); end; 4 : begin if StrToInt(S[1] >= 2 then Result:= MonStringList.Items[StrToInt(S[1])] + ' mille ' else Result:= ' mille '; // quelle chance, mille est invariable ! Delete(S,1,1); end; ... Montant:= IntToStr(2354); MontantFinal:= ''; while Montant <> '' do MontantFinal:= MontantFinal + Transform(Montant);
1° passage : montant final = 'deux mille ' 2° passage: montant final = 'deux mille trois cent ' 3° passage: montant final = 'deux mille trois cent cinquante quatre'
Je le répète, ce n'est que le principe, il y a plein de trucs à affiner... et à tester ! A + Thierry
|