我得到这段代码通过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;
}

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


当前回答

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

边界情况

我发现了一个边缘情况:非常少量的字节!具体来说,当字节数在-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。

其他回答

function formatBytes(bytes) {
    var marker = 1024; // Change to 1000 if required
    var decimal = 3; // Change as required
    var kiloBytes = marker; // One Kilobyte is 1024 bytes
    var megaBytes = marker * marker; // One MB is 1024 KB
    var gigaBytes = marker * marker * marker; // One GB is 1024 MB
    var teraBytes = marker * marker * marker * marker; // One TB is 1024 GB

    // return bytes if less than a KB
    if(bytes < kiloBytes) return bytes + " Bytes";
    // return KB if less than a MB
    else if(bytes < megaBytes) return(bytes / kiloBytes).toFixed(decimal) + " KB";
    // return MB if less than a GB
    else if(bytes < gigaBytes) return(bytes / megaBytes).toFixed(decimal) + " MB";
    // return GB if less than a TB
    else return(bytes / gigaBytes).toFixed(decimal) + " GB";
}

我只是想分享我的想法。我遇到了这个问题,所以我的解决方案是这样的。这将把低单位转换为高单位,反之亦然,只需提供参数toUnit和fromUnit

export function fileSizeConverter(size: number, fromUnit: string, toUnit: string ): number | string {
  const units: string[] = ['B', 'KB', 'MB', 'GB', 'TB'];
  const from = units.indexOf(fromUnit.toUpperCase());
  const to = units.indexOf(toUnit.toUpperCase());
  const BASE_SIZE = 1024;
  let result: number | string = 0;

  if (from < 0 || to < 0 ) { return result = 'Error: Incorrect units'; }

  result = from < to ? size / (BASE_SIZE ** to) : size * (BASE_SIZE ** from);

  return result.toFixed(2);
}

我从这里得到了灵感

将字节格式化为最符合逻辑大小(KB、MB或GB)的实用程序方法。

Number.prototype.formatBytes = function() { var单位= ['B', 'KB', 'MB', 'GB', 'TB'], 字节= this, 我; For (i = 0;>= 1024 && I < 4;我+ +){ 字节/= 1024; } return bytes.toFixed(2) + units[i]; } 令a = 235678;/ /字节 console.log (a.formatBytes ());//结果为230.15KB

我最初在一个文件上传项目中使用@ al冰岛jm的答案,但最近遇到了一个问题,一个文件是0.98kb,但读取为1.02mb。下面是我现在使用的更新代码。

function formatBytes(bytes){
  var kb = 1024;
  var ndx = Math.floor( Math.log(bytes) / Math.log(kb) );
  var fileSizeTypes = ["bytes", "kb", "mb", "gb", "tb", "pb", "eb", "zb", "yb"];

  return {
    size: +(bytes / kb / kb).toFixed(2),
    type: fileSizeTypes[ndx]
  };
}

在像这样添加文件之后,上面的函数将被调用

// In this case `file.size` equals `26060275` 
formatBytes(file.size);
// returns `{ size: 24.85, type: "mb" }`

当然,Windows读取的文件为24.8mb,但我对额外的精度很满意。

我使用递归和分配水平变量为适当的单位。

函数getReadableByte(count, decimal=0, level=0) { 让unitList =[“字节”,“知识库”,“m”,“g”、“肺结核”,“PT”); if (count >= 1024.0 && (level+1 < unitList.length)) { 返回getReadableByte(count/1024, decimal, ++level) } 返回' ${小数?(count).toFixed(decimal): Math.round(count)}${unitList[level]} ' } 2) console.log (getReadableByte (120)