Procedure.s byterechner(byte.f, nachkommastellen.l)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Procedure.s byterechner(byte.f, nachkommastellen.l)

Beitrag von AND51 »

Procedure.s byterechner(byte.f, nachkommastellen.l) (einen passenderen Titel gibt's gar nicht)

... und wieder ein kleiner Codeschnipsel.
Diese Prozedur wandelt eine Byteangabe in die sinnvoll größte Einheit um und hängt diese dann auch dahinter. Angaben kleiner als 0, wie sie zum Beispiel von FileSize() wiedergegeben werden, werden von der Prozedur ignoriert. Macht manuelle If-Abfragen unnötig.
Die Rückgabe erfolgt (natürlich) als String.

Code: Alles auswählen

Procedure.s byterechner(byte.f, nachkommastellen.l)
	;	© AND-Software, 2006
	Protected temp$
	If byte < 0
		ProcedureReturn ""
	EndIf
	If byte < 1024
		byte=byte
		temp$="Byte"
		nachkommastellen=0
	EndIf
	If byte >= 1024
		byte=byte/1024
		temp$="KB"
	EndIf
	If byte >= 1024
		byte=byte/1024
		temp$="MB"
	EndIf
	If byte >= 1024
		byte=byte/1024
		temp$="GB"
	EndIf
	If byte >= 1024
		byte=byte/1024
		temp$="TB"
	EndIf
	ProcedureReturn StrF(byte, Abs(nachkommastellen))+" "+temp$
EndProcedure

Debug byterechner(FileSize("about:blank"), 2) ; nichts, da nicht existent/keine Größe
Debug byterechner(75991, 1)                   ; ca. 75 KB
Debug byterechner(12*1024*1024+339, 0)        ; ca. 12 MB
Wenn ihr Lust habt, könnt ihr ja mal eure Meinung posten, bin gespannt. Auch wenn es eine einfache Prozedur ist, dann braucht ihr sie wenigstens nicht mehr zu tippen.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Code: Alles auswählen

Procedure.s ByteRechner(fSize.f)
    Protected lLevel.l, sName.s
    
    Restore pNamen
    If fSize > 0.0
        Read sName
        
        While fSize > 1024
            fSize / 1024
            Read sName
        Wend
    
        ProcedureReturn StrF(fSize, 2) + sName
        
    Else 
        ProcedureReturn ""
    EndIf
    
EndProcedure

Debug ByteRechner(1024*1024*10)

DataSection
    pNamen:
        Data.s " Byte", " KByte", " MByte", " GByte", " TByte"
EndDataSection
Das ist meine Meinung :)
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Tja, deine Prozedur ist kürzer. Man sagt ja auch immer, auf die Länge kommt es ja sowieso nicht an :mrgreen:
Bei deiner Prozedur muss man aber immer außerhalb der eigentlichen Prozedur die DataSection mitschleifen.

Naja, ist ja auch egal, welche Prozedur eher genutzt wird. Trotzdem danke für deine Meinung...
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

AND51 hat geschrieben:Bei deiner Prozedur muss man aber immer außerhalb der eigentlichen Prozedur die DataSection mitschleifen.
Das geht auch ohne (und natürlich noch kürzer):

Code: Alles auswählen

Procedure.s ByteRechner(fSize.d)
	Protected Result.s, Namen.q, i.l

	Namen = 'KMGTPEZY'
	If fSize > 0.0
		i = 56
		While fSize > 1024
			fSize / 1024
			Result = Chr((Namen >> i) & $FF) + "i"
			i - 8
		Wend
		ProcedureReturn StrD(fSize, 2) + " " + Result + "Byte"
	EndIf

EndProcedure

Debug ByteRechner(25465215)
(das i wegen der eigentlich richtigen Angabe KiB, TiB ...)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Gute Idee.

Aber so finde ich es besser:

Code: Alles auswählen

Procedure.s ByteRechner(fSize.f) 
  Protected lLevel.l, sName.s, Letters.l
  
  Letters = 'TGMK'
  
  If fSize > 0.0 
    sName = " Byte"
    lLevel = 0
    
    While fSize > 1024 And lLevel < 4
      fSize / 1024 
      sName = " " + Chr(PeekB(@Letters + lLevel)) + "Byte"
      lLevel + 1
    Wend 
    
    ProcedureReturn StrF(fSize, 2) + sName 
  EndIf 
  
  ProcedureReturn "" 
EndProcedure 

Debug ByteRechner(10)
Debug ByteRechner(1024 * 10)
Debug ByteRechner(1024 * 1024 * 10)
Debug ByteRechner(1024 * 1024 * 1024 * 10)
Debug ByteRechner(1024 * 1024 * 1024 * 1024 * 10)
Debug ByteRechner(1024 * 1024 * 1024 * 1024 * 1024 * 10)

///EDIT:
@HeX0R:
Da fehlt noch was als Bedingung in der While-Schleife. ;)

Code: Alles auswählen

Procedure.s ByteRechner(dSize.d) 
   Protected Result.s, Namen.q, i.l 

   Namen = 'KMGTPEZY' 
   If dSize > 0.0 
      i = 56 
      While dSize > 1024 And i >= 0
         dSize / 1024 
         Result = Chr((Namen >> i) & $FF) + "i" 
         i - 8 
      Wend 
      ProcedureReturn StrD(dSize, 2) + " " + Result + "Byte" 
   EndIf 

EndProcedure 

Debug ByteRechner(10) 
Debug ByteRechner(1024 * 10) 
Debug ByteRechner(1024 * 1024 * 10) 
Debug ByteRechner(1024 * 1024 * 1024 * 10) 
Debug ByteRechner(1024 * 1024 * 1024 * 1024 * 10) 
Debug ByteRechner(1024 * 1024 * 1024 * 1024 * 1024 * 10)
Debug ByteRechner(1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 10)
Debug ByteRechner(1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 10)
Debug ByteRechner(1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 10)
Debug ByteRechner(1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 10)
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

NicTheQuick hat geschrieben: @HeX0R:
Da fehlt noch was als Bedingung in der While-Schleife. ;)
Ja o.k. , wusste nicht, dass du so grosse Festplatten hast ;)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Achso, dieses "i" finde ich schwachsinnig. Wenn von Bytes die Rede ist,
dann ist für mich der Multiplikator immer 1024. "Kibi" klingt irgendwie
"schwul". :lol:
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ach ja, wie ist denn das? Ich habe gehört, dass es keine Kilobytes etc. mehr geben soll, stattdessen gibt es jetzt nur noch Kibibyte und Mebibyte oder so ähnlich. Stimmt das? Ich meine, so eine große Veränderung kann doch an mir nicht spurlos vorübergehen...
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Beitrag von helpy »

News von 1999 bei heise.de: http://www.heise.de/newsticker/meldung/4987

Und hier noch bei wikipedia: http://en.wikipedia.org/wiki/Kibibyte
Antworten