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