Wie kann man Datenmengen umrechnen und in einer bestimmten Maßeinheit ausgeben lassen?
In dem Beitrag Dateigröße umrechnen in PHP habe ich bereits ein kleines Script vorgestellt, welches Datenmengen zwischen den Einheiten bit, Byte, KB, MB, GB, TB, PB, EB, ZB und YB umrechnet und die korrekte Maßeinheit anhängt.
Dieses Script habe ich nun in die „Sprache“ JavaScript „übersetzt“ und stelle es hier zur Verfügung.
Datenmenge konvertieren – Bits und Bytes
Das Script besteht aus einer Funktion convertDataUnit() die als Argumente die Datenmenge (obligatorisch), die vorhandene Maßeinheit als Kürzel (optional – ‚B‘ für Byte als Default) und die gewünschte Maßeinheit als Kürzel (optional – ‚YB‘ für Yottabyte als Default) entgegen nimmt.
Wie man Kilobyte in Megabyte umrechnen oder Megabite in Gigabyte umrechnen muss, dürfte klar sein. Der Faktor ist natürlich 1024 (210) und nicht 1000 (103), wie es sich für ein binäres System gehört.
Informationen zur Datenmenge oder über die Maßeinheit Byte sollten zum Basiswissen gehören.
Folgende Informationen sollten noch beachtet werden.
- Ausgabe der Datenmenge mit 2 Nachkommastellen und der jeweiligen Maßeinheit
- Vorkommastellen sind immer größer Null, aber immer kleiner als 1024 (nur beim hochrechnen)
- verwendete binäre Maßeinheiten: Bit (bit), Byte (B), Kilobyte (KB), Megabyte (MB), Gigabyte (GB), Terrabyte (TB), Petabyte (PB), Exabyte (EB), Zettabyte (ZB) und Yottabyte (YB).
Da es in JavaScript keine native Funktion gibt die eine Zahl auf eine bestimmte Anzahl Nachkommastellen runden kann, musste die Math.round() Funktion umgeschrieben werden.
Den Code dafür habe ich vom Mozilla MDN „ausgeliehen“.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
function convertDataUnit( size, sourceUnit = 'B', targetUnit = 'YB' ) { var units = { 'bit' : 0, 'B' : 1, 'KB' : 2, 'MB' : 3, 'GB' : 4, 'TB' : 5, 'PB' : 6, 'EB' : 7, 'ZB' : 8, 'YB' : 9 }; if( units[sourceUnit] <= units[targetUnit] ) { for( var i = units[sourceUnit]; size >= 1024; i++ ) { if( i === 0 ) { size /= 8; } else { size /= 1024; } } } else { for( i = units[sourceUnit]; i > units[targetUnit]; i-- ) { if( i === 1 ) { size *= 8; } else { size *= 1024; } } } return myNamespace.round( size, 2 ) + ' ' + Object.keys(units)[i]; } var myNamespace = {}; myNamespace.round = function(number, precision) { var factor = Math.pow(10, precision); var tempNumber = number * factor; var roundedTempNumber = Math.round(tempNumber); return roundedTempNumber / factor; }; alert( convertDataUnit( 1234567890 ) ); // 1.15 GB alert( convertDataUnit( 1.149780945852399, 'GB', 'B' ) ); // 1234567890 B |
Du kannst das ganze natürlich noch erweitern oder verbessern.
Aber auch hier ist die Funktion bereits am Limit und sollte nicht mit weiteren Argumenten überladen werden.
Wer einen Fehler findet, einen besseren Weg kennt oder einfach nur ein Statement abgeben will kann gern einen Kommentar hinterlassen.