Précédent   Forum des professionnels en informatique > Dotnet > Langages > VB.NET
VB.NET Forum d'entraide sur la programmation Visual Basic .NET. Avant de poster -> FAQ VB.NET, Articles VB.NET, Sources VB.NET
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/06/2005, 11h02   #1
Invité de passage
 
Inscription : juillet 2003
Messages : 14
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 14
Points : 4
Points : 4
Par défaut [VB.NET] Comment transcrire un chiffre en son équivalent mot ?

Bonjour à tous,

je suis à la recherche d'un convertisseur d'un script permettant de convertir un nombre (entier) en lettres.
Apres quelques recherche sur Google, j'ai trouvé en script en VB6 qui ne compile pas sous .NET car la fonction Mid$ n'existe plus sous VB .NET.
j'aurais voulu savoir si quelqu'un avait déjà un code tout fait pour cette opération en C#ou VB .NET au choix ce qui m'éviterait d'avoir à adapter le code VB6 -> .NET car le débuggage de ce genre de chose n'est pas specialement passionnant.

En fait Il s'agit de convertir un nombre en son equivalent litérraire.
exemple :
20 -> vingt
1200 -> mille deux cent, etc.

Donc faut quelques ligne de code pour faire ça... et çà prend pas mal de temps. Etant donné que la question doit être assez récurente sur les projets où il faut imprimer des contrats, chèques, etc. je me suis demandé si qq n'aurait pas un petit bout de code à partager, voila tout.
car sur google, c'est du VB6 ou rien à moins que je n'ai pas bien trouvé...

je vais essayer de convertir ce VB6 en VB .NET.
le code fait environ 150 lignes et la seule les fonctions Mid$ et Val posent problème

Voici comment je convertis la ligne :

Code :
ValNb = Val(Mid$(strTemp, i, 1))
par
Code :
ValNb = CInt(strTemp.Substring(i, 1))
mais ca ne fonctionne pas, en fait je ne fait pas du tout de VB6 ni de VB .NET et n'ai pas du tout envie de m'y mettre.
Si une âme charitable pouvais juste me convertir la ligne suivante :
Code :
ValNb = Val(Mid$(strTemp, i, 1))
je lui en serait tres reconnaissant, je vous fournirrait le code une fois qu'il sera OP, biensur.

je posterai la traduction sur ce site une fois qu'elle fonctionnera.
mais j'espere pouvoir le traduire sans pour autant le comprendre, car commencer à entrer dans le micmac des calculs d'indice, non merci !

mon compilateur VB .NET ne reconnait pas les fonctions Mid, Len, Var, Int -> tout ce qui est pas objet en gros.
y'a t-il une directive pour assurer la retro-comptabilité ?
mon code est placé dans un fichier ".vb" et est compilé de la façon suivante :

