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:

Staple1600

XLDnaute Barbatruc
Bonjour le fil

patricktoulon
Juste pour ma gouverne (et satisfaire ma curiosité)
Dans quel contexte, ce besoin de travailler en string s'exprime-t-il ? ;)
Ou plutôt pourquoi donc tu dois ainsi formater tes chaines de caractères?
Pour quel usage professionnel?
 

patricktoulon

XLDnaute Barbatruc
Bonjour @Stapple
je réécrit complètement ma fonction Nombre en lettre que j'avais faite il y a quelques années
avec des codes plus propres
la segmentation par 3 c'est pour déterminer les centaines,dizaine,unité de chaque tranche
elle me sert aussi a créer des références de mélange couleur pour mes machines qui sont sous ce format
et puis qui peut le plus peut le moins ;)
 

patricktoulon

XLDnaute Barbatruc
re
voila ou j'en suis pour le moment
le moteur conversion c'est la boucle I
ca n'a pas trop changé de mon l'ancienne version (difficile de faire plus court);)
me reste quelques corrections orthographiques pour les ("s"/"-") comme je l'avais fait dans l'ancienne

VB:
Option Explicit
Sub test()
    Nblettre2020 10020000000#
    Nblettre2020 1000000
    Nblettre2020 ("191471851,56")
    'Nblettre2020 191471851.56
    'Nblettre2020 ("135761973946357916972394685379,56")

End Sub

Function Nblettre2020(chaine)
    Dim t, dixx&, dix&, cxx&, u&, Part, ms, m, Ul, Diz, n&, I&, seg$, cc$, et$
    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("", " sextillion", " Quintillion", " Quatrillion", " Trillion", " Billiard", " Billion", " milliard", " million", " mille", "")
    Part = Split(chaine, ",")
    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, "-", " ")
            Debug.Print Application.Trim(Ul(cxx) & cc & Diz(dix) & et & Ul(u)) & IIf(Val(seg) > 0, ms(m), "") & " (" & seg & ")"
            m = m + 1
        Next
        Debug.Print IIf(UBound(Part) > 0 And n = 0, "separateur", "")

    Next n

End Function

POUR INFO mon ancienne version
Code:
Option Explicit

