Page 1 sur 2
formatage de sortie pour les nombre (separateur milliers)
Publié : ven. 06/janv./2012 3:45
par jygmaxima
Bonjour
question : existe t il une fonction pour permettre l'affichage d'un nombre avec le separateur de milliers .
par exemple 9123456.21 devrait se retrouvé affiché 9 123 456.21 ?
et plus globalement un formatage de style : FormatString(mavar,"### ###.##)
merci d avance pour votre reponse.
Re: formatage de sortie pour les nombre (separateur milliers
Publié : ven. 06/janv./2012 6:15
par SPH
un truc du genre :
Code : Tout sélectionner
a$="12351255.687435554"
For i=1 To Len(a$)
If Mid(a$,i,1)="."
Goto ok
EndIf
Next
ok:
If i=7
b$=Mid(a$,i-6,3)+" "+Mid(a$,i-3,Len(a$))
EndIf
If i=8
b$=Mid(a$,i-7,1)+" "+Mid(a$,i-6,3)+" "+Mid(a$,i-3,Len(a$))
EndIf
If i=9
b$=Mid(a$,i-8,2)+" "+Mid(a$,i-6,3)+" "+Mid(a$,i-3,Len(a$))
EndIf
If i=10
b$=Mid(a$,i-9,3)+" "+Mid(a$,i-6,3)+" "+Mid(a$,i-3,Len(a$))
EndIf
If i=11
b$=Mid(a$,i-10,1)+" "+Mid(a$,i-9,3)+" "+Mid(a$,i-6,3)+" "+Mid(a$,i-3,Len(a$))
EndIf
If i=12
b$=Mid(a$,i-11,2)+" "+Mid(a$,i-9,3)+" "+Mid(a$,i-6,3)+" "+Mid(a$,i-3,Len(a$))
EndIf
If i=13
b$=Mid(a$,i-12,3)+" "+Mid(a$,i-9,3)+" "+Mid(a$,i-6,3)+" "+Mid(a$,i-3,Len(a$))
EndIf
Debug b$
Re: formatage de sortie pour les nombre (separateur milliers
Publié : ven. 06/janv./2012 9:05
par MLD
Salut a tous
une autre solution
Code : Tout sélectionner
Procedure.s Formatmonnaie(valeur$)
ind = 0
ReplaceString(valeur$, ".", ",", #PB_String_InPlace, 1)
For x = Len(valeur$) To 1 Step -1
ind = ind + 1
valeur2$ = valeur2$ + Mid(valeur$,x,1)
If ind = 3
ind = 0
If Mid(valeur$,x,1) <> ","
valeur2$ = valeur2$ + " "
EndIf
EndIf
Next
ProcedureReturn ReverseString(valeur2$)
EndProcedure
Debug Formatmonnaie("123456789.29")
Re: formatage de sortie pour les nombre (separateur milliers
Publié : ven. 06/janv./2012 10:17
par beruska
Il existe aussi cette procédure:
Code : Tout sélectionner
Procedure.s StrNum(Number.s, decimal.l = 2) ; Formats a number string as a number string customized for a specified locale.
Protected result.s, fmt.NUMBERFMT
fmt\NumDigits = decimal ; Specifies the number of fractional digits.
fmt\LeadingZero = 0 ; Specifies whether to use leading zeroes in decimal fields.
fmt\Grouping = 3 ; Specifies the size of each group of digits to the left of the decimal.
fmt\lpDecimalSep = @"," ; Pointer to a null-terminated decimal separator string.
fmt\lpThousandSep = @"." ; Pointer to a null-terminated thousand separator string.
fmt\NegativeOrder = 1 ; Specifies the negative number mode (LOCALE_INEGNUMBER).
result = Space(GetNumberFormat_(0, 0, Number, fmt, 0, 0))
GetNumberFormat_(0, 0, Number, fmt, @result, Len(result))
ProcedureReturn result
EndProcedure
Macro Mille(Number)
StrNum(StrF(Number), 2)
EndMacro
Debug Mille(8125243.67)
Re: formatage de sortie pour les nombre (separateur milliers
Publié : ven. 06/janv./2012 10:34
par Ulix
Salut a tous !
Une commande en natif du genre PrintUsing (####.##) serait d'une grande utilité.
Elle a déjà était demandé, hélas FRED n'est pas très pressé.
Cela fait partie de toute ces petite chose qui manque a PB, pour être (a mon gout) dans la cours des grand.
Enfin, pour un vrai PrintUsing()
+1 (je vote pour)
A+!
Re: formatage de sortie pour les nombre (separateur milliers
Publié : ven. 06/janv./2012 12:50
par Backup
ouaip un truc comme ça
Code : Tout sélectionner
Procedure.s printusing(txt.s,mask.s,ForceMask.b=#False)
; de Thyphoon
Result.s=""
Quit=#False
lt.b=Len(txt)+1
lm.b=Len(mask)+1
Repeat
c.s=Mid(mask,lm,1)
If c="#" And lt>0
Result=Mid(txt,lt,1)+Result
lt=lt-1
lm=lm-1
ElseIf c<>"" And lm>0
Result=c+Result
lm=lm-1
Else
lt=lt-1
lm=lm-1
EndIf
Until (ForceMask=#False And lt<1) Or (ForceMask=#True And lm<1 And lt<1)
ProcedureReturn Result
EndProcedure
Debug printusing("1250","###,###")
Debug printusing("8080000","### ### ### ###")
Debug printusing("26122009","##-##-####")
Debug printusing(RSet(Str(1250333), 9, "0"),"$### ### ###",#True)
Re: formatage de sortie pour les nombre (separateur milliers
Publié : ven. 06/janv./2012 14:16
par SPH
Le code le plus puissant et petit jamais fait :
Code : Tout sélectionner
a$="12345.6789"
For i=1 To Len(a$)
If Mid(a$,i,1)="."
Goto ok12345
EndIf
Next
ok12345:
b$=Mid(a$,i-3,Len(a$))
s=0
For u=i-4 To 1 Step-1
If s=0
b$=" "+b$
EndIf
s+1 : s%3
b$=Mid(a$,u,1)+b$
Next
Debug b$
Re: formatage de sortie pour les nombre (separateur milliers
Publié : ven. 06/janv./2012 16:03
par MLD
Salut SPH
oui mais sans GOTO
Code : Tout sélectionner
a$="12345.6789"
For i=1 To Len(a$)
If Mid(a$,i,1)="."
Break
EndIf
Next
b$=Mid(a$,i-3,Len(a$))
s=0
For u=i-4 To 1 Step-1
If s=0
b$=" "+b$
EndIf
s+1 : s%3
b$=Mid(a$,u,1)+b$
Next
Debug b$

Re: formatage de sortie pour les nombre (separateur milliers
Publié : ven. 06/janv./2012 16:17
par SPH
Bien joué, je n'utilise jamais les break (mais je vais m'y mettre now)

Re: formatage de sortie pour les nombre (separateur milliers
Publié : ven. 06/janv./2012 17:41
par MLD
Une autre solution avec une seule boucle
Code : Tout sélectionner
a$ = "123123123.36"
i.w=0
For x = Len(a$) To 1 Step -1
i + 1
If Mid(a$,x,1) <> "." And i= 3
b$ = " " + Mid(a$,x,1)+ b$
i + 1
Else
b$ = Mid(a$,x,1) + b$
If Mid(a$,x,1) = ".": i = 0:EndIf
EndIf
If i > 3 : i = 0: EndIf
Next
Debug b$
Re: formatage de sortie pour les nombre (separateur milliers
Publié : ven. 06/janv./2012 17:44
par SPH
MLD a écrit :Une autre solution avec une seule boucle
Code : Tout sélectionner
a$ = "123123123.36"
i.w=0
For x = Len(a$) To 1 Step -1
i + 1
If Mid(a$,x,1) <> "." And i= 3
b$ = " " + Mid(a$,x,1)+ b$
i + 1
Else
b$ = Mid(a$,x,1) + b$
If Mid(a$,x,1) = ".": i = 0:EndIf
EndIf
If i > 3 : i = 0: EndIf
Next
Debug b$
Nan, ca plante :
a$ = "12.4567"
Re: formatage de sortie pour les nombre (separateur milliers
Publié : ven. 06/janv./2012 18:01
par MLD
SPH
oui oui. c'est pour un format monétaire 3 chiffres aprés la vigule max.
Code : Tout sélectionner
Procedure.s Formatmonnaie(a$)
ReplaceString(a$, ".", ",", #PB_String_InPlace, 1)
i.w=0
For x = Len(a$) To 1 Step -1
b$ = Mid(a$,x,1)
i + 1
If b$ <> "," And i= 3
c$ = " " + b$ + c$
i + 1
Else
c$ = b$ + c$
If b$ = ",": i = 0:EndIf
EndIf
If i > 3 : i = 0: EndIf
Next
ProcedureReturn c$
EndProcedure
Debug Formatmonnaie("123456789.296")

Re: formatage de sortie pour les nombre (separateur milliers
Publié : ven. 06/janv./2012 18:51
par Mesa
Je mets un code qui a une vocation didactique.
Code : Tout sélectionner
Procedure.s FormatString_Separateur_de_Milliers(chaine$)
Nombre_Negatif$ = "NON"
;cas particuliers des nombres négatifs, on enlève le signe
If FindString(Chaine$, "-", 1) > 0
Nombre_Negatif$ = "OUI"
chaine$ = RemoveString(chaine$, "-", #PB_String_NoCase, 1, 1)
EndIf
Longueur=Len(chaine$)
Position_Virgule=FindString(Chaine$, ".", 1)
;si le point "." n'est pas trouvé, on cherche la virgule ","
If Position_Virgule=0
Position_Virgule=FindString(Chaine$, ",", 1)
EndIf
;cas particulier des nombres entiers
If Position_Virgule=0
Position_Virgule = Longueur + 1
EndIf
Partie_gauche$ = Left(Chaine$,Position_Virgule-1)
Partie_Droite$ = Right(Chaine$, Longueur - Position_Virgule+1)
Nombre_Espace_a_Prevoir = (Len(Partie_gauche$))/3
; Pour inserer les espaces, il est plus facile d'inverser la chaine en premier
chaine_inverse$ = ReverseString(Partie_gauche$)
; insertion des espaces tous les 3 chiffres + l'espace lui-même = 4 caractères
For i=1 To Nombre_Espace_a_Prevoir
chaine_inverse$ = InsertString(chaine_inverse$, " ", 4*i)
Next i
; on inverse et on ajoute la partie décimale
Resultat.s=ReverseString(chaine_inverse$) + Partie_Droite$
; si le nombre était négatif on ajoute le "-" qui sera toujours collé au bon endroit
If Nombre_Negatif$ = "OUI"
Resultat = "-" + Resultat
EndIf
ProcedureReturn Resultat
EndProcedure
a$ = "12351255.687435554"
b$ = "1234567"
c$ = "-1245789.9865"
d$ = "-1245789"
Debug FormatString_Separateur_de_Milliers(a$)
Debug FormatString_Separateur_de_Milliers(b$)
Debug FormatString_Separateur_de_Milliers(c$)
Debug FormatString_Separateur_de_Milliers(d$)
Mesa.
Re: formatage de sortie pour les nombre (separateur milliers
Publié : ven. 06/janv./2012 20:02
par jygmaxima
Hé bien ! quelle réactivité de votre part ! j'en suis estomaqué et en meme temps rassuré car oui,avec cette entourage bienveillant je vais me mettre vraiment a pure basic meme s'il manque encore quelques fonctions necessaires a l'elaboration de progiciels costauds style comptabilité et gescom.
Encore merci .

Re: formatage de sortie pour les nombre (separateur milliers
Publié : ven. 06/janv./2012 23:58
par jygmaxima
Un petit retour sur les solutions genereusement indiquées.
Dobro : La solution 'by Typhoon' a le merite d'imposer un format de resultat. (### ###.###)
c'est donc celle ci que je retiens bien que toutes offrent de bons resultats.
le seul petit hic est que dans le cas d'une valeur entiere pile poil et que je demande d'imposer 2 chiffres apres la virgule il se fait un decalage
ex : 12345.32 avec ### ###.## --->12 345.32
mais 12345 avec ### ###.## ---> 123.45 au lieu de 12 345.00
faut donc penser a bien initialiser le texte a envoyer a la fonction.
et en fin un petit rset(resultat,len(mask)) pour cadrer a droite de la zone d'affichage et tout baigne.(penser a oter les espaces dans le len)
merci encore