Autres créer une chaîne numérique formaté en fonction du nombre de caractères

patricktoulon

XLDnaute Barbatruc
bonjour a tous
je simplifie mes macros
aujourd'hui je cherche a formater une chaîne numérique par groupe de 3 quelque soit le nombre de caractères

12345: doit donner 012 345

1234567: doit donner 001 234 567


j'ai tenté mod mais ca match pas a tout les coups
VB:
Sub test()
   Dim chaine$, adding$
    chaine = "12345678910111213182"
    adding = String(Len(chaine) Mod 3 + IIf(Len(chaine) Mod 3 > 0, 1, 0), "0")
    chaine = Format(adding & chaine, Application.Rept(" @@@ ", Len(chaine)))
    MsgBox chaine
End Sub
quelqu'un a une idée sans boucle
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
je sais ce que vous en pensez mais difficile de faire plus court

VB:
Option Explicit
Sub test()
    Debug.Print Nblettre2020(380)
    Debug.Print Nblettre2020(100)
    Debug.Print Nblettre2020(1000)
    Debug.Print Nblettre2020(1000000000#)
    Debug.Print Nblettre2020(10020000000#)
    Debug.Print Nblettre2020(1000000)
    Debug.Print Nblettre2020(31000)
    Debug.Print Nblettre2020(0)
    Debug.Print Nblettre2020(371)

    Debug.Print Nblettre2020("191471851,56")
    Debug.Print Nblettre2020(191471851.56)
    Debug.Print Nblettre2020("135761973946357916972394685379,56")

End Sub

Function Nblettre2020(chain)
    Dim t, dixx&, dix&, cxx&, u&, Part, ms, m, Ul, Diz, n&, I&, seg$, cc$, et$, Ss$, R$, md$, chaine$
    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("", " septilliard", " sextilliard", " Quintrillion", " quadrilliard", " trilliard", " Billiard", " milliard", " million", " mille", "")
    Part = Split(chain, ",")
    For n = LBound(Part) To UBound(Part)
        chaine = Part(n)
        t = Split(Trim(Format(String((300 - Len(Part(n))) Mod 3, "0") & Part(n), WorksheetFunction.Rept(" @@@", Len(String((300 - Len(Part(n))) Mod 3, "0") & Part(n)) / 3))))
        m = UBound(ms) - UBound(t)
        For I = LBound(t) To UBound(t)
            seg = t(I)
            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, " cent ", "")
            If dix = 9 Or dix = 7 Then dix = dix - 1: u = Val(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 And u <> 0, "-", " ")
            If dixx = 80 Then Ss = "s" Else Ss = ""
            If I = UBound(t) - 1 And Part(0) = 1000 Then u = 0
            md = ms(m):     If Val(seg) > 1 And I < UBound(t) Then md = md & "s"
             R = R & Application.Trim(Ul(cxx) & cc & Diz(dix) & et & Ul(u)) & Ss & IIf(Val(seg) > 0, md, "") & " "
            m = m + 1
        Next
         R = R & IIf(UBound(Part) > 0 And n = 0, "virgule ", "")
        If Trim(R) = "" Then R = "zero"
    Next n
    Nblettre2020 = chain & "-->  " & Trim(R)
End Function
 

patricktoulon

XLDnaute Barbatruc
re
PS: Il t'en manque encore dans l'Array
jusqu'au septilliard ca suffit non

Mon PEL est trop petit pour que j'ai besoin d'une macro pour écrire son solde en toute lettre.
je vais organiser une campagne pièce rouge pour toi :p

mais pour le moment il est nullement question de monnaie
car je pense que cette partie je vais l’extérioriser dans une autre fonction
 

eriiic

XLDnaute Barbatruc
jusqu'au septilliard ca suffit non
Ca c'est toi qui voit. Le pb c'est que tu en prends 1/2 et que c'est bon que jusqu'à million, milliard seulement.
Après c'est n'importe nawak... On dirait que tu considères que ...illion et ...iliard sont synonymes et que tu pioches au hasard. Un coup l'un, un coup l'autre.
Non, ill faut tous les prendre.
La liste devrait être :
million, milliard, billion, billiard, trillion, trilliard, quatrillion / quadrillion, quadrilliard, quintillion, quintilliard, sextillion, sextilliard, septillion, septilliard, octillion, octilliard, nonillion, nonilliard
eric
 

eriiic

XLDnaute Barbatruc
Voilà :) Sauf Quintillion et non Quintrillion

Par contre j'ai cru comprendre que tu faisais une version US.
Si c'est le cas pour eux ça sera :
thousand, million, billion, trillion, quadrillion, quintillion, sextillion, septillion, octillion, nonillion, decillion, undecillion, duodecillion, tredecillion, quattuordecillion, quindecillion, sexdecillion, septendecillion, octodecillion
Tu vas être heureux, là c'est bien 1/2 (des notres) ;-)
eric
 

Statistiques des forums

Discussions
312 300
Messages
2 087 000
Membres
103 429
dernier inscrit
PhilippeH