{"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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"}