Code :
C:\WINNT\Microsoft.NET\Framework\v1.1.4322\vbc.exe /target:library /out:x:\Bin\Utils.dll /recurse:X:\c_data\*.vb
voici le code et les erreurs ci-dessous :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
Public Module Utils
 
        Public Function Nombre2Texte(ByVal ValNum As Double) As String
            Static Unites(9) As String
            Static Dixaines(9) As String
            Static LesDixaines(9) As String
            Static Milliers(4) As String
 
            Dim i As Integer
            Dim nPosition As Integer
            Dim ValNb As Integer
            Dim LesZeros As Integer
            Dim strResultat As String
            Dim strTemp As String
            Dim tmpBuff As String
 
            Unites(0) = "zero"
            Unites(1) = "un"
            Unites(2) = "deux"
            Unites(3) = "trois"
            Unites(4) = "quatre"
            Unites(5) = "cinq"
            Unites(6) = "six"
            Unites(7) = "sept"
            Unites(8) = "huit"
            Unites(9) = "neuf"
 
            Dixaines(0) = "dix"
            Dixaines(1) = "onze"
            Dixaines(2) = "douze"
            Dixaines(3) = "treize"
            Dixaines(4) = "quatorze"
            Dixaines(5) = "quinze"
            Dixaines(6) = "seize"
            Dixaines(7) = "dix-sept"
            Dixaines(8) = "dix-huit"
            Dixaines(9) = "dix-neuf"
 
            LesDixaines(0) = ""
            LesDixaines(1) = "dix"
            LesDixaines(2) = "vingt"
            LesDixaines(3) = "trente"
            LesDixaines(4) = "quarante"
            LesDixaines(5) = "cinquante"
            LesDixaines(6) = "soixante"
            LesDixaines(7) = "soixante-dix"
            LesDixaines(8) = "quatre-vingt"
            LesDixaines(9) = "quatre-vingt-dix"
 
            Milliers(0) = ""
            Milliers(1) = "mille"
            Milliers(2) = "million"
            Milliers(3) = "millard"
            Milliers(4) = "mille"
 
            On Error GoTo NbVersTexteError
 
            strTemp = CStr(Int(ValNum))
 
            If ValNum = 0 Or ValNum = 1 Then
                strResultat = Unites(ValNum)
            End If
 
            For i = Len(strTemp) To 1 Step -1
                ValNb = Val(Mid(strTemp, i, 1))
                nPosition = (Len(strTemp) - i) + 1
                Select Case (nPosition Mod 3)
                    Case 1
                        LesZeros = False
                        If i = 1 Then
                            If ValNb >= 1 Then
                                tmpBuff = Unites(ValNb) & " "
                            Else
                                tmpBuff = ""
                            End If
                        ElseIf Mid(strTemp, i - 1, 1) = "1" Then
                            tmpBuff = Dixaines(ValNb) & " "
                            i = i - 1
                        ElseIf Mid(strTemp, i - 1, 1) = "9" Then
                            tmpBuff = LesDixaines(8) & " " & Dixaines(ValNb) & " "
                            i = i - 1
                        ElseIf Mid(strTemp, i - 1, 1) = "7" Then
                            If ValNb = 1 Then
                                tmpBuff = LesDixaines(6) & " et " & Dixaines
(ValNb) & " "
                            Else
                                tmpBuff = LesDixaines(6) & " " & Dixaines(ValNb) &
 " "
                            End If
                            i = i - 1
                        ElseIf ValNb > 0 Then
                            tmpBuff = Unites(ValNb) & " "
                        Else
                            LesZeros = True
                            If i > 1 Then
                                If Mid(strTemp, i - 1, 1) <> "0" Then
                                    LesZeros = False
                                End If
                            End If
                            If i > 2 Then
                                If Mid(strTemp, i - 2, 1) <> "0" Then
                                    LesZeros = False
                                End If
                            End If
                            tmpBuff = ""
                        End If
                        If LesZeros = False And nPosition > 1 Then
                            tmpBuff = tmpBuff & Milliers(nPosition / 3) & " "
                        End If
                        strResultat = tmpBuff & strResultat
                    Case 2
                        If ValNb > 0 Then
                            If strResultat = "un " And ValNb <> 8 Then
                                strResultat = LesDixaines(ValNb) & " et " &
 strResultat
                            Else
                                strResultat = LesDixaines(ValNb) & " " &
 strResultat
                            End If
                        End If
                    Case 0
                        If ValNb > 0 Then
                            If ValNb > 1 Then
                                strResultat = Unites(ValNb) & " cent " &
 strResultat
                            Else
                                strResultat = "cent " & strResultat
                            End If
                        End If
                End Select
            Next i
            'If Len(strResultat) > 0 Then
            '    strResultat = UCase$(Left$(strResultat, 1)) & Mid(strResultat,
 2)
            'End If
 
        EndNbVersTexte:
            Nombre2Texte = strResultat
            Exit Function
 
        NbVersTexteError:
            Nombre2Texte = "!! Erreur !!"
            Resume EndNbVersTexte
        End Function
 
