Nombre en toute lettre de base

Nombre en toute lettre de base

patricktoulon

XLDnaute Barbatruc
patricktoulon a posté une nouvelle ressource :

Nombre en toute lettre de base - converti un nombre en nombre en toute lettre

Bonjour a tous
après une demande je me suis rendu compte que le contexte de monnaie dans ma fonction somme en toute lettres pouvait être gênante dans le sens ou on pourrait avoir a convertir simplement en lettre
je vous livre donc ma fonction de base qui a servi a créer ma précédente fonction
sauf qu'ici il est nullement question de monnaie ou mesure que ce soit

le principe est le même bien évidement 3 array(unité,dizaine,mesure)

le moteur diffère un peu je travaille...

En savoir plus sur cette ressource...
 

Modeste geedee

XLDnaute Barbatruc
;) petit bug ....
1579439955586.png
 

patricktoulon

XLDnaute Barbatruc
re
petite correction apporté suite au constat de Modeste geedee

VB:
'
Function NombreEnLettre(chain As String, Optional decimale As Long = 2) As String
    Dim t, dixx&, dix&, cxx&, u&, uL
    uL = Array("", "un", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf", "dix", "onze", "douze", "treize", "quatorze", "quinze", "seize", "dix-sept", "dix-huit", "dix-neuf", "cent ")
    Diz = Array("", "dix", "vingt", "trente", "quarante", "cinquante", "soixante", "soixante-dix", "quatre-vingt", "quatre-vingt-dix", "cent")
    ms = Array("", " decilliard", " decillion", " nonilliard", " nonillion", " octillard", " octillion", " septilliard", " septillion", " sextilliard", " sextillion", " quintilliard ", " Quintillion", " quadrilliard", " quadrillion", " trilliard", " trillion", " Billiard", " billion", " milliard", " million", " mille", "")
    x = UBound(ms)
    t = Split(chain, ",")
    If UBound(t) > 0 And Val(t(1)) = 0 Then t = Array(t(c))
    For c = 0 To UBound(t)
        chaine = t(c)
        If c = 0 Then chaine = "00" & t(c)
        If c = 1 Then chaine = "0" & Left(chaine & "0000", decimale): If Len(chaine) > 4 Then chaine = Left(chaine, 4)
        Z = 0

        For i = Len(chaine) - 2 To 1 Step -3
            Z = Z + 1: seg = Mid(chaine, i, 3)
            cxx = Left(seg, 1): dixx = Right(seg, 2): dix = Mid(seg, 2, 1): u = Right(seg, 1)
            If cxx = 1 Then cxx = 20: cc = "" Else cc = IIf(cxx > 0, "-cents ", "")
            If dix = 9 Or dix = 7 And u >= 1 Then dix = dix - 1: u = u + 10
            If dixx > 9 And dixx < 20 Then dix = 0: u = u + 10
            If dix >= 2 And dix <= 7 And (u = 1 Or u = 11) Then et = " et " Else et = IIf(dix <> 0, IIf(u <> 0, "-", " "), " ")
            If Val(seg) = 0 Then ms(UBound(ms) - Z + 1) = ""
            If Z = 2 And Val(seg) = 1 Then uL(1) = ""
            If c = 0 Then entier = Application.Trim(Application.Trim(uL(cxx) & cc & Diz(dix) & et & uL(u)) & " " & ms(x) & IIf(Val(seg) > 1 And Z > 2, "s", "") & " " & entier)
            uL(1) = "un"
            If c > 0 Then dec = dec & "," & Application.Trim(Application.Trim(uL(cxx) & cc & Diz(dix) & et & uL(u)))
            x = x - 1
        Next
    Next
    NombreEnLettre = Replace(entier & dec, " ", "-")
End Function

pour tester
Code:
Sub test()
    'MsgBox NombreEnLettre("4597367987967825932589,5")
    'MsgBox NombreEnLettre("1000000,56")
    'MsgBox NombreEnLettre("100000,56")
    'MsgBox NombreEnLettre("1001000,56")
    MsgBox NombreEnLettre("1001000,5667", 3)
    MsgBox NombreEnLettre("1001000,564")
    MsgBox NombreEnLettre(12345.0025, 3)    '
    MsgBox NombreEnLettre(12345.0025)    '
    MsgBox NombreEnLettre(12345.036, 3)
    MsgBox NombreEnLettre(12345.36, 3)
    MsgBox NombreEnLettre(12345.367, 3)
    MsgBox NombreEnLettre(12345.036)
    MsgBox NombreEnLettre(12345.44)
    'MsgBox NombreEnLettre(12345.25, 3)
    'MsgBox NombreEnLettre(12345.36, 3)
    'MsgBox NombreEnLettre(12345.44)
    'MsgBox NombreEnLettre("45345,00")
End Sub

autrement dit
0.5 devient 0.50
0.0025 devient 0.00 avec argument 2 et zero,deux avec argument 3
 

Modeste geedee

XLDnaute Barbatruc
Bonsour®
Encore l'autre e***rdeur !... Si, vous l'avez dit ! je l'ai entendu...
je ne comprends pas l'utilisation de l'argument optional decimale =2 ???
1579529377817.png
 

patricktoulon

XLDnaute Barbatruc
re
oui 2 est d'office on est pas obligé de le mettre

avec 2 ou rien 1.123= 1.12 un,douze
avec 3 c'est = à 1.123 un,cent-vingt-trois
c'est juste une considération selon le besoins 2 ou 3 décimales
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 910
Membres
101 837
dernier inscrit
Ugo