OVH Cloud OVH Cloud

Transformer chiffre en lettres

3 réponses
Avatar
CMT
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

3 réponses

Avatar
Anor
Bonjour ,

Probablement un problème de virgule flottante à cause d'un nombre au format réel double....

Essaye la fonction située à l'adresse suivante : http://www.anor.fr.st/
Menu mémo strings
Section "Conversion textuelle de nombres"

De toute façon, la fonction que tu as trouvée commet des fautes genre
vingts, cent vingts etc... (au lieu de vingt, cent vingt sans le s)

--
à+
Arnaud
----------------------------------------------
Conseils d'utilisation, sites recommandés :
http://users.skynet.be/mpfa/
Access Memorandum - Les tablettes d'Anor
www.anor.fr.st
----------------------------------------------


| 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
Avatar
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

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




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

--
à+
Arnaud
----------------------------------------------
Conseils d'utilisation, sites recommandés :
http://users.skynet.be/mpfa/
Access Memorandum - Les tablettes d'Anor
www.anor.fr.st
----------------------------------------------