Javascript Human Readable Filesize

时间:2013-12-08 21:54:45

标签: javascript php

我目前正在尝试将此php函数转换为javascript:

function human_filesize($bytes, $decimals = 2) {
  $sz = 'BKMGTP';
  $factor = floor((strlen($bytes) - 1) / 3);
  return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor];
}

这就是我的目标:

function human_filesiz(bytes){
            var decimals = 2;
            var sz = 'BKMGTP';
            var factor = Math.floor((bytes.length - 1) / 3);
            return (bytes / Math.pow(1024, factor));
            //return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor];
        }

我只是在最后一行挣扎。任何帮助都非常赞赏。

5 个答案:

答案 0 :(得分:5)

你有没看过:http://programanddesign.com/js/human-readable-file-size-in-javascript/他们有两个版本的人类可读文件大小的Javascript解决方案:

function fileSize(size) {
    var i = Math.floor(Math.log(size) / Math.log(1024));
    return (size / Math.pow(1024, i)).toFixed(2) * 1 + ‘‘+['B', 'kB', 'MB', 'GB', 'TB'][i];
}

function readableFileSize(size) {
    var units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
    var i = 0;
    while(size >= 1024) {
        size /= 1024;
        ++i;
    }
    return size.toFixed(1) + ' ' + units[i];
}

答案 1 :(得分:2)

基于新的国际标准:

现在有两种方式(SI和IEC)......或更好3种方式,包括旧方式(JEDEC内存标准)。


旧标准(JEDEC& SI):

kB = 1000,KB = 1024

MB = 1024 = 1000

GB = 1024 = 1000

你可以看到一切都搞砸了,因为你不知道他们是否使用1024或1000作为乘法器

https://wiki.ubuntu.com/UnitsPolicy


这就是为什么我们现在有这两个新标准的原因:

十进制(国际单位制[SI])

kB,MB,GB .. = 1000

二进制(国际电工委员会[IEC])

KiB,MiB,GiB .. = 1024

http://en.wikipedia.org/wiki/Binary_prefix

这里有2个函数,我刚刚用速记和按位编写,使其快速&短。

function fileSizeSI(a,b,c,d,e){
 return (b=Math,c=b.log,d=1000,e=c(a)/c(d)|0,a/b.pow(d,e)).toFixed(2)
 +' '+(e?'kMGTPEZY'[--e]+'B':'Bytes')
}
//kB,MB,GB,TB,PB,EB,ZB,YB

function fileSizeIEC(a,b,c,d,e){
 return (b=Math,c=b.log,d=1024,e=c(a)/c(d)|0,a/b.pow(d,e)).toFixed(2)
 +' '+(e?'KMGTPEZY'[--e]+'iB':'Bytes')
}
//KiB,MiB,GiB,TiB,PiB,EiB,ZiB,YiB

用法

fileSizeSI(5768374623);
//5.77 GB

fileSizeIEC(5768374623);
//5.37 GiB

编辑

这是现代浏览器的原型,可以同时处理

Object.defineProperty(Number.prototype,'fileSize',{value:function(a,b,c,d){
 return (a=a=='SI'?[1e3,'k','B']:[1024,'K','iB'],b=Math,c=b.log,
 d=c(this)/c(a[0])|0,this/b.pow(a[0],d)).toFixed(2)
 +' '+(d?(a[1]+'MGTPEZY')[--d]+a[2]:'Bytes');
},writable:false,enumerable:false});
// default(IEC) KiB,MiB,GiB,TiB,PiB,EiB,ZiB,YiB
// (SI) kB,MB,GB,TB,PB,EB,ZB,YB

使用

(1289139173).fileSize(); // default Binary IEC
//1.20 GiB

(1289139173).fileSize('SI'); // Metric SI
//1.29 GB 

我总是用1024来计算尺寸...所以我把新的IEC标准作为默认值。

如果您对这些功能有疑问,请询问

答案 2 :(得分:1)

answer by osi很棒。如果你想了解JS可以为你的例子做些什么,你可以看看我为你工作的代码:

function human_filesiz(bytes){
    var decimals = 2;
    var sz = 'BKMGTP';
    bytesStr = new String(bytes);
    var factor = Math.floor((bytesStr.length - 1) / 3);

    // rounding the number in JS:
    var number = bytes / Math.pow(1024, factor);
    var roundPrecision = Math.pow(10, decimals);
    number *= roundPrecision;
    var result = Math.round(number, decimals) / roundPrecision;
    result = result + sz.substring(factor, 1);
    return result;
}

JsFiddle

答案 3 :(得分:0)

我喜欢cocco's version

我为分隔符添加了舍入和区域设置转换。

Object.defineProperty(Number.prototype, 'toFileSize', {
value: function(a, b, c, d){ return (a=a=='SI'?[1e3,'k','B']:[1024,'K','iB'],b=Math,c=b.log,d=c(this)/c(a[0])|0,+(b.round(this/b.pow(a[0],d)+"e+2")+"e-2")).toLocaleString()+' '+(d?(a[1]+'MGTPEZY')[--d]+a[2]:'Bytes');},
writable: false,
enumerable: false
});

答案 4 :(得分:0)

我们应该在尺寸超过我们在单位数组中预期的时候停止循环

function toHuman(size) {
    var units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];  
    var i = 0;  
    var j = units.length - 1; 
    while(size >= 1024 && i<j) {  
        size /= 1024;  
        ++i;  
    }  
    return size.toFixed(1) + ' ' + units[i];  
}  
相关问题