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é. :lol:

Elle a déjà était demandé, hélas FRED n'est pas très pressé. :twisted:

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 :lol:

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 :mrgreen:

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$
:wink: :D

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) :mrgreen:

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"

Code : Tout sélectionner

12.4 567

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. :oops:

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")

:lol:

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 . :lol:

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