/** * 根据自定义规则将输入值转换为科学计数法或直接返回原值 * @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 }