Soyez le premier à donner votre avis sur cette source.
Snippet vu 93 574 fois - Téléchargée 30 fois
' Conversion de chiffre en lettre de 0 à 1999 milliard 999 999 999 Module ChLettre Dim chiffre() As String Dim dizaine() As String Dim chaine As String Private Sub init() ReDim dizaine(7) ' *** tableau contenant les noms des dizaines dizaine(1) = "dix" dizaine(2) = "vingt" dizaine(3) = "trente" dizaine(4) = "quarante" dizaine(5) = "cinquante" dizaine(6) = "soixante" ReDim chiffre(20) ' *** tableau contenant le nom des 19 premiers nombres en lettres chiffre(1) = "un" chiffre(2) = "deux" chiffre(3) = "trois" chiffre(4) = "quatre" chiffre(5) = "cinq" chiffre(6) = "six" chiffre(7) = "sept" chiffre(8) = "huit" chiffre(9) = "neuf" chiffre(10) = "dix" chiffre(11) = "onze" chiffre(12) = "douze" chiffre(13) = "treize" chiffre(14) = "quatorze" chiffre(15) = "quinze" chiffre(16) = "seize" chiffre(17) = "dix-sept" chiffre(18) = "dix-huit" chiffre(19) = "dix-neuf" End Sub Public Function NBLT(ByVal nb As Long) As String Call init() If nb = 0 Then NBLT = "Zéro" Exit Function End If chaine = "" Decompose(nb) chaine = Replace(chaine, " ", " ") chaine = Replace(chaine, "- ", "-") NBLT = chaine End Function Private Function Decompose(ByVal Nombre As Long) As String Dim Reste As Long If Nombre > (10 ^ 9) Then Reste = Nombre Mod (10 ^ 9) Nombre = Nombre \ (10 ^ 9) If Nombre > 10 Then Decompose(Nombre) Else chaine += chiffre(Convert.ToInt16(Nombre)) End If chaine += " milliard" If Nombre > 1 Then chaine += "s" Decompose(Reste) Else If Nombre > (10 ^ 6) Then Reste = Nombre Mod (10 ^ 6) Nombre = Nombre \ (10 ^ 6) If Nombre > 10 Then Decompose(Nombre) Else chaine += " " & chiffre(Convert.ToInt16(Nombre)) End If chaine += " million" If Nombre > 1 Then chaine += "s" Decompose(Reste) Else If Nombre >= (10 ^ 3) Then Reste = Nombre Mod (10 ^ 3) Nombre = Nombre \ (10 ^ 3) If Nombre > 10 Then Decompose(Nombre) Else If Nombre > 1 Then chaine += " " & chiffre(Convert.ToInt16(Nombre)) End If chaine += " mille" Decompose(Reste) Else If Nombre >= (100) Then Reste = Nombre Mod (100) Nombre = Nombre \ (100) If Nombre > 10 Then Decompose(Nombre) Else If Nombre > 1 Then chaine += " " & chiffre(Convert.ToInt16(Nombre)) End If chaine += " cent" If Nombre > 1 And Reste = 0 Then chaine += "s" Decompose(Reste) Else If Nombre >= 80 And Nombre < 100 Then Reste = Nombre Mod 20 Nombre = Nombre \ 20 If Nombre > 10 Then Decompose(Nombre) Else chaine += " " & chiffre(Convert.ToInt16(Nombre)) End If chaine += "-vingt" Decompose(Reste) Else If Nombre < 20 And Nombre > 9 Then chaine += " " & chiffre(Convert.ToInt16(Nombre)) Else If Nombre > 19 And Nombre < 70 Then Reste = Nombre Mod 10 Nombre = Nombre \ 10 If Nombre > 10 Then Decompose(Nombre) Else chaine += " " & dizaine(Convert.ToInt16(Nombre)) End If If Reste = 1 Then chaine += " et" ' Cas particlier (Ving et un , trante et un , etc...) Else If Reste <> 0 Then chaine += "-" End If Decompose(Reste) Else If Nombre >= 70 Then chaine += " soixante" Reste = Nombre - 60 If Reste = 1 Or Reste = 11 Then chaine += " et" Decompose(Reste) Else If Nombre < 10 Then chaine += " " & chiffre(Convert.ToInt16(Nombre)) End If End If End If End If End If End If End If End If End Function End Module
Je l'ai postée là
http://codes-sources.commentcamarche.net/source/101858-ecrire-des-nombres-en-lettre-c-vb-net-et-vba
voici les corrections
VB.Net
C#
finalement, je me suis dit qu'une méthode d'extension est à la fois pratique et un bon exemple.
Il s'agit d'une méthode que l'on vient ajouter à une classe existante (ici double), pour le coup, ça s'écrit dans un module.
Quelques lignes de test, et ça permet de comprendre l'utilité des méthodes d'extension
Le code 100% vb.net
Pour les règles d'orthographe je me suis basé sur ce site
http://leconjugueur.lefigaro.fr/frlesnombres.php
J'ai aussi appliqué des critères utilisés pour cette autre source
http://www.commentcamarche.net/faq/11100-vb6-net-vba-transformer-chiffres-en-lettre
Je donne aussi le code en C#. Les modules n'existant pas dans ce langage, les extensions s'écrivent dans l’équivalent d'une classe Shared => la classe static (qui n'a pas le même sens qu'en vb).
Le module et par extension les variables et méthodes globales vont à l'encontre du principe de la programmation objet, une classe Shared serait plus appropriée.
Call n'a plus aucune utilité en .Net
A plusieurs reprises il y a des conversions en Int16, or .Net travaille en 32bits
donc pour aller lire la bonne valeur du tableau, après avoir converti nombre de double à int16, le complilateur va le reconvertir en int32. Ça fait perdre un peu de temps d'exécution.
Il y a d'autres points qui me chiffonnent, mais ne pouvant tester le code pour l'instant, je n'en dirais pas plus ce soir.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.