首页 > 解决方案 > 将 KB 转换为 MB 和 GB

问题描述

如何设置此功能以仅以这种格式MBGB以这种格式获得结果?

function formatBytes(bytes, decimals, binaryUnits) {
    if (bytes == 0) {
        return '0 Bytes';
    }
    var unitMultiple = binaryUnits ? 1024 : 1000; 
    var unitNames = (unitMultiple === 1024) ? // 1000 bytes in 1 Kilobyte (KB) or 1024 bytes for the binary version (KiB)
        ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']
        :
        ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
    var unitChanges = Math.floor(Math.log(bytes) / Math.log(unitMultiple));
    return parseFloat((bytes / Math.pow(unitMultiple, unitChanges)).toFixed(decimals || 0)) + ' ' + unitNames[unitChanges];
}

目前,当我使用此函数时,我得到 40000 / 12000 KB 的结果,我想要 40 / 12 MB 的结果。

这些是我的输入参数,这就是我想要得到结果的方式:

1000000000/1000000000 -> 1/1 Gbits  
40000/12000 -> 40/12 MBits

标签: javascript

解决方案


从某种意义上说,我进行多个除法而不是单个除法可能不太理想,但递归方法似乎相对容易实现

function formatBytes(bytes, decimals=0, binaryUnits=true) {
  return format(
    bytes,
    binaryUnits ? 1024 : 1000,
    binaryUnits ?
      ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']:
      ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']
  )

  function format(value, divisor, [currentLabel, ...otherLabels]) {
    if (value < divisor) return `${value.toFixed(decimals || 0)} ${currentLabel}`;
    
    return format(value / divisor, divisor, otherLabels);
  }
}



console.log(formatBytes(1000,2,true));
console.log(formatBytes(10000,2,true));
console.log(formatBytes(100000,2,true));
console.log(formatBytes(1000000,2,true));
console.log(formatBytes(10000000,2,true));
console.log(formatBytes(100000000,2,true));
console.log(formatBytes(1000000000,2,true));


推荐阅读