byterechner() - Bytes in größtmögliche Einheit umrechnen

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

Beitrag von AND51 »

Hallo!

Ganz besonders an NicTheQuick:

Die bisherige Prozedur hat bei einer ANgabe von 0 Byte nicht korrekt gerechnet, denn anscheinend gibt es kein Log(0). Ich habe die Prozedur etwas verbessert...

Code: Alles auswählen

Procedure.s byterechner(byte.q, NbDecimals.l=0)
	Protected unit.l
	If byte
		unit=Round(Log(byte)/Log(1024), 0)
	EndIf
	ProcedureReturn StrD(byte/Pow(1024, unit), NbDecimals*(unit And 1))+" "+StringField("Byte,KB,MB,GB,TB,PB,EB", unit+1, ",")
EndProcedure

Debug byterechner(-4096) ; ungültige Angabe wird zu "-1 Byte"
Debug byterechner(0) ; Eine Null-Byte große Datei bleibt auch 0 Byte groß :)
Debug byterechner(27101988) ; Bisherige Angaben bleiben ok

Schluchz.... Der schöne 2 Zeiler ist dahin... :cry:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Es tut sich was:
Im englischen Forum wurde ich darauf aufmerksam gemacht, dass es auch so geht:
Änderungen und Vorteile:
  • Kompatibel schon ab PB 4.00 statt 4.01
  • schneller als der obige Code
  • Angaben <0 geben auch 0 zurück (vorher -1)
  • keine Nutzung boolescher Ausdrücke mehr (diese werden offiziell sowieso nicht unterstützt)

Code: Alles auswählen

Procedure.s byterechner(byte.q, NbDecimals.l=0)
	If byte < 1024
		If byte < 0
			ProcedureReturn "0 Byte"
		EndIf
		ProcedureReturn Str(byte)+" Byte"
	ElseIf byte >= 1<<60
		ProcedureReturn StrD(byte/1<<60, NbDecimals)+" EB"
	ElseIf byte >= 1<<50
		ProcedureReturn StrD(byte/1<<50, NbDecimals)+" PB"
	ElseIf byte >= 1<<40
		ProcedureReturn StrD(byte/1<<40, NbDecimals)+" TB"
	ElseIf byte >= 1<<30
		ProcedureReturn StrD(byte/1<<30, NbDecimals)+" GB"
	ElseIf byte >= 1<<20
		ProcedureReturn StrD(byte/1<<20, NbDecimals)+" MB"
	Else
		ProcedureReturn StrD(byte/1024, NbDecimals)+" KB"
	EndIf
EndProcedure


Debug byterechner(-4096) ; ungültige Angabe wird zu "0 Byte" 
Debug byterechner(0) ; Eine Null-Byte große Datei bleibt auch 0 Byte groß
Debug byterechner(27101988) ; Bisherige Angaben bleiben ok
Hinweis: Angaben <0 werden zu "0 Byte", denn u. U. gibt FileSize() negative Werte zurück, die dann durch den Byterechner ebenfalls negativ werden. Es erscheint mir sinnvoller, dann lieber "0 Byte" zurückzugeben. (Das kann aber jeder nach Wunsch ändern!)


Frage: Ich habe diesen Code auch mal mit ausgerechneten Werten statt den 'geshifteten' Ausdrücken laufen lassen. Der 'geschiftete' ist jedoch geringfügig schneller, warum?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten