formatage de sortie pour les nombre (separateur milliers)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
jygmaxima
Messages : 8
Inscription : ven. 06/janv./2012 3:32
Localisation : papeete (11 h decalage hor.)

formatage de sortie pour les nombre (separateur milliers)

Message 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.
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: formatage de sortie pour les nombre (separateur milliers

Message 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$



!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: formatage de sortie pour les nombre (separateur milliers

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

beruska
Messages : 21
Inscription : sam. 28/mai/2011 12:32

Re: formatage de sortie pour les nombre (separateur milliers

Message 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)
Avatar de l’utilisateur
Ulix
Messages : 315
Inscription : ven. 04/juin/2004 14:27
Localisation : Frontignan

Re: formatage de sortie pour les nombre (separateur milliers

Message 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+!
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: formatage de sortie pour les nombre (separateur milliers

Message 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)
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: formatage de sortie pour les nombre (separateur milliers

Message 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$

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: formatage de sortie pour les nombre (separateur milliers

Message 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
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: formatage de sortie pour les nombre (separateur milliers

Message par SPH »

Bien joué, je n'utilise jamais les break (mais je vais m'y mettre now) :mrgreen:

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: formatage de sortie pour les nombre (separateur milliers

Message 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$
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: formatage de sortie pour les nombre (separateur milliers

Message 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

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: formatage de sortie pour les nombre (separateur milliers

Message 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:
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: formatage de sortie pour les nombre (separateur milliers

Message 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.
jygmaxima
Messages : 8
Inscription : ven. 06/janv./2012 3:32
Localisation : papeete (11 h decalage hor.)

Re: formatage de sortie pour les nombre (separateur milliers

Message 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:
jygmaxima
Messages : 8
Inscription : ven. 06/janv./2012 3:32
Localisation : papeete (11 h decalage hor.)

Re: formatage de sortie pour les nombre (separateur milliers

Message 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
Répondre