Newer
Older
xc-business-system / src / commonMethods / useToScientific.ts
/**
 * 根据自定义规则将输入值转换为科学计数法或直接返回原值
 * @param {unknown} value - 输入的值,可以是任意类型
 * @param {number} integerDigits - 判断是否转换为科学计数法的整数部分最小位数
 * @param {number} decimalDigits - 判断是否转换为科学计数法的小数部分最小位数
 * @returns {number | string} - 若满足转换条件则返回科学计数法字符串,否则返回原数字或无法转换时返回原输入
 */
export default function useToScientific(value: unknown, integerDigits = 6, decimalDigits = 6): number | string {
  let num: number
  // 判断传入的值是否已经是数字类型
  if (typeof value === 'number') {
    // 如果是数字类型,直接赋值给 num
    num = value
  }
  else {
    // 如果不是数字类型,尝试将其转换为数字
    num = Number(value)
    // 检查转换后的结果是否为 NaN(非数字)
    if (isNaN(num)) {
      // 如果是 NaN,说明无法转换为数字,直接返回原输入值
      return value as string
    }
  }

  // 将数字转换为字符串,方便后续拆分整数部分和小数部分
  const numStr = num.toString()
  let integerPart: string
  let decimalPart: string
  // 检查数字字符串中是否包含小数点
  if (numStr.includes('.')) {
    // 如果包含小数点,使用 split 方法按小数点分割字符串,并分别赋值给整数部分和小数部分
    [integerPart, decimalPart] = numStr.split('.')
  }
  else {
    // 如果不包含小数点,说明是整数,将整个字符串赋值给整数部分,小数部分为空字符串
    integerPart = numStr
    decimalPart = ''
  }

  // 检查整数部分的长度是否大于等于指定的整数位数 或者 小数部分的长度是否大于等于指定的小数位数
  if (integerPart.length >= integerDigits || decimalPart.length >= decimalDigits) {
    // 如果满足条件,将数字转换为科学计数法表示的字符串并返回
    return num.toExponential(2)
  }
  // 如果不满足条件,直接返回原数字
  return num
}