export class unitTransfer { //单位进制 unitConfig = { B: ['B', 'KB', 'MB', 'GB', 'TB', 'PB'], b: ['b', 'Kb', 'Mb', 'Gb', 'Tb', 'Pb'], // def: ['', 'K', 'mill', 'bill', 'trill'], def: ['', 'K', 'M', 'B', 'T', 'Q'], } constructor() { } /** * 单位转换,统一用于监控指标的单位换算问题 * @param value 数值 * @param unit 单位 * @param params {tagUnit:想要转化到的单位级别,unitDisplay:是否需要输出单位} */ unitTransfom(value, unit?, params?: {tagUnit?:string,unitDisplay?:boolean}) { if (!value || typeof (value) != 'number') { return value; } if ([undefined, null, ''].indexOf(unit) != -1) { unit = '' } let index = unit.indexOf('/'); let moreUnit = ''; let resultValue; let tagUnit; let unitDisplay = true; if (params) { tagUnit = params['tagUnit'] || null; unitDisplay = params['unitDisplay'] || true; } if (index > 0) { moreUnit = unit.substring(index); unit = unit.split('/')[0]; } if (unit == '%') { resultValue = value + unit; } if (this.unitConfig.def.indexOf(unit) > -1 || unit == 'nub') { unit === 'nub' ? unit = '' : ''; resultValue = this.formatterFun(value, 'def', { 'tagUnit': tagUnit, 'defaulUnit': unit }) } if (this.unitConfig.B.indexOf(unit) > -1) { resultValue = this.formatterFun(value, 'B', { 'defaulvalue': 1024, 'tagUnit': tagUnit, 'defaulUnit': unit }) + moreUnit; } if (this.unitConfig.b.indexOf(unit) > -1) { resultValue = this.formatterFun(value, 'b', { 'defaulvalue': 1024, 'tagUnit': tagUnit, 'defaulUnit': unit }) + moreUnit; } if (unit == 'cnt') { resultValue = this.formatterFun(value, 'def', { 'defaulvalue': 1000, 'defaulUnit': '' }) + '个' + moreUnit; } if (unit == 'ms' || unit == 's') { resultValue = this.Flavorunit(value, unit) + moreUnit; } if (unit == 'bout') { resultValue = this.formatterFun(value, 'def', { 'defaulvalue': 1000, 'defaulUnit': '' }) + '次' + moreUnit; } //判断需不需要输出单位 if (!unitDisplay) { resultValue = resultValue.replace(/[^0-9,.]*/ig, ''); } return resultValue } /** * 此处为时间的单位转换 * @param value * @param unit */ Flavorunit(value, unit?) { if (value >= 1000 && unit == 'ms') { unit = 's'; value = (value / 1000).toFixed(2); } if (value >= 60 && unit == 's') { unit = 'min'; value = (value / 60).toFixed(2); } if (value >= 60 && unit == 'min') { unit = 'h'; value = (value / 60).toFixed(2); } if (value >= 24 && unit == 'h') { unit = 'd'; value = (value / 24).toFixed(2); } return Number(value) + unit; } /** * * @param value 数值 * @param unit 单位类别,如果没有默认单位,也可以作为默认单位 * @param params { * defaulvalue 默认进制的值,没有值取1000, * defaulUnit 起步单位,没有的话使用单位类别的值作为默认单位, * tagUnit 目标单位,需要转化到改单位 * point 保留小数几位 * } */ formatterFun(value, unit, params?: {}) { let defaulvalue, defaulUnit, tagUnit, point if (params) { defaulvalue = params['defaulvalue'] ? params['defaulvalue'] : 1000; defaulUnit = params['defaulUnit']; tagUnit = params['tagUnit'] ? params['tagUnit'] : null; point = params['point'] ? params['point'] : 2; } let count = 0; //判断有没有目标单位 if (tagUnit) { let indexOfNow = this.unitConfig[unit].indexOf(defaulUnit); let indexOfTag = this.unitConfig[unit].indexOf(tagUnit); const n = indexOfTag - indexOfNow; value = value / Math.pow(defaulvalue, n); } else { while (value >= defaulvalue && count < 6) { value = value / defaulvalue; count++; } } value = Number(value.toFixed(point)); let index: number = 0; let resultUnit: string = ''; if (this.unitConfig[unit].indexOf(defaulUnit) >= 0) { index = this.unitConfig[unit].indexOf(defaulUnit); resultUnit = this.unitConfig[unit][count + index]; } if (tagUnit) { resultUnit = tagUnit; } return value + resultUnit; } /** * 日期格式转换 * y+ 待办匹配y一次以上,替换为年,其他类似, */ dateFormat(time, fmt) { try { const date = new Date(time); let ret; const opt = { 'y+': date.getFullYear().toString(), // 年 'm+': (date.getMonth() + 1).toString(), // 月 'd+': date.getDate().toString(), // 日 'H+': date.getHours().toString(), // 时 'M+': date.getMinutes().toString(), // 分 'S+': date.getSeconds().toString(), // 秒 // 有其他格式化字符需求可以继续添加,必须转化成字符串 }; for (let k in opt) { ret = new RegExp('(' + k + ')').exec(fmt); if (ret) { fmt = fmt.replace(ret[1], (ret[1].length === 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, '0'))) } } return fmt; } catch (err) { console.log(err); return ''; } }; } export const unitUtil = new unitTransfer();