Page 1 sur 1

Convertir Octets et afficher en Ko, Mo, Go, To

Publié : mar. 19/avr./2022 20:55
par hub73
Bonjour à vous.
Auriez vous un code qui convertit une taille de fichier en Octets, Ko, Mo, Go et To ? ( pour affichage)
Merci.

J'ai bien un code, qui va jusqu"au Ko, mais je ne le comprends pas et ne sait pas l'adapter.

Code : Tout sélectionner

 Procedure.s ConvertirTailleFichier(chiffre.d)
    
  Protected ch2.d
  Protected a$
  Protected I
  Protected X
  Protected J$
  
  ch2.d = chiffre.d/1024 
  a$ = StrD(ch2.d,3) 
  I = 0    
  For X = 1 To Len(a$)
   If Mid(a$,X,1) ="."
       Break
     EndIf
     I = I + 1
   Next
   j$ = ""
   Select I
    Case 1   
       If ch2.d < 1
        J$ = "O"
       Else
        J$ = "Ko"
      EndIf 
    Case 2 To 3
        J$ = "Ko" 
    EndSelect  
    ProcedureReturn a$ + " " + j$
      
  EndProcedure

Re: Convertir Octets et afficher en Ko, Mo, Go, To

Publié : mar. 19/avr./2022 21:09
par hub73
J'ai adapté un code mais ce n'est pas précis

Code : Tout sélectionner

  Procedure.s  ConvertirTailleFichier(chiffre.d) 
    
    Protected i
    
    Dim T$(5)
    
    T$(0) = "o"
    T$(1) = "Ko"
    T$(2) = "Mo"
    T$(3) = "Go"
    T$(4) = "To"
    T$(5) = "To"
    
    For i=0 To ArraySize(T$())-1 
      If chiffre <= 1024
        ProcedureReturn Str(chiffre) + " " + T$(i)
      Else
        chiffre =  ValF (StrD (Chiffre / 1024,2))
      EndIf  
    Next  
    ProcedureReturn Str(Chiffre) + "Po"
  EndProcedure

Re: Convertir Octets et afficher en Ko, Mo, Go, To

Publié : mar. 19/avr./2022 23:44
par Ar-S
dans ton code 2 je vois :

Code : Tout sélectionner

 T$(4) = "To"
 T$(5) = "To"
Note que les Go Mo etc c'est une base 1000 pas 1024
sinon c'est des Mebibyte et pas Megabyte et Gibibyte au lieu de Gigabyte

J'ai fait ça avant hier pour un soft de téléchargement ^^

Code : Tout sélectionner

    Procedure.s ConvertSize(filesize.q, decimal.l = 2)
    ; ROUTINE DE CONVERSION DE LA TAILLE FICHIER - by Ar-S
        taille.s = Str(filesize)
        Longueur = Len( taille )
      
      Select Longueur
          Case 10,11,12  ; GO 
              ext.s = "go"
              p.s = StrF(filesize/1000000000 ,2)
          Case 7,8,9    ; MO
              ext.s = "mo"
              p.s = StrF(filesize/1000000 ,2)
          Case 4,5,6    ; KO
              ext.s = "ko"
              p.s = StrF(filesize/1000 ,2)
          Case 1,2,3    ; O
              ext.s = "o"
              p.s = Str(filesize)
          Default 
              ext.s = "o"
              p.s = Str(filesize)
      EndSelect  
      
      ProcedureReturn p + " " + ext
      
  EndProcedure
  
  ;Exemple
  taille = 3560001200
  
  Debug ConvertSize(taille)
  
  For i = taille To 0 Step -100000
      
      Debug ConvertSize(i)
      
  Next
  

Re: Convertir Octets et afficher en Ko, Mo, Go, To

Publié : mer. 20/avr./2022 15:43
par Mesa

Code : Tout sélectionner