Function nBlettre_methode_globale(nombres As String, Optional ByVal sstr As String = "virgule", Optional ByVal finance As Boolean = False)
    Dim en_dec(2), unit1, unit10, ms, cms As Long, decs As Long, ex As Long, ddd As String, centi As String, e As Long, i As Long, a As Long, dix As Long
    Dim nombre As String, u As String, c As String, ct As String, et As String, ss As String, neg As Boolean
    unit1 = Array("", " Un", " Deux", " Trois", " Quatre", " Cinq", " Six", " Sept", " Huit", " Neuf", " Dix", " Onze", " Douze", " treize", " Quatorze", " Quinze", " Seize", " Dix-Sept", " Dix-Huit", " Dix-Neuf", " cent", " zéro")
    unit10 = Array("", " dix", " vingt", " trente", " quarante", " cinquante", " soixante", " soixante-dix", " quatre-vingt", " quatre-vingt-dix", " cent")
    ms = Array("", " sextillion", " Quintillion", " Quatrillion", " Trillion", " Billiard", " Billion", " milliard", " million", " mille", ""): cms = UBound(ms)

    If Left(nombres, 1) = "-" Then nombres = Mid(nombres, 2, Len(nombres)): neg = True
    decs = 0: nombres = Replace(nombres, ".", ","): en_dec(0) = Split(nombres, ",")(0): If InStr(nombres, ",") > 0 Then en_dec(1) = Split(nombres, ",")(1): decs = 1    'on separe le decimal de l'entier
    If Len(en_dec(0)) Mod 3 <> 0 Then en_dec(0) = Application.Rept("0", 3 - Len(en_dec(0)) Mod 3) & en_dec(0)    'on formate l'entier a 3 chiffre par tranche
    If decs = 1 Then en_dec(1) = Right("00" & Round(Val("0." & en_dec(1)), 2) * 100, 3)  ' NOUVELLE METHODE POUR ADAPTER LE DECIMAL on formate a 3 chiffres
    ex = cms - (Len(en_dec(0)) / 3) + 1    ' index de point de depart des expressions dans l'array ms
    ddd = IIf(Val(en_dec(0)) > 999000 And Val(Right(en_dec(0), 6)) = 0, IIf("aAeEiIoOuUyY" Like "*" & Left(sstr, 1) & "*", " d' ", " de"), " ")
    centi = IIf(sstr <> "dollar", " centime", " cent")
    If sstr = "virgule" Then centi = ""
    sstr = IIf(Val(en_dec(0)) > 1, sstr & "s", sstr)
    If decs = 1 Then centi = IIf(Val(en_dec(1)) > 1, centi & "s", centi)
    For e = 0 To decs
        For i = 1 To Len(en_dec(e)) Step 3
            a = ex + Round(i / 3)    'position actuelle de ms
            nombre = Mid(en_dec(e), i, 3)    ' la tranche
            dix = Mid(nombre, 2, 1): u = Right(nombre, 1): c = Left(nombre, 1): If c > 1 Then c = c: ct = unit1(20) & IIf(Val(dix & u) > 0, "", "s") Else: ct = "": If c = 1 Then c = 20
            If dix = 1 Or dix = 7 Or dix = 9 And Right(u, 1) > 0 Then dix = dix - 1: u = u + 10   'on corrige le 1,7,9
            If dix > 1 And dix <> 8 And Right(u, 1) = 1 Then et = " et" Else: If dix = 0 Or u = 0 Then et = "" Else et = "-"  ' on accorde de 1 a 99

            If u = 0 Then If dix = 8 Then If ms(a) = " mille" Then et = "" Else et = "s"     'le s a quatre-vingt tout seul

            If nombre = 0 And Len(en_dec(0)) = 3 Then u = 21: dix = 0    ' le zéro si l'entier vaut 0 tout simplement
            If nombre = 0 And i <> 1 Then a = 0
            If nombre = 1 And i = 1 And a = cms - 1 Then u = 0
            If e = 0 And nombre > 1 And a < cms - 1 Then ss = "s" Else ss = ""
            nBlettre_methode_globale = nBlettre_methode_globale & Replace(unit1(c) & ct & unit10(dix) & et & unit1(u), "- ", "-") & IIf(e = 0, ms(a), "") & ss
        Next i
        If finance = False Then
            nBlettre_methode_globale = nBlettre_methode_globale & IIf(e = 0 And decs = 1, " virgule ", "")
        Else
            nBlettre_methode_globale = nBlettre_methode_globale & IIf(e = 0 And decs = 1, ddd & " " & sstr & " et ", IIf(decs = 0, " " & sstr, "")) & IIf(e = 1, centi, "")
        End If
    Next e
    If neg = True Then nBlettre_methode_globale = "moins " & nBlettre_methode_globale
End Function
Sub tes2()
    MsgBox nBlettre_methode_globale(256354.2153, "euro", True)
    MsgBox nBlettre_methode_globale(10000000.2153, "euro", True)
    MsgBox nBlettre_methode_globale(10000000.2153, "Dirham", True)
    MsgBox nBlettre_methode_globale(10000000.2153, "dollar", True)
    MsgBox nBlettre_methode_globale(1.1, "Dirham", True)
    MsgBox nBlettre_methode_globale(12563.2365)
    MsgBox nBlettre_methode_globale(1.01)
End Sub

la formule pour l'ancienne version:
=SI(A1=0;" ";nBlettre_methode_globale((A1);"dollar";1))
 
Dernière édition:

eriiic

XLDnaute Barbatruc
Bonjour à tous,

qq chose m'échappe...
Pourquoi cette absence de trilliard, quadrilliard, quintilliard et autres sextilliard ?
Si tu utilises l'échelle courte (américaine), à ce moment là il n'y a pas de milliard ni de billiard qui s'appelent billion et quadrillon, avec le trillion qui s'intercale entre les 2.
Un billion=10^12 pour nous, mais =10^9 pour les américains.
Si tu utilises l'échelle longue il faut la respecter tout au long. Là les noms sont faux à partir de 10^21 il me semble.
Voir échelle longue continentale (Peletier) : https://fr.wikipedia.org/wiki/Échelles_longue_et_courte#Noms_des_grandes_puissances_de_10
eric
 

Membres actuellement en ligne

Statistiques des forums

Discussions
315 097
Messages
2 116 186
Membres
112 679
dernier inscrit
Yupanki