xdesign-vue-next
Version:
XDesign Component for vue-next
1 lines • 25.8 kB
Source Map (JSON)
{"version":3,"file":"large-number.mjs","sources":["../../../../src/_common/js/input-number/large-number.ts"],"sourcesContent":["import isString from 'lodash/isString';\nimport isNumber from 'lodash/isNumber';\nimport log from '../log/log';\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 {String} number 大数(只能使用字符串表示)\n * @param {Number} decimalPlaces 保留的小数位数\n * @param {Boolean} largeNumber 是否为大数\n */\nexport function largeNumberToFixed(\n number: string | number, decimalPlaces: number = 0, largeNumber = true,\n): string {\n if (!largeNumber) return Number(number).toFixed(decimalPlaces);\n if (!isString(number)) return String(number);\n const [num1, num2] = number.split('.');\n // 如果不存在小数点,则补足位数\n if (!num2) {\n return decimalPlaces ? [number, (fillZero(decimalPlaces))].join('.') : number;\n }\n // 存在小数点,保留 0 位小数,四舍五入\n if (decimalPlaces === 0) {\n return Number(num2[0]) >= 5 ? largePositiveNumberAdd(num1, '1') : num1;\n }\n // 存在小数点,保留 > 0 位小数,四舍五入(此时,整数位不会发生任何变化,只需关注小数位数)\n let decimalNumber = num2.slice(0, decimalPlaces);\n if (num2.length < decimalPlaces) {\n decimalNumber += (fillZero(decimalPlaces - num2.length));\n } else {\n decimalNumber = Number(num2[decimalPlaces]) >= 5\n ? largePositiveNumberAdd(decimalNumber, '1')\n : decimalNumber;\n }\n return [num1, decimalNumber].join('.');\n}\n"],"names":["isNumber","dotCount","eCount","negativeCount","log","step","newNumber","_num1$split2$","intNumber1","_num1$split2$2","decimalNumber1","_num2$split2$","intNumber2","_num2$split2$2","decimalNumber2","num1","num2","integer","_num$split4$","initDecimal","decimal","integer1","decimal1","integer2","decimal2","count","_maxNumber$split2$","_minNumber$split2$","addOneNumber","decimalNumber","stayZero","integerNumber"],"mappings":"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"}