Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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
tiens pour Staple16000
tu la en français et en us le modele de la " maison mere"
j'ai fait quelque ajustement pour le français mais il reste les "-" a placer sur certains nombre
 

Pièces jointes

  • nombre en lettre version Micorsoft .xlsm
    27.3 KB · Affichages: 3

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
 

patricktoulon

XLDnaute Barbatruc
re
VB:
ms = Array("", " septilliard", "septillion", " sextilliard", "sextillion", "quintilliard", " Quintrillion", " quadrilliard", "quadrillion", " trilliard", "trillion", " Billiard", "billion", " milliard", " million", " mille", "")
 

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
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…