J'ai récupérer sur ce forum ce code pour transformer un chiffre en lettre.
Mais j'ai un souci : mon chiffre est 15 289 004 et lui me donne :
quinze millions deux cent quatre vingt neuf mille TROIS EUROS ET CENT
CENTIMES
Pourquoi pas 4 EUROS ? merci pour votre aide.
Public Function ConvertNbLettres(nb, Devise As String) As String
'traitement du cas 0 frs
If nb >= 1 Then
resultat = ""
Else
resultat = "zéro"
GoTo fintraitementfrancs
End If
'traitement des millions
varnum = Int(nb / 1000000)
If varnum > 0 Then
GoSub centaine_dizaine
resultat = varlet + " million"
If varlet <> "un" Then: resultat = resultat + "s"
End If
'traitement des milliers
varnum = Int(nb) Mod 1000000
varnum = Int(varnum / 1000)
If varnum > 0 Then
GoSub centaine_dizaine
If varlet <> "un" Then: resultat = resultat + " " + varlet
resultat = resultat + " mille"
End If
'traitement des centaines et dizaines
varnum = Int(nb) Mod 1000
If varnum > 0 Then
GoSub centaine_dizaine
resultat = resultat + " " + varlet
End If
resultat = LTrim(resultat)
varlet = Right$(resultat, 4)
'traitement du "s" final pour vingt et cent et du "de" pour million
Select Case varlet
Case "cent", "ingt"
resultat = resultat + "s"
Case "lion", "ions"
resultat = resultat + " de"
End Select
fintraitementfrancs:
resultat = resultat + " " + Devise
If nb > 2 Then: resultat = resultat + "s"
'traitement des centimes
varnum = Int((nb - Int(nb)) * 100 + 0.5)
If varnum > 0 Then
GoSub centaine_dizaine
resultat = resultat + " et " + varlet + " centime"
If varnum > 1 Then: resultat = resultat + "s"
End If
'renvoi du resultat de la fonction et fin de la fonction
ConvertNbLettres = resultat
Exit Function
'sous programme
centaine_dizaine:
varlet = ""
'traitement des centaines
If varnum >= 100 Then
varlet = chiffre(Int(varnum / 100))
varnum = varnum Mod 100
If varlet = "un" Then
varlet = "cent "
Else
varlet = varlet + " cent "
End If
End If
'traitement des dizaines
If varnum <= 19 Then
If varnum > 0 Then: varlet = varlet + chiffre(varnum)
Else
varnumD = Int(varnum / 10)
varnumU = varnum Mod 10
Select Case varnumD
Case Is <= 5
varlet = varlet + dizaine(varnumD)
Case 6, 7
varlet = varlet + dizaine(6)
Case 8, 9
varlet = varlet + dizaine(8)
End Select
If varnumU = 1 And varnumD < 8 Then
varlet = varlet + " et "
Else
If varnumU <> 0 Or varnumD = 7 Or varnumD = 9 Then: varlet = varlet
+ " "
End If
If varnumD = 7 Or varnumD = 9 Then: varnumU = varnumU + 10
If varnumU <> 0 Then: varlet = varlet + chiffre(varnumU)
End If
varlet = RTrim(varlet)
Return
| Bonjour | | J'ai récupérer sur ce forum ce code pour transformer un chiffre en | lettre. Mais j'ai un souci : mon chiffre est 15 289 004 et lui me | donne : | quinze millions deux cent quatre vingt neuf mille TROIS EUROS ET CENT | CENTIMES | Pourquoi pas 4 EUROS ? merci pour votre aide. | | Public Function ConvertNbLettres(nb, Devise As String) As String | | Dim varnum, varnumD, varnumU, resultat, varlet | Static chiffre(1 To 19) | 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" | Static dizaine(1 To 8) | dizaine(1) = "dix" | dizaine(2) = "vingt" | dizaine(3) = "trente" | dizaine(4) = "quarante" | dizaine(5) = "cinquante" | dizaine(6) = "soixante" | dizaine(8) = "quatre-vingt" | | 'traitement du cas 0 frs | If nb >= 1 Then | resultat = "" | Else | resultat = "zéro" | GoTo fintraitementfrancs | End If | | 'traitement des millions | varnum = Int(nb / 1000000) | If varnum > 0 Then | GoSub centaine_dizaine | resultat = varlet + " million" | If varlet <> "un" Then: resultat = resultat + "s" | End If | | 'traitement des milliers | varnum = Int(nb) Mod 1000000 | varnum = Int(varnum / 1000) | If varnum > 0 Then | GoSub centaine_dizaine | If varlet <> "un" Then: resultat = resultat + " " + varlet | resultat = resultat + " mille" | End If | | 'traitement des centaines et dizaines | varnum = Int(nb) Mod 1000 | If varnum > 0 Then | GoSub centaine_dizaine | resultat = resultat + " " + varlet | End If | resultat = LTrim(resultat) | varlet = Right$(resultat, 4) | | 'traitement du "s" final pour vingt et cent et du "de" pour million | Select Case varlet | Case "cent", "ingt" | resultat = resultat + "s" | Case "lion", "ions" | resultat = resultat + " de" | End Select | | fintraitementfrancs: | resultat = resultat + " " + Devise | If nb > 2 Then: resultat = resultat + "s" | | 'traitement des centimes | varnum = Int((nb - Int(nb)) * 100 + 0.5) | If varnum > 0 Then | GoSub centaine_dizaine | resultat = resultat + " et " + varlet + " centime" | If varnum > 1 Then: resultat = resultat + "s" | End If | | ' conversion 1ère lettre en majuscule | resultat = UCase(Left(resultat, 1)) + Right(resultat, Len(resultat) - | 1) | | 'renvoi du resultat de la fonction et fin de la fonction | ConvertNbLettres = resultat | Exit Function | | 'sous programme | centaine_dizaine: | | varlet = "" | | 'traitement des centaines | If varnum >= 100 Then | varlet = chiffre(Int(varnum / 100)) | varnum = varnum Mod 100 | If varlet = "un" Then | varlet = "cent " | Else | varlet = varlet + " cent " | End If | End If | | 'traitement des dizaines | If varnum <= 19 Then | If varnum > 0 Then: varlet = varlet + chiffre(varnum) | Else | varnumD = Int(varnum / 10) | varnumU = varnum Mod 10 | Select Case varnumD | Case Is <= 5 | varlet = varlet + dizaine(varnumD) | Case 6, 7 | varlet = varlet + dizaine(6) | Case 8, 9 | varlet = varlet + dizaine(8) | End Select | If varnumU = 1 And varnumD < 8 Then | varlet = varlet + " et " | Else | If varnumU <> 0 Or varnumD = 7 Or varnumD = 9 Then: varlet | varlet + " " | End If | If varnumD = 7 Or varnumD = 9 Then: varnumU = varnumU + 10 | If varnumU <> 0 Then: varlet = varlet + chiffre(varnumU) | End If | varlet = RTrim(varlet) | Return | | End Function
Pierre Jagut
Bonjour,
Est-ce que ce ne serait pas seulement un problème de type de valeur ? Si ton nombre est en réel simple, il peut être stocké sous la forme 15 289 003.99999. Dans ce cas, c'est effectivement le résultat que va donner programme. Donc deux possibilités : - essaye en déclarant ta variable en réel double - utilise un autre nom pour le paramètre "nb" ("valeur" par exemple) et calcule la valeur de "nb" au début du programme en arrondissant "valeur" au centimes. Quelque chose comme :
Public Function ConvertNbLettres(valeur, Devise As String) As String
Dim nb as double nb = Int( (nb * 100) + 0.5) / 100
... suite du programme
A vérifier, mais ça devrait marcher. Pierre.
"CMT" a écrit dans le message de news:3f1ec4da$0$16890$
Bonjour
J'ai récupérer sur ce forum ce code pour transformer un chiffre en lettre. Mais j'ai un souci : mon chiffre est 15 289 004 et lui me donne : quinze millions deux cent quatre vingt neuf mille TROIS EUROS ET CENT CENTIMES Pourquoi pas 4 EUROS ? merci pour votre aide.
Public Function ConvertNbLettres(nb, Devise As String) As String
'traitement du cas 0 frs If nb >= 1 Then resultat = "" Else resultat = "zéro" GoTo fintraitementfrancs End If
'traitement des millions varnum = Int(nb / 1000000) If varnum > 0 Then GoSub centaine_dizaine resultat = varlet + " million" If varlet <> "un" Then: resultat = resultat + "s" End If
'traitement des milliers varnum = Int(nb) Mod 1000000 varnum = Int(varnum / 1000) If varnum > 0 Then GoSub centaine_dizaine If varlet <> "un" Then: resultat = resultat + " " + varlet resultat = resultat + " mille" End If
'traitement des centaines et dizaines varnum = Int(nb) Mod 1000 If varnum > 0 Then GoSub centaine_dizaine resultat = resultat + " " + varlet End If resultat = LTrim(resultat) varlet = Right$(resultat, 4)
'traitement du "s" final pour vingt et cent et du "de" pour million Select Case varlet Case "cent", "ingt" resultat = resultat + "s" Case "lion", "ions" resultat = resultat + " de" End Select
fintraitementfrancs: resultat = resultat + " " + Devise If nb > 2 Then: resultat = resultat + "s"
'traitement des centimes varnum = Int((nb - Int(nb)) * 100 + 0.5) If varnum > 0 Then GoSub centaine_dizaine resultat = resultat + " et " + varlet + " centime" If varnum > 1 Then: resultat = resultat + "s" End If
'renvoi du resultat de la fonction et fin de la fonction ConvertNbLettres = resultat Exit Function
'sous programme centaine_dizaine:
varlet = ""
'traitement des centaines If varnum >= 100 Then varlet = chiffre(Int(varnum / 100)) varnum = varnum Mod 100 If varlet = "un" Then varlet = "cent " Else varlet = varlet + " cent " End If End If
'traitement des dizaines If varnum <= 19 Then If varnum > 0 Then: varlet = varlet + chiffre(varnum) Else varnumD = Int(varnum / 10) varnumU = varnum Mod 10 Select Case varnumD Case Is <= 5 varlet = varlet + dizaine(varnumD) Case 6, 7 varlet = varlet + dizaine(6) Case 8, 9 varlet = varlet + dizaine(8) End Select If varnumU = 1 And varnumD < 8 Then varlet = varlet + " et " Else If varnumU <> 0 Or varnumD = 7 Or varnumD = 9 Then: varlet varlet + " " End If If varnumD = 7 Or varnumD = 9 Then: varnumU = varnumU + 10 If varnumU <> 0 Then: varlet = varlet + chiffre(varnumU) End If varlet = RTrim(varlet) Return
End Function
Bonjour,
Est-ce que ce ne serait pas seulement un problème de type de valeur ?
Si ton nombre est en réel simple, il peut être stocké sous la forme 15 289
003.99999. Dans ce cas, c'est effectivement le résultat que va donner
programme.
Donc deux possibilités :
- essaye en déclarant ta variable en réel double
- utilise un autre nom pour le paramètre "nb" ("valeur" par exemple) et
calcule la valeur de "nb" au début du programme en arrondissant "valeur" au
centimes. Quelque chose comme :
Public Function ConvertNbLettres(valeur, Devise As String) As String
Dim nb as double
nb = Int( (nb * 100) + 0.5) / 100
... suite du programme
A vérifier, mais ça devrait marcher.
Pierre.
"CMT" <mavrick@noos.fr> a écrit dans le message de
news:3f1ec4da$0$16890$79c14f64@nan-newsreader-03.noos.net...
Bonjour
J'ai récupérer sur ce forum ce code pour transformer un chiffre en lettre.
Mais j'ai un souci : mon chiffre est 15 289 004 et lui me donne :
quinze millions deux cent quatre vingt neuf mille TROIS EUROS ET CENT
CENTIMES
Pourquoi pas 4 EUROS ? merci pour votre aide.
Public Function ConvertNbLettres(nb, Devise As String) As String
'traitement du cas 0 frs
If nb >= 1 Then
resultat = ""
Else
resultat = "zéro"
GoTo fintraitementfrancs
End If
'traitement des millions
varnum = Int(nb / 1000000)
If varnum > 0 Then
GoSub centaine_dizaine
resultat = varlet + " million"
If varlet <> "un" Then: resultat = resultat + "s"
End If
'traitement des milliers
varnum = Int(nb) Mod 1000000
varnum = Int(varnum / 1000)
If varnum > 0 Then
GoSub centaine_dizaine
If varlet <> "un" Then: resultat = resultat + " " + varlet
resultat = resultat + " mille"
End If
'traitement des centaines et dizaines
varnum = Int(nb) Mod 1000
If varnum > 0 Then
GoSub centaine_dizaine
resultat = resultat + " " + varlet
End If
resultat = LTrim(resultat)
varlet = Right$(resultat, 4)
'traitement du "s" final pour vingt et cent et du "de" pour million
Select Case varlet
Case "cent", "ingt"
resultat = resultat + "s"
Case "lion", "ions"
resultat = resultat + " de"
End Select
fintraitementfrancs:
resultat = resultat + " " + Devise
If nb > 2 Then: resultat = resultat + "s"
'traitement des centimes
varnum = Int((nb - Int(nb)) * 100 + 0.5)
If varnum > 0 Then
GoSub centaine_dizaine
resultat = resultat + " et " + varlet + " centime"
If varnum > 1 Then: resultat = resultat + "s"
End If
'renvoi du resultat de la fonction et fin de la fonction
ConvertNbLettres = resultat
Exit Function
'sous programme
centaine_dizaine:
varlet = ""
'traitement des centaines
If varnum >= 100 Then
varlet = chiffre(Int(varnum / 100))
varnum = varnum Mod 100
If varlet = "un" Then
varlet = "cent "
Else
varlet = varlet + " cent "
End If
End If
'traitement des dizaines
If varnum <= 19 Then
If varnum > 0 Then: varlet = varlet + chiffre(varnum)
Else
varnumD = Int(varnum / 10)
varnumU = varnum Mod 10
Select Case varnumD
Case Is <= 5
varlet = varlet + dizaine(varnumD)
Case 6, 7
varlet = varlet + dizaine(6)
Case 8, 9
varlet = varlet + dizaine(8)
End Select
If varnumU = 1 And varnumD < 8 Then
varlet = varlet + " et "
Else
If varnumU <> 0 Or varnumD = 7 Or varnumD = 9 Then: varlet varlet
+ " "
End If
If varnumD = 7 Or varnumD = 9 Then: varnumU = varnumU + 10
If varnumU <> 0 Then: varlet = varlet + chiffre(varnumU)
End If
varlet = RTrim(varlet)
Return
Est-ce que ce ne serait pas seulement un problème de type de valeur ? Si ton nombre est en réel simple, il peut être stocké sous la forme 15 289 003.99999. Dans ce cas, c'est effectivement le résultat que va donner programme. Donc deux possibilités : - essaye en déclarant ta variable en réel double - utilise un autre nom pour le paramètre "nb" ("valeur" par exemple) et calcule la valeur de "nb" au début du programme en arrondissant "valeur" au centimes. Quelque chose comme :
Public Function ConvertNbLettres(valeur, Devise As String) As String
Dim nb as double nb = Int( (nb * 100) + 0.5) / 100
... suite du programme
A vérifier, mais ça devrait marcher. Pierre.
"CMT" a écrit dans le message de news:3f1ec4da$0$16890$
Bonjour
J'ai récupérer sur ce forum ce code pour transformer un chiffre en lettre. Mais j'ai un souci : mon chiffre est 15 289 004 et lui me donne : quinze millions deux cent quatre vingt neuf mille TROIS EUROS ET CENT CENTIMES Pourquoi pas 4 EUROS ? merci pour votre aide.
Public Function ConvertNbLettres(nb, Devise As String) As String
'traitement du cas 0 frs If nb >= 1 Then resultat = "" Else resultat = "zéro" GoTo fintraitementfrancs End If
'traitement des millions varnum = Int(nb / 1000000) If varnum > 0 Then GoSub centaine_dizaine resultat = varlet + " million" If varlet <> "un" Then: resultat = resultat + "s" End If
'traitement des milliers varnum = Int(nb) Mod 1000000 varnum = Int(varnum / 1000) If varnum > 0 Then GoSub centaine_dizaine If varlet <> "un" Then: resultat = resultat + " " + varlet resultat = resultat + " mille" End If
'traitement des centaines et dizaines varnum = Int(nb) Mod 1000 If varnum > 0 Then GoSub centaine_dizaine resultat = resultat + " " + varlet End If resultat = LTrim(resultat) varlet = Right$(resultat, 4)
'traitement du "s" final pour vingt et cent et du "de" pour million Select Case varlet Case "cent", "ingt" resultat = resultat + "s" Case "lion", "ions" resultat = resultat + " de" End Select
fintraitementfrancs: resultat = resultat + " " + Devise If nb > 2 Then: resultat = resultat + "s"
'traitement des centimes varnum = Int((nb - Int(nb)) * 100 + 0.5) If varnum > 0 Then GoSub centaine_dizaine resultat = resultat + " et " + varlet + " centime" If varnum > 1 Then: resultat = resultat + "s" End If
'renvoi du resultat de la fonction et fin de la fonction ConvertNbLettres = resultat Exit Function
'sous programme centaine_dizaine:
varlet = ""
'traitement des centaines If varnum >= 100 Then varlet = chiffre(Int(varnum / 100)) varnum = varnum Mod 100 If varlet = "un" Then varlet = "cent " Else varlet = varlet + " cent " End If End If
'traitement des dizaines If varnum <= 19 Then If varnum > 0 Then: varlet = varlet + chiffre(varnum) Else varnumD = Int(varnum / 10) varnumU = varnum Mod 10 Select Case varnumD Case Is <= 5 varlet = varlet + dizaine(varnumD) Case 6, 7 varlet = varlet + dizaine(6) Case 8, 9 varlet = varlet + dizaine(8) End Select If varnumU = 1 And varnumD < 8 Then varlet = varlet + " et " Else If varnumU <> 0 Or varnumD = 7 Or varnumD = 9 Then: varlet varlet + " " End If If varnumD = 7 Or varnumD = 9 Then: varnumU = varnumU + 10 If varnumU <> 0 Then: varlet = varlet + chiffre(varnumU) End If varlet = RTrim(varlet) Return
End Function
Anor
Bonjour Jessy,
| A première vue le code correspondont à celui que l'on trouve sur mon | site... Là tu me mets le doute... | Pour moi les règles d'orthographes sont que si tu n'écris rien après | cent et vingt, ils prennents forcément un "s" mais bon... | Par exemple : | 200 -> deux cents | 202 -> deux cent deux | 102 -> cent deux
oui celle là elle est ok
| Par contre tu me mets le doute sur : | 100 en fait plus j'écris plus je me dis que tu dois avoir raison ;-)))
tu veux dire sur "vingt" ?
j'avais trouvé cette règle là sur un site "littéraire" :
' quelques règles grammaticales
'- Vingt invariable, 'sauf quand il termine un nombre = quatre-vingts voitures. 'sauf quand il est multiplié par un autre nombre et le termine = trois cent quatre-vingts voitures, 'alors qu'on aura = trois cent quatre-vingt un véhicules 'vu que vingt ne termine pas le nombre. 'aussi on aura 80 = 4 fois 20 donc quatre-vingts 'en revanche 120 = 100 plus 20 donc cent vingt ' Trait d'union pour les nombres inférieurs à 100 (en réalité de 17 à 99) '= vingt-quatre, sept cent quatre-vingt-sept , cent vingt-quatre '- Pas de trait d'union avec et = trente et un. '- Pas de trait d'union avant ou après cent, mille, millions, = deux mille cent, cent dix, mille vingt.
| A première vue le code correspondont à celui que l'on trouve sur mon
| site... Là tu me mets le doute...
| Pour moi les règles d'orthographes sont que si tu n'écris rien après
| cent et vingt, ils prennents forcément un "s" mais bon...
| Par exemple :
| 200 -> deux cents
| 202 -> deux cent deux
| 102 -> cent deux
oui celle là elle est ok
| Par contre tu me mets le doute sur :
| 100 en fait plus j'écris plus je me dis que tu dois avoir raison ;-)))
tu veux dire sur "vingt" ?
j'avais trouvé cette règle là sur un site "littéraire" :
' quelques règles grammaticales
'- Vingt invariable,
'sauf quand il termine un nombre = quatre-vingts voitures.
'sauf quand il est multiplié par un autre nombre et le termine = trois cent quatre-vingts
voitures,
'alors qu'on aura = trois cent quatre-vingt un véhicules
'vu que vingt ne termine pas le nombre.
'aussi on aura 80 = 4 fois 20 donc quatre-vingts
'en revanche 120 = 100 plus 20 donc cent vingt
' Trait d'union pour les nombres inférieurs à 100 (en réalité de 17 à 99)
'= vingt-quatre, sept cent quatre-vingt-sept , cent vingt-quatre
'- Pas de trait d'union avec et = trente et un.
'- Pas de trait d'union avant ou après cent, mille, millions, = deux mille cent, cent dix, mille
vingt.
| A première vue le code correspondont à celui que l'on trouve sur mon | site... Là tu me mets le doute... | Pour moi les règles d'orthographes sont que si tu n'écris rien après | cent et vingt, ils prennents forcément un "s" mais bon... | Par exemple : | 200 -> deux cents | 202 -> deux cent deux | 102 -> cent deux
oui celle là elle est ok
| Par contre tu me mets le doute sur : | 100 en fait plus j'écris plus je me dis que tu dois avoir raison ;-)))
tu veux dire sur "vingt" ?
j'avais trouvé cette règle là sur un site "littéraire" :
' quelques règles grammaticales
'- Vingt invariable, 'sauf quand il termine un nombre = quatre-vingts voitures. 'sauf quand il est multiplié par un autre nombre et le termine = trois cent quatre-vingts voitures, 'alors qu'on aura = trois cent quatre-vingt un véhicules 'vu que vingt ne termine pas le nombre. 'aussi on aura 80 = 4 fois 20 donc quatre-vingts 'en revanche 120 = 100 plus 20 donc cent vingt ' Trait d'union pour les nombres inférieurs à 100 (en réalité de 17 à 99) '= vingt-quatre, sept cent quatre-vingt-sept , cent vingt-quatre '- Pas de trait d'union avec et = trente et un. '- Pas de trait d'union avant ou après cent, mille, millions, = deux mille cent, cent dix, mille vingt.