You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
175 lines
5.2 KiB
175 lines
5.2 KiB
6 months ago
|
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();
|