export function unitConversion()

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