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

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
hub73
Messages : 126
Inscription : sam. 16/janv./2021 20:17

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

Message 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
hub73
Messages : 126
Inscription : sam. 16/janv./2021 20:17

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

Message 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
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message 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
  
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

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

Message 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.
hub73
Messages : 126
Inscription : sam. 16/janv./2021 20:17

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

Message 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.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

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

Message 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,
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

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

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