我得到这段代码通过PHP隐蔽大小字节。

现在我想使用JavaScript将这些大小转换为人类可读的大小。我尝试将这段代码转换为JavaScript,看起来像这样:

function formatSizeUnits(bytes){
  if      (bytes >= 1073741824) { bytes = (bytes / 1073741824).toFixed(2) + " GB"; }
  else if (bytes >= 1048576)    { bytes = (bytes / 1048576).toFixed(2) + " MB"; }
  else if (bytes >= 1024)       { bytes = (bytes / 1024).toFixed(2) + " KB"; }
  else if (bytes > 1)           { bytes = bytes + " bytes"; }
  else if (bytes == 1)          { bytes = bytes + " byte"; }
  else                          { bytes = "0 bytes"; }
  return bytes;
}

这是正确的做法吗?有没有更简单的方法?


当前回答

我让算法快了7倍(就像忍者一样):

function rafaelFormatBytes(number){ if(number == null || number === undefined || number <= 0) { return '0 Bytes'; } var scaleCounter = 0; var scaleInitials = [' Bytes',' KB',' MB',' GB',' TB',' PB',' EB',' ZB',' YB']; while (number >= 1024 && scaleCounter < scaleInitials.length - 1){ number /= 1024; scaleCounter++; } if(scaleCounter >= scaleInitials.length) scaleCounter = scaleInitials.length - 1; var compactNumber = number.toFixed(2) .replace(/\.?0+$/,'') .replace(/\B(?=(\d{3})+(?!\d))/g, ","); compactNumber += scaleInitials[scaleCounter]; return compactNumber.trim(); } var testNum = 0; var startTime, endTime; function start() { startTime = new Date(); }; function end() { endTime = new Date(); var timeDiff = endTime - startTime; //in ms // strip the ms timeDiff /= 1000; // get seconds var seconds = Math.round(timeDiff, 5); console.log(timeDiff + " seconds"); } function formatBytes(a,b=2,k=1024){with(Math){let d=floor(log(a)/log(k));return 0==a?"0 Bytes":parseFloat((a/pow(k,d)).toFixed(max(0,b)))+" "+["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"][d]}} console.log(formatBytes(1000000000000000000000000000)); console.log(rafaelFormatBytes(1000000000000000000000000000)); start(); for(i=0; i<100000; i++){ formatBytes(1000000000000000); } end(); start(); for(i=0; i<100000; i++){ rafaelFormatBytes(1000000000000000); } end();

... 输出:

827.18 YB
827.18 YB
0.293 seconds
0.039 seconds

耶稣基督!

其他回答

我让算法快了7倍(就像忍者一样):

function rafaelFormatBytes(number){ if(number == null || number === undefined || number <= 0) { return '0 Bytes'; } var scaleCounter = 0; var scaleInitials = [' Bytes',' KB',' MB',' GB',' TB',' PB',' EB',' ZB',' YB']; while (number >= 1024 && scaleCounter < scaleInitials.length - 1){ number /= 1024; scaleCounter++; } if(scaleCounter >= scaleInitials.length) scaleCounter = scaleInitials.length - 1; var compactNumber = number.toFixed(2) .replace(/\.?0+$/,'') .replace(/\B(?=(\d{3})+(?!\d))/g, ","); compactNumber += scaleInitials[scaleCounter]; return compactNumber.trim(); } var testNum = 0; var startTime, endTime; function start() { startTime = new Date(); }; function end() { endTime = new Date(); var timeDiff = endTime - startTime; //in ms // strip the ms timeDiff /= 1000; // get seconds var seconds = Math.round(timeDiff, 5); console.log(timeDiff + " seconds"); } function formatBytes(a,b=2,k=1024){with(Math){let d=floor(log(a)/log(k));return 0==a?"0 Bytes":parseFloat((a/pow(k,d)).toFixed(max(0,b)))+" "+["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"][d]}} console.log(formatBytes(1000000000000000000000000000)); console.log(rafaelFormatBytes(1000000000000000000000000000)); start(); for(i=0; i<100000; i++){ formatBytes(1000000000000000); } end(); start(); for(i=0; i<100000; i++){ rafaelFormatBytes(1000000000000000); } end();

... 输出:

827.18 YB
827.18 YB
0.293 seconds
0.039 seconds

耶稣基督!

一行程序

const b2s = t = > {let’e = Math .对数(t) / 10 | 0; return (t / 1024 * * (e = e < = 0 ? 0 toFixed: e))(3) +“BKMGP”[e]}; console . log (b2s (0)); console . log (b2s (123)); console . log (b2s (123123)); console . log (b2s (123123123)); console . log (b2s (123123123123)); console . log (b2s (123123123123123));

试试这个简单的解决方法。

var files = $("#file").get(0).files;               
                var size = files[0].size;
                if (size >= 5000000) {
alert("File size is greater than or equal to 5 MB");
}

这是目前排名最高的答案的后续。

边界情况

我发现了一个边缘情况:非常少量的字节!具体来说,当字节数在-1和1之间(独占)时。

例如,考虑0.25字节。在这种情况下,Math.floor(Math.log(0.25) / Math.log(1024))将返回-1。由于-1不是一个有效的索引,formatBytes(0.25)将返回类似“0.25 undefined”的值。

下面是一个使用Wolfram Alpha的边缘情况的示例。

Fix

我通过添加Math来解决这个问题。马克斯(0,…):

数学。max(0, Math.floor(Math.log(bytes) / Math.log(1024))

数学。Max(0,…)确保索引值始终至少为0。

这不是关于将字节转换为其他单位,但它有助于正确显示当前地区的数字和单位:

bytes.toLocaleString(undefined, {
  style: 'unit',
  unit: 'gigabyte',
})

更多选择和细节可以在这里找到:https://v8.dev/features/intl-numberformat#units