Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CONVERSION D'UN CHIFFRE EN LETTRE


Information sur la source

Catégorie :Modules Source .NET ( DotNet ) Classé sous : chiffre, lettre, conversion Niveau : Débutant Date de création : 13/09/2006 Date de mise à jour : 14/09/2006 10:03:43 Vu : 27 510

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (9)
Ajouter un commentaire et/ou une note

Description

Ce module permet de convertir un chiffre entier de 0 à 99999999999999.

La méthode utilisée est la décomposition du chiffre par récursivité.
nous divisons le chiffre par les éléments suivant :
10^9 (milliard)
10^6 (million)
10^3 (millier)
100  (centaine)
10   (dizaine)
enfin il reste l'unité

Ex : 200905 = (2* 100 *1000) + (9 *100)  + 5
soit       (deux * cent * mille) +  (neuf * cent)  + cinq


 

Source

  • ' 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
' 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

Conclusion

Il a fallu adapté un peu le code en fonction des cas particuliers.(ex: 70,80,90)
Je reste à votre disposition pout toutes questions, commentaires et améliorations.
 

Historique

14 septembre 2006 10:03:43 :
Je te remercie de tes remarques. J'ai donc revu le code en conséquence.

Commentaires et avis

signaler à un administrateur
Commentaire de Cacophrene le 14/09/2006 08:46:16

Salut !

Etant donné que ce code .NET est très proche d'un code VB6 classique, je me suis penché dessus (mais je ne pratique pas VB.NET). Après quelques tests, il reste encore qelques de points incorrects (c'est pour ainsi dire toujours les mêmes problèmes, et pourtant il y a déjà de telles sources sur ce site). Plus précisément :

1. Les traits d'union manquent dans certains cas (par exemple 43 est orthographié "quarante trois" et non pas "quarante-trois")

2. "Cent" ne prend de s au pluriel que lorsqu'il n'est pas suivi d'autre chose. Ainsi 200 = "deux cents" mais 201 = "deux cent un".

3. Il arrive qu'il y ait deux espaces contigus. Par exemple si je demande d'écrire 30001, j'obtiens "trente__mille_un" au lieu de "trente_mille_un" (pour des raisons de visibilité, ici un underscore = un espace)/

Voilà quelques petites choses à corriger. Côté programmation, ça manque peut-être un peu de commentaires.

Voilà voilà ! Je n'ai pas noté.

Cordialement,
Cacophrène

signaler à un administrateur
Commentaire de Cacophrene le 14/09/2006 08:50:18

Si, j'oubliais quelque chose : le niveau, "initié". C'est peut-être un peu fort. Récursivité simple, pas d'API, sujet "concret", structures élémentaires (If...Then...Else), opérations simples (concaténation, division, etc...). Je ne sais pas, c'est à voir, mais ça me semble un petit peu fort.

Allez cette fois c'est tout :-)

Cacophrène

signaler à un administrateur
Commentaire de Berurier le 14/09/2006 10:27:46

Zut, j'ai raté mon copier-coller.

J'espère que ce sera plus clair

En effet "initié" est sans doute un peu fort.
En fait j'ai déposé ce code pour sa méthode.
Je reprend un exemple :

212346523

Je vais le décomposer comme suit

1) (212 * 10^6) + (346 * 10^3) + (5*100) + ((2*10) + 3)
2) ((2 *100) + 12) * 10^6 + ((3*100) + 46 ) * 10^3 + (5*100) + (2*10) +3
3) ((2 *100) + 12 ) * 10^6 +  ((3*100) + ((4 *10) + 6 ) ) * 10^3 + (5*100) +  (2*10) +3
4)  deux cent douze millions trois cent  quarante   six    mille  cinq cent  vingt  trois

Vous  noterez que vous  pouvez lire le chiffre.

Au premier passage dans la fonction décompose
je teste le chiffre par rapport au valeurs milliard,millier,centaine,etc...

Prenons le cas ci-dessus. 212346523

Par récursivité, les appels se feront de cette manière

Decompose(212346523)  =>  < 1 milliard et > 1 million , je divise par 1 million
     Decompose(212)   =>  chaine = deux cent
Decompose(12)  ==>  chaine = deux cent douze

J’ajoute «million(s) »  et je reprend le reste

Decompose(346523)  < 1000000 et > 1000 , je divise par mille
    Decompose(346)   =>  chaine = deux cent douze millions trois cent
           Decompose(46)   =>  chaine = deux cent douze millions trois cent quarante six

