我目前正在尝试将此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];
}
我只是在最后一行挣扎。任何帮助都非常赞赏。
答案 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;
}
答案 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];
}