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;
}