JavaScript 字节单位换算函数

2020-01-21  本文已影响0人  erya_he

业务场景:

内存使用量的展示,数据是以Mb为单位的,接口里是类似"1234567890"这样的数据,不便于用户理解,需要前端转换成"1.15PB"这样的展示。考虑到业务中还会有很多相同的场景,所以就写了一个工具函数:

/**
 * byte单位换算
 * @param originNum 要换算单位的数
 * @param basic 传入num的基础单位 默认是MB
 * @param pointIndex 保留小数位数 默认保留两位小数
 * @param symbols 单位列表
 * @returns {String}
 * @example byteConvert(25088.00,'Mb',2) 24.50GB
 */
export function byteConvert (originNum = 0, basic = 'MB', pointIndex = 2, symbols = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB']) {
  if (isNaN(Number(originNum)) || Number(originNum) === 0) return 0 + basic;
  const num = Number(originNum) > 0 ? Number(originNum) : Number(-1 * originNum);
  const exp = Math.floor(Math.log(num)/Math.log(1024)); // 利用换底公式
  const index = symbols.findIndex((ele) => ele === basic);
  const symbolsLength = symbols.length;
  let number,unit;
  if(index < 0) {
      throw new Error(`传入单位必须是${symbols}中的值`);
  } else if ((exp + index) > symbolsLength - 1){
      number = (num / Math.pow(1024, symbolsLength - 1 - index)).toFixed(pointIndex);
      unit = symbols[symbolsLength - 1];
  } else {
      number = (num / Math.pow(1024, exp)).toFixed(pointIndex);
      unit = symbols[exp + index];
  }
  const outputNum = Number(originNum) > 0 ? Number(number).toLocaleString() : ('-' + Number(number).toLocaleString());
  return outputNum + ' ' + unit;
}
上一篇 下一篇

猜你喜欢

热点阅读