Javascript人类可读文件大小

Javascript人类可读文件大小,javascript,Javascript,我目前正在尝试将此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 hum

我目前正在尝试将此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];
        }
我只是在努力写最后一行。非常感谢您的帮助。

您有没有看一看:他们有两个版本的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];
}

天气很好。如果您想了解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;
}

基于新的国际标准:

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


旧标准(JEDEC和SI):

kB=1000,kB=1024

MB=1024=1000

GB=1024=1000

正如你所看到的,一切都乱七八糟,因为你不知道他们是使用1024还是1000作为乘法器


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

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

kB,MB,GB..=一千

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

KiB、MiB、GiB..=1024

这里有两个我刚刚用速记和按位编写的函数,使其快速和简短

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
用法

我总是用1024来计算大小。。。所以我把新的IEC标准作为默认标准

如果您对函数有任何疑问,请询问我喜欢的

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

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
});

当单位数组的大小超过预期值时,我们应该停止循环

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];  
}  
function to human(大小){
变量单位=['B'、'KB'、'MB'、'GB'、'TB'、'PB'、'EB'、'ZB'、'YB'];
var i=0;
var j=单位长度-1;

虽然(size>=1024&&iI就像关于该链接的第一条评论,很好的两行解决方案。如果你想遵守新标准,那么在你的案例中使用的正确数字是1000而不是1024。在第二个函数中,KB的k应该是小写的。根据新的国际标准,KiB,MiB,GiB是1024,KB,MB,GB是1000。查看我的答案答案看起来像已经被接受的帖子,但没有什么改进。我建议你编辑被接受的答案(或留下评论)并删除这一个是的,这确实是我想做的,但网站的设计迫使你发布一个新的答案(你需要50个信誉点才能发表评论..胡说八道)但是我可以评论我的帖子耶!
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
});
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];  
}