End Module

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 
Microsoft (R) Visual Basic .NET Compiler version 7.10.6001.4
for Microsoft (R) .NET Framework version 1.1.4322.2032
Copyright (C) Microsoft Corporation 1987-2002. All rights reserved.
 
X:\c_data\Utils.vb(57) : error BC30451: Name 'Int' is not declared.
 
            strTemp = CStr(Int(ValNum))
                           ~~~
X:\c_data\Utils.vb(63) : error BC30451: Name 'Len' is not declared.
 
            For i = Len(strTemp) To 1 Step -1
                    ~~~
X:\c_data\Utils.vb(64) : error BC30451: Name 'Val' is not declared.
 
                ValNb = Val(Mid(strTemp, i, 1))
                        ~~~
X:\c_data\Utils.vb(64) : error BC30451: Name 'Mid' is not declared.
 
                ValNb = Val(Mid(strTemp, i, 1))
                            ~~~
X:\c_data\Utils.vb(65) : error BC30451: Name 'Len' is not declared.
 
                nPosition = (Len(strTemp) - i) + 1
                             ~~~
X:\c_data\Utils.vb(75) : error BC30451: Name 'Mid' is not declared.
 
                        ElseIf Mid(strTemp, i - 1, 1) = "1" Then
                               ~~~
X:\c_data\Utils.vb(78) : error BC30451: Name 'Mid' is not declared.
 
                        ElseIf Mid(strTemp, i - 1, 1) = "9" Then
                               ~~~
X:\c_data\Utils.vb(81) : error BC30451: Name 'Mid' is not declared.
 
                        ElseIf Mid(strTemp, i - 1, 1) = "7" Then
                               ~~~
X:\c_data\Utils.vb(93) : error BC30451: Name 'Mid' is not declared.
 
                                If Mid(strTemp, i - 1, 1) <> "0" Then
                                   ~~~
X:\c_data\Utils.vb(98) : error BC30451: Name 'Mid' is not declared.
 
                                If Mid(strTemp, i - 2, 1) <> "0" Then
                                   ~~~
ouechouech est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2005, 13h14   #2
Expert Confirmé
 
Avatar de neguib
 
Inscription : mai 2005
Messages : 3 633
Détails du profil
Informations personnelles :
Âge : 51

Informations forums :
Inscription : mai 2005
Messages : 3 633
Points : 3 967
Points : 3 967
Cà y est j'ai traduit tout ton code
donc n'oublies pas d'importer Microsoft.VisualBasic
et donc d'utuliser Microsoft.VisualBasic.Left
ensuite tu remplace comme je te l'ai dit mid$ par mid
et çà fonctionne mais ya un bug si tu tape 1 il te renvoies rien
c'est une erreur dans le code
quand il fait
Code :
1
2
3
If ValNb > 1 Then
   tmpBuff = Unites(ValNb) & " "
Else ....
remplace par
Code :
1
2
3
If ValNb >= 1 Then
   tmpBuff = Unites(ValNb) & " "
Else ....
voilà
neguib est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2005, 14h56   #3
Invité de passage
 
Inscription : juillet 2003
Messages : 14
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 14
Points : 4
Points : 4
ca marche impec
y'a juste un petit soucis avec la serie des mille on dirait, le script affiche "un mille ". pour le reste ça à l'air d'etre ok.
perso ca me derange pas trop car je traite que de gros chiffres :o
à l'occasion je vais chercher une correction.

pour resoudre le petit soucis des 1000, il suffit d'ajouter

Code :
1
2
3
If ValNum = 1000 
     Return Milliers(1)
End If
juste sous

Code :
1
2
3
If ValNum = 0 Or ValNum = 1 Then
      strResultat = Unites(ValNum)
End If
merci, voila c'est resolu
ouechouech est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h09.


 
 
 
 
Partenaires

Hébergement Web