I have data in bytes. I need to draw this values as human readable labels on a chart (like 2.5KB, 14MB etc.) and need to help with function (input data - actual value, output - human readable string).
I did funcion like this, but I want more elegant realization
function tickFormatter(value, type) {
var suffix = (type == "bytes") ? ['B', 'KB', 'MB', 'GB'] : ['', 'K', 'M', 'G']
if(value > (1024 * 1024 * 1024 * 1024)) {
return (value / (1024 * 1024 * 1024 * 1024)).toFixed(2) + suffix[3]
} else if(value > (1024 * 1024 * 1024)) {
return (value / (1024 * 1024 * 1024)).toFixed(2) + suffix[2]
} else if (value > (1024 * 1024)) {
return (value / (1024 * 1024)).toFixed(2) + suffix[1]
} else {
return value.toFixed(2) + suffix[0]
}
}
I love this implementation: clear and compact:
function readablizeBytes(bytes) {
var s = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'];
var e = Math.floor(Math.log(bytes) / Math.log(1024));
return (bytes / Math.pow(1024, e)).toFixed(2) + " " + s[e];
}
Usage:
readablizeBytes(10000000)
"9.54 MB"
I don't take the credit of this.
This is what I use. It rounds up to the nearest unit, so 1000 is "0.98KB" If you don't want that, then change the first Math.round to a floor.
var SizePrefixes = ' KMGTPEZYXWVU';
function GetHumanSize(size) {
if(size <= 0) return '0';
var t2 = Math.min(Math.round(Math.log(size)/Math.log(1024)), 12);
return (Math.round(size * 100 / Math.pow(1024, t2)) / 100) +
SizePrefixes.charAt(t2).replace(' ', '') + 'B';
}
Perhaps something like this?
function readable (nb_bytes) {
if (nb_bytes < 1024) return nb_bytes + 'B';
else if (nb_bytes < 1024 * 1024) return (Math.round((nb_bytes / 1024) * 100) / 100) + 'KB';
else return (Math.round((nb_bytes / 1024 / 1024) * 100) / 100) + 'MB';
}
[EDIT]
Alright, since you want something more elegant, I assume you're thinking of a loop. Maybe this will suit your needs:
function readable (nb_bytes,type) {
var suffix = type ? ['B','KB','MB','GB'] : ['','K','M','G'];
var i = 0;
while (nb_bytes > 1024 && i < suffix.length - 1) {
++i;
nb_bytes = Math.round((nb_bytes / 1024) * 100) / 100;
}
return (nb_bytes) + suffix[i];
}
Here I assumed type
was a boolean - change to whatever suits you best.
Modified version of Amer's:
(function GetHumanSize(size) {
var SizePrefixes = ['','K','M','G','T','P','E','Z','Y'];
if(size <= 0) return '0';
var t2 = Math.min(Math.round(Math.log(size)/Math.log(1024)),
SizePrefixes.length-1);
return String((Math.round(size * 100 / Math.pow(1024, t2)) / 100)) +
' ' + SizePrefixes[t2] + 'iB';
})(Math.pow(2,131)) === "2251799813685248 YiB"
With:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With