Conversion d'un chiffre en lettre

Soyez le premier à donner votre avis sur cette source.

Snippet vu 91 886 fois - Téléchargée 30 fois

Contenu du snippet

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 / Exemple :


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

A voir également

Ajouter un commentaire

Commentaires

Cacophrene
Messages postés
263
Date d'inscription
lundi 29 mars 2004
Statut
Membre
Dernière intervention
4 mars 2008
-
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
Cacophrene
Messages postés
263
Date d'inscription
lundi 29 mars 2004
Statut
Membre
Dernière intervention
4 mars 2008
-
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
cs_Berurier
Messages postés
31
Date d'inscription
lundi 23 décembre 2002
Statut
Membre
Dernière intervention
28 juin 2013
-
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.
Cacophrene
Messages postés
263
Date d'inscription
lundi 29 mars 2004
Statut
Membre
Dernière intervention
4 mars 2008
-
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
cs_Berurier
Messages postés
31
Date d'inscription
lundi 23 décembre 2002
Statut
Membre
Dernière intervention
28 juin 2013
-
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

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.