begin process at 2008 08 30 12:19:48
1 234 003 membres
37 nouveaux aujourd'hui
14 294 membres club

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 : 21 239

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.
14 septembre 2006 10:03:43 :
Je te remercie de tes remarques. J'ai donc revu le code en conséquence.
  • 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

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS