papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Montant en toutes lettres Mer 11 Avr 2012 - 2:34 | |
| Salut tout le monde ! Voici un sous programme qui peut être utile pour certains. Il s’agit de transformer un montant en chiffres en un montant en lettres tout en respectant la langue française, SVP ! * Le trait d’union dans 17 (DIX-SEPT) etc. * Le ET dans 21 (VINGT ET UN) etc. * Le S dans 80 (QUATRE-VINGTS), mais il n’y a pas d’S dans 81 (QUATRE-VINGT-UN) * CENT prend S au pluriel quand il n’est pas suivi d’autres valeurs, comme 400 (QUATRE CENTS), mais 410 (QUATRE CENT DIX) ne prend pas d’S * MILLE est toujours invariable (MILLE, DEUX MILLE, TROIS MILLE etc.) * MILLION prend un S au pluriel * On dit UN MILLION, mais on ne dit pas UN CENT ou UN MILLE Toutes ces subtilités sont prises en charge dans le programme. Le programme traite les nombres : De 0.01 (UN CENTIME) Jusqu’à 999999999.99 NEUF CENT QUATRE-VINGT-DIX-NEUF MILLIONS NEUF CENT QUATRE-VINGT-DIX-NEUF MILLE NEUF CENT QUATRE-VINGT-DIX-NEUF EUROS ET QUATRE-VINGT-DIX-NEUF CENTIMES. Ce sous programme peut être intégré dans un programme plus important où il est question d'imprimer un montant en toutes lettres (par exemple une facture ...) - Code:
-
' ****************************************************************************** ' ' Montant en toutes lettres ' ' Par Papydall ' ' ******************************************************************************
' Ecriture en toutes lettres d'un montant ' de (0.01) --> un centime ' à (999999999.99) --> ' NEUF CENT QUATRE-VINGT-DIX-NEUF MILLIONS NEUF CENT QUATRE-VINGT-DIX-NEUF MILLE ' NEUF CENT QUATRE-VINGT-DIX-NEUF EUROS ET QUATRE-VINGT-DIX-NEUF CENTIMES ' ' ****************************************************************************** dim montant,kk$,ss$,xx$,zz$,dp,cc$,rr$,tt$,cc,uu,dd,du dim dd$(8),uu$(19),i
label ChiffresLettres,TroisChiffresLettres
width 0 ,1100
' **** Pour verifier l'algorithme
input " Entrez le montant en chiffres de 0.01 à 999999999.99 : "; montant gosub ChiffresLettres kk$ = "****" + kk$ + "****" print : print kk$ end
ChiffresLettres: ' ****************************************************************************** ' Initialisation des tables ' *** UU$() --> Table des unités: Pour faciliter les traitements,les valeurs 1 ' à 19 sont groupées comme "unités" ! ' *** DD$() --> Table des dizaines : 70 et 90 sont traités à part
for i = 1 to 19 : read uu$(i) : next i
data "UN","DEUX","TROIS","QUATRE","CINQ","SIX","SEPT","HUIT","NEUF","DIX","ONZE" data "DOUZE","TREIZE","QUATORZE","QUINZE","SEIZE","DIX-SEPT","DIX-HUIT" data "DIX-NEUF"
dd$(2) = "VINGT" : dd$(3) = "TRENTE" : dd$(4) = "QUARANTE" dd$(5) = "CINQUANTE" : dd$(6) = "SOIXANTE" : dd$(8) = "QUATRE-VINGT"
' **** Recherche de la position du point décimal dans le montant
xx$ = "" : dp = 0 : ss$ = str$(montant) for i = 1 to len(ss$) if mid$(ss$,i,1) = "." then dp = i : exit_for next i
' **** Traitement
if dp <> 0 zz$ = mid$(ss$,1,dp-1) : tt$ = mid$(ss$,dp+1,3) else : zz$ = ss$ : tt$ = "000" end_if
while len(zz$) < 9 : zz$ = "0" + zz$ : end_while
' **** Tranche des millions
cc$ = mid$(zz$,1,3) if cc$ = "001" xx$ = "UN MILLION" else if cc$ <> "000" then gosub TroisChiffresLettres : xx$ = rr$ + " MILLIONS" end_if
' **** Tranche des mille
cc$ = mid$(zz$,4,3)
if cc$ <> "000" gosub TroisChiffresLettres if rr$ = " UN" then rr$ = "" xx$ = xx$ + rr$ + " MILLE" end_if
' **** Tranche des centaines
cc$ = mid$(zz$,7,3) if (val(zz$) <> 0) and (zz$ <> "000000001") gosub TroisChiffresLettres if (xx$ = "UN MILLION" or right$(xx$,8)="MILLIONS")and rr$ = "" then rr$="D'" xx$ = xx$ + " " + rr$ + " EUROS" end_if if zz$ = "000000001" then xx$ = "UN EURO" if (val(zz$) = 0) and (val(tt$) = 1) then xx$ = "UN CENTIME" if val(tt$) <> 0 cc$ = tt$ if len(cc$) = 1 then cc$ = "0" + cc$ +"0" if len(cc$) = 2 then cc$ = "0" + cc$ if not(val(zz$) = 0 and val(cc$) = 1) then gosub TroisChiffresLettres if (val(zz$) = 0) and (val(cc$) > 1) xx$ = rr$ + " CENTIMES" : gosub TroisChiffresLettres else if rr$ <> "" then xx$ = xx$ + " ET " + rr$ + " CENTIMES" if rr$ = "1" then xx$ = xx$ + " ET " + rr$ + " CENTIME" end_if end_if
' *** Enlever les espaces superflus de la chaine contenant le montant
kk$ = "" for i = 1 to len(xx$)-1 if not((mid$(xx$,i,1) = " ")and((mid$(xx$,i+1,1) = " ")or(mid$(xx$,i+1,1)="-"))) kk$ = kk$ + mid$(xx$,i,1) end_if next i if mid$(xx$,len(xx$),1) <> " " then kk$ = kk$ + mid$(xx$,len(xx$),1) if mid$(xx$,1,1) = " " then kk$ = mid$(kk$,2,len(kk$)) return
' *** Codage d'un nombre de 3 chiffres en lettres TroisChiffresLettres: rr$ = "" cc = val(mid$(cc$,1,1)) : dd = val(mid$(cc$,2,1)) uu = val(mid$(cc$,3,1)) : du = val(mid$(cc$,2,2))
if cc = 1 then rr$ = rr$ + " CENT" if (cc > 1) and (du = 0)then rr$ = rr$ + " " + uu$(cc) + " CENTS" if (cc > 1) and (du <> 0) then rr$ = rr$ + " " + uu$(cc) + " CENT" if du = 0 then return if (0 < du) and (du < 20) then rr$ = rr$ + " " + uu$(du) : return if ((69 < du) and (du < 80)) or ((89 < du) and (du < 100)) rr$ = rr$ + " " + dd$(dd-1) + "-" + uu$(10+uu) : return end_if rr$ = rr$ + " " + dd$(dd) if (uu = 0) and (dd = 8) then rr$ = rr$ + "S" if uu = 0 then return if (uu = 1) and (( dd = 2) or (dd = 3) or (dd = 4) or(dd = 5) or (dd = 6)) rr$ rr$ + " ET " + uu$(uu) : return end_if if (uu > 1) and (dd = 0) then rr$ = rr$ + " " + uu$(uu) : return rr$ = rr$ + "-" + uu$(uu) return ' ****** Fin *****
PS : Je ne peux pas aller plus loin dans la limite supérieure du montant : ma fortune actuelle ne dépasse pas ce plafond, hélas ! | |
|
bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Montant en toutes lettres Mer 11 Avr 2012 - 7:23 | |
| bonjour papydall, Très interressant ton petit sous programme et surtout très utile. Je le met de coté car il pourrait bien me servir un jour! Si tu tapes directement entrée ou une lettre ton programme plante; tu aurais du utiliser d'autres instructions à la place de input comme message input ou alors tester ce qui est entré au clavier avec l'instruction numeric(v$). Mais bon, c'est un détail, le principal c'est que c'est un programme utile que chacun peut modifier comme il l'entend pour ses propres besoins. A bientôt | |
|
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Montant en toutes lettres Mer 11 Avr 2012 - 10:36 | |
| Beau programme papydall. C'est clair que l'on peut faire quelques petits contrôle d'erreur de saisie ou de manipulation (comme vérifier que si la chaine saisie n'est pas "0", "00","0.0"; "0.00"; "0,0" ou "0,00" la valeur de la chaine saisie est diférente à 0 par exemple) On peut faire un check du point ou de la virgule aussi comme séparateur En testant s'il y a plusieurs points ou plusieurs virgules, en éviterait les confusions pour nos amis anglophones qui l'utilisent comme séparateur de millier, mais bon, l'énnoncé est clair, ils peuvent aussi faire attention. | |
|
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Montant en toutes lettres Mer 11 Avr 2012 - 10:46 | |
| Bonjour Bignono, Bonjour Jicehel, Bonjour tout le monde ! Ce que vous dites est certainement vrai ! L’INPUT ne sert qu’à vérifier le programme. Chacun peut l’adapter à sa guise. En fait, dans mon intention, le « montant » sera fourni par le programme qui l’utilisera. Donc, le montant, serait calculé et vérifié avant d’utiliser le sous programme. A+
PS :
Le français n’est pas ma langue maternelle, mais j’essaye toujours de m’exprimer avec le moins de fautes possible.
Pour une utilisation fiable, il faut vérifier ce sous programme avec différentes valeurs et voir s'il n'y a pas des petites incorrections. Moi-même, je ne l’ai vérifié que sommairement. Mais je pense que c'est correct! | |
|
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Montant en toutes lettres Mer 11 Avr 2012 - 13:21 | |
| Une petite correction, en principe on écrit cinq millions d'euros (sans espace entre l'apostrophe et euros) Il faudrait donc modifier le bout de code du test par: - Code:
-
if (xx$ = "UN MILLION" or right$(xx$,8)="MILLIONS")and rr$ = "" xx$=xx$+" D'EUROS" else xx$ = xx$ + " " + rr$ + " EUROS" end_if
| |
|
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Montant en toutes lettres Mer 11 Avr 2012 - 16:18 | |
| | |
|
Contenu sponsorisé
| Sujet: Re: Montant en toutes lettres | |
| |
|