Procedure.s ConvertirTailleFichier(TailleEnOctets.d, Option$="oz", Precision = 1, SI=#True)
	
	;Options : 
	;oc = resultat en octets
	;ko = Ko
	;mo = Mo
	;go = Go
	;to = To
	;oz = au plus proche
	
	;Precision = nombre de chiffre après la virgule
	
	;SI =#True = puissance de 10 sinon puissance de 2 et 1 Ko= 1 kio = 1024 octects)
	
	
	;Remarque: Limite du au calcul = 999 999 999 999 999 octets = 999.9 To
	;Remarque: La fonction StrD() de PB fait un arrondi
	
	;TODO: 		Ecrire une fonction StrD qui ne fasse pas d'arrondi
	
	
	If Precision <0:ProcedureReturn "?":EndIf
	If TailleEnOctets > 999999999999999:ProcedureReturn "Over 1000 To":EndIf
	
	Protected diviseur.d
	Protected suffixe.s{3}
	Protected tmpd.d
	Protected i
	Protected j.d
	
	If SI = #True
		diviseur = 1000.0
	Else
		diviseur = 1024.0
	EndIf
	
	Select LCase(option$)
		Case "oc"
			diviseur = 1.0
			suffixe = "Oct"
		Case "ko"
			suffixe = "Ko"
		Case "mo"
			diviseur = diviseur*diviseur
			suffixe = "Mo"
		Case "go"
			diviseur = diviseur*diviseur*diviseur
			suffixe = "Go"
		Case "to"
			diviseur = diviseur*diviseur*diviseur*diviseur
			suffixe = "To"
					
		Case "oz"		
			j.d = diviseur

			For i=1 To 15
				tmpd=TailleEnOctets / j

				If tmpd < 1
					Break
					
				EndIf
				
				j=j*10
			Next i

			Select i
				Case 0,1
					diviseur = 1.0
					suffixe = "Oct"
				Case 2,3,4
					suffixe = "Ko"
				Case 5,6,7
					diviseur = diviseur*diviseur
					suffixe = "Mo"
					
				Case 8,9,10
					diviseur = diviseur*diviseur*diviseur
					suffixe = "Go"
					
				Case 11,12,13
					diviseur = diviseur*diviseur*diviseur*diviseur
					suffixe = "To"
					
				Default
					TailleEnOctets = 0
					suffixe = "?"
					
			EndSelect
			
			Default
					TailleEnOctets = 0
					suffixe = "?"
	EndSelect
	
	tmpd = TailleEnOctets / diviseur
	ProcedureReturn StrD(tmpd,Precision) + " " + suffixe
	
EndProcedure


Debug ConvertirTailleFichier(123456789)

Debug ""

TEST.d = 1024.0 * 1024.0
Debug ConvertirTailleFichier(TEST,"oc",0)
Debug ConvertirTailleFichier(TEST,"ko",5)
Debug ConvertirTailleFichier(TEST,"mo",5)
Debug ConvertirTailleFichier(TEST,"go",11)
Debug ConvertirTailleFichier(TEST,"to",11)

Debug ""

Debug ConvertirTailleFichier(1024)
Debug ConvertirTailleFichier(1024,"oz",1,#False)

Debug ""

Debug ConvertirTailleFichier(1)
j.d=1.0
For i=1 To 15
	j=j*10
	Debug ConvertirTailleFichier(j)
Next i
 
Debug ""

j.d=0.0
For i=0 To 5	
	j=1*Pow(2.0, 10*i)
	Debug ConvertirTailleFichier(j,"oz",1,#False)
	j=10*Pow(2.0, 10*i)
	Debug ConvertirTailleFichier(j,"oz",1,#False)
	j=100*Pow(2.0, 10*i)
	Debug ConvertirTailleFichier(j,"oz",1,#False)
	
Next i
 
Debug ""

Debug ConvertirTailleFichier(999999999999999) ;affiche 1000 To = erreur d'arrondi, voir ci-dessous
Debug ConvertirTailleFichier(999999999999999+1)
 
Debug ""

a.d=999999999999999.0
b.d=1000*1000*1000*1000
c.d=a/b
Debug "Nombre"
Debug a
Debug b
Debug c
Debug "StrD()"
Debug StrD(a)
Debug StrD(b)
Debug StrD(c)

M.

Re: Convertir Octets et afficher en Ko, Mo, Go, To

Publié : mer. 20/avr./2022 17:00
par hub73
Merci à vous pour votre code, je regarde tout çà pour apprendre et comprendre comment vous faites. Votre expérience se mesure sur ces petits exemples. Nous avons de la chance d'être aidés ici.

Re: Convertir Octets et afficher en Ko, Mo, Go, To

Publié : jeu. 21/avr./2022 12:48
par GallyHC
Bonjour,

Voila ma version :

Code : Tout sélectionner

Procedure.s ConvertSize(filesize.d, decimal.l = 1)
  Protected i.l = 1
  Protected j.s = "o,Ko,Mo,Go,To"
  Protected k.l = CountString(j, ",")
  
  While filesize >= 1024 And i <= k
    filesize / 1024
    i + 1
  Wend
  
  Protected sres.s = StrF(filesize, decimal)
  Protected sent.s = StringField(sres, 1, ".")
  Protected sdec.s = StringField(sres, 2, ".")
  
  If i = 1
    ProcedureReturn sent + " o"
  Else
    If Val(sdec) = 0
      ProcedureReturn sent + " " + StringField(j, i, ",")
    Else
      ProcedureReturn sres + " " + StringField(j, i, ",")
    EndIf
  EndIf  
  
EndProcedure

Debug ConvertSize(100000)
Cordialement,

Re: Convertir Octets et afficher en Ko, Mo, Go, To

Publié : jeu. 21/avr./2022 18:58
par Ollivier
Moi, j'en ai une encore plus petite, et qui fait les deux modes de mesure (mettre 1 en 2ème argument facultatif pour les kibi etc...)

Code : Tout sélectionner

Procedure.S Kibilo(x, y = 0, n = 0)
 D = 1000 + 24 * y
 If x => D
  ProcedureReturn Kibilo(x / D, y, n + 1)
 EndIf
 ProcedureReturn Str(x) + Mid(" KMGTPE", n + 1, Bool(n) ) + Left("i", y * n)
EndProcedure
Exemple :

Code : Tout sélectionner

For I= 0 To 62
 J.D = 1 << I
 Debug Str(J) + " : " + Kibilo(J) + "o    /    " + Kibilo(J, 1) + "o"
Next