J’ajoute «mille »  et je reprend le reste

Decompose(523)  chaine = deux cent douze millions trois cent mille cinq cent
    Decompose(23)   =>  chaine = deux cent douze trois cent mille cinq cent vingt-trois



Ensuite, il reste la mise forme...

J'ai utilisé la structure if..then  parce qu'il y des cas particuliers pour tester la grandeur du chiffre à décomposer et parce que je n'en vois pas d'autre. Cependant je suis preneur de toute autre solution.

signaler à un administrateur
Commentaire de Cacophrene le 14/09/2006 18:14:58

Salut !

Les remarques d'orthographe ne relèvent pas de la mise en forme. Ton programme, dont le fonctionnement est très honorable, peut très bien gérer les traits d'union et les "s" dans des cas particuliers. Tu n'as besoin que de quelques If...Then en plus (ceux-ci ont d'ailleurs tout à fait leur place !). Puisque l'idée est bonne, autant la soigner jusqu'au bout non (plutôt que de faire un calque en lettre de la décomposition) ?

Cordialement,
Cacophrène

signaler à un administrateur
Commentaire de Berurier le 14/09/2006 20:12:27

Sur le fond tu as raison. La mise en forme ne concerne que la partie finale, les deux instructions Replace qui évitent une succession de test durant la décomposition.

Cordialement...

Béru


signaler à un administrateur
Commentaire de jean_marc_n2 le 16/09/2006 10:22:56

Hello,

j'ajouterais que contrairement à d'autres sources qui existent (sur ce site et ailleurs), ce programme ne gère pas les spécificités régonales:
en Belgique, 70 = septante, 90 = nonante, 76 = septante-six, etc. Idemn en Suisse, ou dans certains cantons on trouve 80=octante.

A compléter avec ces remarques pour avoir une chance de voir cette fonction utilisée un jour en dehors de l'hexagone :-)

Cordialement;

jean-marc

signaler à un administrateur
Commentaire de lamarty le 18/09/2006 08:37:51

Salut,
Excellente source.je la trouve vraiment pratique.

signaler à un administrateur
Commentaire de mouradovik le 11/10/2007 01:15:05

vous pouvez compiller votre source code sur convertir lettre en chiffre sur macro complementaire  pour la utiliser direct sur Excel  merci pour tout

signaler à un administrateur
Commentaire de mouradovik le 11/10/2007 01:17:49

bonjour , c cest possible veuillez me la envoyer sur mon email ( mourad_st@hotmail.com  merci d'avance

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Ascii conversion chiffre <=> lettre [ par deetsrider ] Je voudrais rajouter +1 au code ascii de chaque lettre tapée dans un textbox puis le reinscrire dans l autre textbox avec son nouveau code ..."a" devi CONVERSION CHIFFRE LETTRE MONNAIE LIVRE PENCE [ par florianelle ] conversion de chiffre en lettre [ par zober ] Salut tt le mondeVoila, je programme sous access une application pour gerer les ventes de produits d'une soci&#233;t&#233;. Je veux convertir dans l'e conversion chiffre en lettre [ par aakpa ] Bonjour,Dans une application VB6, je voudrais avois la possibilité de convertir automatiquement les nombres saisis en lettre. Exemple 18 en dix huit.M Transformer un nombre en chiffre [ par blacksanga ] Salut Je travail dans word pour un envoie de lettre en publipostage,dans cette lettre j'ai un champs contenant un nombre (par exemple: 548000) j'aimer Probleme de conversion [ par mrsebaa ] Hello! J'ai la fontion de conversion d'un chiffre en lettre. Je voudrais savoir comment convertir un chiffre d'une Function DataReport dans un label. code convertiseur de chiffre en lettre [ par HERVEHADJO ] je desire avoir le code qui permet de convertir les chiffre en lettres merci et bonne journée Macro de conversion dans catia v5 [ par Arzhel ] Bonjour à tous, Je cherche un moyen (une macro me semble correspondre le plus à ma démarche) de convertir un caractère quelquonque en entitées filair Excel combobox [ par takin55 ] Bonjour a a tous voila mon probleme Je cherche a cr&#233;er 2 combobox avec les fonctions suivantesDans la premiere je veux choisir "Chiffre" ou "Lett CONVERSION CHIFFRE LETTRE MONNAIE LIVRE PENCE [ par florianelle ] Bonsoirest ce que quelqu'un aurait dans un petit coin de son ordi une macro permettant de convertir un chiffre en lettres avec pour monnaie la livre,


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,406 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.