in src/common/common.ts [690:792]
export function unitConversion(
originValue: any,
unit?: any,
decimal?: number,
unitTransformTo?: any,
valueType?: string,
customCarryUnits?: string | string[],
customCarryThreshold?: number,
addonTextAfter?: string,
) {
const isNegative = originValue < 0;
let value = Math.abs(originValue);
const suffixUnit = addonTextAfter || '';
// 增加自定义进位
if (valueType === 'custom') {
let threshold = customCarryThreshold || 1000;
const units = typeof customCarryUnits === 'string' ? customCarryUnits.split(',') : customCarryUnits || ["", "k", "m", "b"];
let currentUnit = unit || units[0] || '';
let finalUnit = unit || '';
let index = units.indexOf(currentUnit);
while (value >= threshold && index < units.length - 1) {
value /= threshold;
index++;
}
finalUnit = units[index] || '';
const finalValue = numberDecimal(value, decimal);
return {
value: typeof finalValue === 'number' ? (isNegative ? -finalValue : finalValue) : '-',
unit: finalUnit + suffixUnit,
};
}
if (valueType === 'date') {
const { value: finalValue, unit: finalUnit } = convertTimeUnit(value, unit, decimal) ?? {};
return {
value: typeof finalValue === 'number' ? (isNegative ? -finalValue : finalValue) : '-',
unit: (finalUnit ?? '') + suffixUnit,
};
} else {
let currentUnit = unit ? unit.toUpperCase() : unitMap[valueType][0];
// 只有流量、存储单位大写
if (currentUnit && !['disk_1000', 'disk_1024', 'bandwidth_1000', 'bandwidth_1024'].includes(valueType)) {
currentUnit = currentUnit.toLowerCase();
}
// 单位的特殊处理,后期统一从unitFamily中取
if (valueType === 'time') {
currentUnit = unit ?? 's';
}
const units = findUnitArray(currentUnit, valueType);
let finalUnit = unit;
const threshold = valueType?.includes('1024') ? 1024 : 1000;
let index = units.indexOf(currentUnit);
if (index === -1) {
return {
value: originValue,
unit: unit + suffixUnit,
};
}
if (unitTransformTo) {
let UpUnitTransformTot = unitTransformTo.toUpperCase();
let targetUnitIndex = units.indexOf(UpUnitTransformTot);
if (index === targetUnitIndex) {
return {
value: originValue,
unit: unit + suffixUnit,
};
}
const distance = Math.abs(index - targetUnitIndex);
if (index > targetUnitIndex) {
value *= Math.pow(threshold, distance);
} else {
value /= Math.pow(threshold, distance);
}
finalUnit = unitTransformTo;
}
if (!unitTransformTo) {
while (value >= threshold && index < units.length - 1) {
value /= threshold;
index++;
}
finalUnit = units[index];
}
if (valueType === 'count' && finalUnit === 'counts') {
finalUnit = '';
}
const finalValue = numberDecimal(value, decimal);
return {
value: typeof finalValue === 'number' ? (isNegative ? -finalValue : finalValue) : '-',
unit: finalUnit + suffixUnit,
};
}
}