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.