UNPKG

tdesign-mobile-vue

Version:
1 lines 36.5 kB
{"version":3,"file":"large-number.mjs","sources":["../../../../src/_common/js/input-number/large-number.ts"],"sourcesContent":["import { isString, isNumber, isObject } from 'lodash-es';\nimport log from '../log/log';\n\nexport type InputNumberDecimalPlaces = number | { enableRound: boolean, places: number };\n\nexport function fillZero(length: number) {\n return new Array(length).fill(0).join('');\n}\n\n/**\n * 大数,是否是一个数字,数字字符包括 - . e [0-9]\n */\nexport function isInputNumber(num: number | string): boolean {\n if (!num) return true;\n if (isNumber(num)) return !Number.isNaN(num);\n const r = /^[0-9|e|E|-]+\\.*[0-9|e|E|-]*$/.test(num);\n if (!r) return false;\n // only allow one [.e] and two [-]\n let eCount = 0;\n let negativeCount = 0;\n let dotCount = 0;\n for (let i = 0, len = num.length; i < len; i++) {\n if (num[i] === '.') {\n dotCount += 1;\n if (dotCount > 1) return false;\n }\n if (/(e|E)+/.test(num[i])) {\n eCount += 1;\n if (eCount > 1) return false;\n }\n if (num[i] === '-') {\n negativeCount += 1;\n if (negativeCount > 2) return false;\n }\n }\n return true;\n}\n\n// 整数,去除前面的无效 0(本身是 0 除外);小数去除末尾的无效 0\nexport function removeInvalidZero(num: string, decimal = false) {\n if (num.indexOf('.') !== -1) {\n log.error('InputNumber', 'num is not a integer number.');\n return num;\n }\n if (!num || (num === '0' && decimal)) return '';\n if (num === '0') return num;\n return (decimal ? num.replace(/0+$/, '') : num.replace(/^0+/, '')) || '0';\n}\n\n/**\n * 大数加法,仅支持正整数(没有精度问题)\n * @param num1 被加数\n * @param num2 加数\n */\nexport function largeIntNumberAdd(num1: string, num2: string, decimal = false): string {\n const number1 = removeInvalidZero(num1, decimal);\n const number2 = removeInvalidZero(num2, decimal);\n const isFirstLarger = number1.length > number2.length;\n const maxNumber = isFirstLarger ? number1 : number2;\n const minNumber = isFirstLarger ? number2 : number1;\n const newNumber: string[] = [];\n const step = [];\n const diff = decimal ? 0 : maxNumber.length - minNumber.length;\n const len = decimal ? minNumber.length : maxNumber.length;\n for (let i = len - 1; i >= 0; i--) {\n const minIndex = i - diff;\n // 第一个数,加第二个数,加进位\n const count = Number(maxNumber[i]) + (Number(minNumber[minIndex]) || 0) + (step[i] || 0);\n if (count >= 10) {\n step[i - 1] = 1;\n }\n newNumber.unshift(String(count % 10));\n }\n // 999 + 1 = 1000,之类的进位\n if (step[-1]) {\n newNumber.unshift('1');\n }\n if (decimal) {\n return newNumber.concat(maxNumber.slice(len, maxNumber.length)).join('');\n }\n return newNumber.join('');\n}\n\n/**\n * 大数加法,支持小数和整数(没有精度问题)\n * @param num1 被加数\n * @param num2 加数\n */\nexport function largePositiveNumberAdd(num1: string, num2: string): string {\n const [intNumber1 = '0', decimalNumber1 = '0'] = num1.split('.');\n const [intNumber2 = '0', decimalNumber2 = '0'] = num2.split('.');\n const integerSum = largeIntNumberAdd(intNumber1, intNumber2);\n // 如果不存在小数,则直接返回整数相加结果\n if (decimalNumber1 === '0' && decimalNumber2 === '0') return integerSum;\n const newDecimalNumber1 = removeInvalidZero(decimalNumber1, true);\n const newDecimalNumber2 = removeInvalidZero(decimalNumber2, true);\n // 小数点相加\n const decimalNumberSum = largeIntNumberAdd(newDecimalNumber1, newDecimalNumber2, true);\n // 组合整数部分和小数部分\n const decimalLength = decimalNumberSum.length;\n // 如果小数相加进位\n if (decimalLength > newDecimalNumber1.length && decimalLength > newDecimalNumber2.length) {\n return [\n removeInvalidZero(largeIntNumberAdd(integerSum, '1')),\n removeInvalidZero(decimalNumberSum.slice(1), true),\n ].filter((v: string) => v).join('.');\n }\n return [\n removeInvalidZero(integerSum),\n removeInvalidZero(decimalNumberSum, true)\n ].filter((v: string) => v).join('.');\n}\n\n/**\n * 比较两个大数的大小,仅正整数有效\n */\nfunction compareLargeIntegerNumber(num1: string, num2: string): 1 | -1 | 0 {\n const number1 = removeInvalidZero(num1);\n const number2 = removeInvalidZero(num2);\n if (number1.length === number2.length) {\n for (let i = 0, len = number1.length; i < len; i++) {\n if (number1[i] > number2[i]) return 1;\n if (number1[i] < number2[i]) return -1;\n }\n return 0;\n }\n return number1.length > number2.length ? 1 : -1;\n}\n\nfunction compareLargeDecimalNumber(num1: string, num2: string) {\n const number1 = num1 && num1 !== '0' ? num1.replace(/0+$/, '') : '0';\n const number2 = num2 && num2 !== '0' ? num2.replace(/0+$/, '') : '0';\n const maxLength = Math.max(number1.length, number2.length);\n for (let i = 0, len = maxLength; i < len; i++) {\n if ((number1[i] || 0) > (number2[i] || 0)) return 1;\n if ((number1[i] || 0) < (number2[i] || 0)) return -1;\n }\n return 0;\n}\n\n/**\n * 2e3 => 2000\n * 0.2e3 => 200\n */\nexport function formatENumber(num: string): string {\n const [num1, num2] = num.split('e');\n if (!num2) return num;\n const [integer, initDecimal = ''] = num.split('.');\n const zeroCount = Number(num2);\n const [decimal] = initDecimal.split('e');\n if (zeroCount > decimal.length) {\n const multipleZero = fillZero(zeroCount - decimal.length);\n return num1.replace(/(^0+|\\.)/g, '') + multipleZero;\n }\n const n1 = integer.replace(/^0+/, '') + decimal.slice(0, zeroCount);\n const d2 = decimal.slice(zeroCount);\n return d2 ? [n1, d2].join('.') : n1;\n}\n\n/**\n * 比较两个大数的大小\n */\nexport function compareLargeNumber(\n num1: string,\n num2: string,\n): 1 | -1 | 0 {\n const [integer1, decimal1] = formatENumber(num1).split('.');\n const [integer2, decimal2] = formatENumber(num2).split('.');\n const result = compareLargeIntegerNumber(integer1.replace('-', ''), integer2.replace('-', ''));\n const integer1IsNegative = integer1.includes('-');\n const integer2IsNegative = integer2.includes('-');\n if (integer1IsNegative && !integer2IsNegative) return -1;\n if (!integer1IsNegative && integer2IsNegative) return 1;\n if (integer1IsNegative && integer2IsNegative) {\n if (result === 0) return 0;\n return result > 0 ? -1 : 1;\n }\n if (result === 0) {\n return compareLargeDecimalNumber(decimal1, decimal2);\n }\n return result;\n}\n\n// 确认是否为无限大/小\nexport function isInfinity(num: number| string) {\n return [-Infinity, Infinity].includes(Number(num));\n}\n\n// 确认是否是大数\nexport function isSafeNumber(num: string | number) {\n return Number(num) < Number.MAX_SAFE_INTEGER && Number(num) > Number.MIN_SAFE_INTEGER;\n}\n\n/**\n * 比较两个数的大小\n */\nexport function compareNumber(\n num1: string | number,\n num2: string | number,\n largeNumber?: boolean,\n) {\n const isSafeNumberCompare = isSafeNumber(num1) && isSafeNumber(num2) && !largeNumber;\n const isInfinityCompare = isInfinity(num1) || isInfinity(num2);\n if (isSafeNumberCompare || isInfinityCompare) {\n // 比较两个非大数或涉及无穷的大小\n if (Number(num1) === Number(num2)) return 0;\n return Number(num1) > Number(num2) ? 1 : -1;\n }\n // 比较两个大数的大小\n return compareLargeNumber(String(num1), String(num2));\n}\n\n/**\n * 大数减法,仅支持整数\n * @param num1 被减数\n * @param num2 减数\n * @param decimal 是否为小数位相减\n */\nexport function largeIntegerNumberSubtract(\n num1: string, num2: string, p?: { decimal?: boolean, stayZero?: boolean }\n): string {\n if (num1 === num2) return '0';\n const { decimal, stayZero } = p || {};\n const number1 = removeInvalidZero(num1);\n const number2 = removeInvalidZero(num2);\n const isFirstLarger = compareLargeIntegerNumber(number1, number2) > 0;\n const maxNumber = isFirstLarger ? number1 : number2;\n const minNumber = isFirstLarger ? number2 : number1;\n const newNumber: string[] = [];\n // step 存储借位信息\n const step = [];\n const diff = decimal ? 0 : maxNumber.length - minNumber.length;\n const len = decimal ? minNumber.length : maxNumber.length;\n for (let i = len - 1; i >= 0; i--) {\n const minIndex = i - diff;\n // 第一个数,减第二个数,减借位\n let count = Number(maxNumber[i]) - (Number(minNumber[minIndex]) || 0) - (step[i] || 0);\n if (count < 0) {\n step[i - 1] = 1;\n count += 10;\n }\n newNumber.unshift(String(count));\n }\n if (decimal) {\n return newNumber.concat(maxNumber.slice(len, maxNumber.length)).join('');\n }\n let finalNumber = newNumber.join('');\n if (!stayZero) {\n finalNumber = finalNumber.replace(/^0+/, '');\n }\n return removeInvalidZero(isFirstLarger ? finalNumber : `-${finalNumber}`);\n}\n\n/**\n * 大数减法,支持整数和小数(无精度问题)\n * @param num1 被减数\n * @param num2 减数\n * @param decimal 是否为小数位相减\n */\nexport function largePositiveNumberSubtract(num1: string, num2: string): string {\n if (num1 === num2) return '0';\n const isFirstLarger = compareNumber(num1, num2, true) > 0;\n const maxNumber = isFirstLarger ? num1 : num2;\n const minNumber = isFirstLarger ? num2 : num1;\n // 整数部分和小数部分分开处理\n const [intNumber1, decimalNumber1 = '0'] = maxNumber.split('.');\n const [intNumber2, decimalNumber2 = '0'] = minNumber.split('.');\n let integerNumber = largeIntegerNumberSubtract(intNumber1, intNumber2);\n // 如果不存在小数,则直接返回整数相加结果\n if (decimalNumber1 === '0' && decimalNumber2 === '0') {\n return isFirstLarger ? integerNumber : `-${integerNumber}`;\n }\n // 小数点相减\n let decimalNumber = '';\n let addOneNumber = decimalNumber1;\n // 第一个数字的小数位数比第二个少,需补足 0\n if (decimalNumber1.length < decimalNumber2.length) {\n addOneNumber = `${decimalNumber1}${fillZero(decimalNumber2.length - decimalNumber1.length)}`;\n }\n // 第一个小数位更小,是否需要借位\n if (compareLargeDecimalNumber(addOneNumber, decimalNumber2) >= 0) {\n decimalNumber = largeIntegerNumberSubtract(addOneNumber, decimalNumber2, { decimal: true });\n } else {\n if (decimalNumber1.length < decimalNumber2.length || decimalNumber1 === '0') {\n decimalNumber = largeIntegerNumberSubtract(`1${addOneNumber}`, decimalNumber2, { stayZero: true });\n decimalNumber = fillZero(decimalNumber2.length - decimalNumber.length) + decimalNumber;\n } else {\n decimalNumber = largeIntegerNumberSubtract(decimalNumber1, decimalNumber2, { decimal: true });\n }\n integerNumber = largeIntegerNumberSubtract(integerNumber, '1');\n }\n const finalNumber = decimalNumber ? [integerNumber, decimalNumber].join('.') : integerNumber;\n return isFirstLarger ? finalNumber : `-${finalNumber}`;\n}\n\n/**\n * -0.6 - 0.8 => -(0.6 + 0.8)\n * -0.6 - (-0.8) => 0.8 - 0.6\n * 0.6 - (-0.8) => 0.6 + 0.8\n * 0.6 - 0.8 => 0.6 - 0.8\n */\nexport function largeNumberSubtract(num1: string, num2: string): string {\n const isFirstNegative = num1[0] === '-';\n const isSecondNegative = num2[0] === '-';\n if (isFirstNegative && !isSecondNegative) {\n const r = largePositiveNumberAdd(num1.slice(1), num2);\n return `-${r}`;\n }\n if (isFirstNegative && isSecondNegative) {\n return largePositiveNumberSubtract(num2.slice(1), num1.slice(1));\n }\n if (!isFirstNegative && isSecondNegative) {\n return largePositiveNumberAdd(num1, num2.slice(1));\n }\n return largePositiveNumberSubtract(num1, num2);\n}\n\n/**\n * -0.6 + 0.8 => 0.8 - 0.6\n * -0.6 + (-0.8) => -(0.6 + 0.8)\n * 0.6 + (-0.8) => 0.6 - 0.8\n * 0.6 + 0.8 => 0.6 + 0.8\n */\nexport function largeNumberAdd(num1: string, num2: string): string {\n const isFirstNegative = num1[0] === '-';\n const isSecondNegative = num2[0] === '-';\n if (isFirstNegative && !isSecondNegative) {\n return largePositiveNumberSubtract(num2, num1.slice(1));\n }\n if (isFirstNegative && isSecondNegative) {\n const r = largePositiveNumberAdd(num2.slice(1), num1.slice(1));\n return `-${r}`;\n }\n if (!isFirstNegative && isSecondNegative) {\n return largePositiveNumberSubtract(num1, num2.slice(1));\n }\n return largePositiveNumberAdd(num1, num2);\n}\n\n/**\n * 格式化小数,并且可以控制小数点后的位数和是否进行四舍五入。\n *\n * @param {number} num - 要格式化的数字。\n * @param {number} places - 小数点后的位数。\n * @param {boolean} rounding - 是否进行四舍五入。\n * @returns {string} 格式化后的数字字符串。\n */\nexport function formatDecimal(num: number, places: number, enableRound: boolean = true) {\n // 开启四舍五入 直接用 toFixed\n if (enableRound) {\n return num.toFixed(places);\n }\n\n const [integer, decimal] = num.toString().split('.');\n // 保留 0 位小数\n if (places === 0) {\n return integer;\n }\n // 补足小数位数\n if (decimal) {\n let decimalNumber = decimal.slice(0, places);\n if (decimal.length < places) {\n decimalNumber += fillZero(places - decimal.length);\n }\n return [integer, decimalNumber].join('.');\n }\n\n return [integer, fillZero(places)].join('.');\n}\n\nexport function decimalPlacesToFixedNum(num: number, decimalPlaces: InputNumberDecimalPlaces) {\n if (isObject(decimalPlaces)) {\n return formatDecimal(num, decimalPlaces.places, decimalPlaces.enableRound ?? true);\n }\n return formatDecimal(num, decimalPlaces, true);\n}\n\n/**\n * 大数保留 N 位小数(没有精度问题)\n * @param {String} number 大数(只能使用字符串表示)\n * @param {Number} decimalPlaces 保留的小数位数\n * @param {Boolean} largeNumber 是否为大数\n */\nexport function largeNumberToFixed(\n number: string | number,\n decimalPlaces: InputNumberDecimalPlaces = 0,\n largeNumber: boolean = true,\n): string {\n if (Number.isNaN(Number(number))) return '';\n if (!largeNumber) {\n return decimalPlacesToFixedNum(Number(number), decimalPlaces);\n }\n const places = isObject(decimalPlaces) ? decimalPlaces.places : decimalPlaces;\n const enableRound = isObject(decimalPlaces) ? (decimalPlaces.enableRound ?? true) : true;\n if (!isString(number)) return String(number);\n // eslint-disable-next-line prefer-const\n let [num1, num2] = number.split('.');\n // 如果不存在小数点,则补足位数\n if (!num2) {\n return (places > 0 && enableRound) ? [number, (fillZero(places))].join('.') : number;\n }\n // 存在小数点,保留 0 位小数,灵活配置四舍五入\n if (places === 0) {\n return (enableRound && Number(num2[0]) >= 5) ? largePositiveNumberAdd(num1, '1') : num1;\n }\n // 存在小数点,保留 > 0 位小数,灵活配置四舍五入\n let decimalNumber = num2.slice(0, places);\n if (num2.length < places) {\n decimalNumber += (fillZero(places - num2.length));\n } else if (enableRound) {\n // 用于判断是否处于 1.08 这种小数为0开始的边界情况\n const leadZeroNum = decimalNumber.match(/^0+/)?.[0].length;\n // 用于判断是否处于 0.99/1.99 等需要往非0位进位的场景\n const leadNineNum = decimalNumber.match(/^9+/);\n // 决定是否需要四舍五入\n const needAdded = Number(num2[places]) >= 5;\n\n // 四舍五入后的结果\n decimalNumber = needAdded\n ? largePositiveNumberAdd(decimalNumber, '1')\n : decimalNumber;\n\n // 边界场景1(1.08 这种小数为0开始的边界情况):计算后有误判的可能,如008 +1 误判为 8+1,需要手动补 0\n if (\n leadZeroNum\n && needAdded\n && leadZeroNum + decimalNumber.length >= places\n ) {\n decimalNumber = `${fillZero(\n places - decimalNumber.length\n )}${decimalNumber}`;\n }\n // 边界场景2:(0.99 这种可能进位的边界情况):计算后有误判的可能,如995 四舍五入后需进位\n if (leadNineNum && decimalNumber.length > places) {\n num1 = (Number(num1) + 1).toString();\n decimalNumber = fillZero(places);\n }\n }\n return [num1, decimalNumber].join('.');\n}\n"],"names":["fillZero","length","Array","fill","join","isInputNumber","num","isNumber","Number","isNaN","r","test","eCount","negativeCount","dotCount","i","len","removeInvalidZero","decimal","arguments","undefined","indexOf","log","error","replace","largeIntNumberAdd","num1","num2","number1","number2","isFirstLarger","maxNumber","minNumber","newNumber","step","diff","minIndex","count","unshift","String","concat","slice","largePositiveNumberAdd","_num1$split","split","_num1$split2","_slicedToArray","_num1$split2$","intNumber1","_num1$split2$2","decimalNumber1","_num2$split","_num2$split2","_num2$split2$","intNumber2","_num2$split2$2","decimalNumber2","integerSum","newDecimalNumber1","newDecimalNumber2","decimalNumberSum","decimalLength","filter","v","compareLargeIntegerNumber","compareLargeDecimalNumber","maxLength","Math","max","formatENumber","_num$split","_num$split2","_num$split3","_num$split4","integer","_num$split4$","initDecimal","zeroCount","_initDecimal$split","_initDecimal$split2","multipleZero","n1","d2","compareLargeNumber","_formatENumber$split","_formatENumber$split2","integer1","decimal1","_formatENumber$split3","_formatENumber$split4","integer2","decimal2","result","integer1IsNegative","includes","integer2IsNegative","isInfinity","Infinity","isSafeNumber","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","compareNumber","largeNumber","isSafeNumberCompare","isInfinityCompare","largeIntegerNumberSubtract","p","_ref","stayZero","finalNumber","largePositiveNumberSubtract","_maxNumber$split","_maxNumber$split2","_maxNumber$split2$","_minNumber$split","_minNumber$split2","_minNumber$split2$","integerNumber","decimalNumber","addOneNumber","largeNumberSubtract","isFirstNegative","isSecondNegative","largeNumberAdd","formatDecimal","places","enableRound","toFixed","_num$toString$split","toString","_num$toString$split2","decimalPlacesToFixedNum","decimalPlaces","isObject","_decimalPlaces$enable","largeNumberToFixed","number","_decimalPlaces$enable2","isString","_number$split","_number$split2","_decimalNumber$match","leadZeroNum","match","leadNineNum","needAdded"],"mappings":"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"}