{"version":3,"file":"number.mjs","sources":["../../../../packages/utils/number.ts"],"sourcesContent":["/**\r\n * 金额转中文\r\n * 思路：\r\n *                              个\r\n *      十     百      千       万\r\n *      十万   百万    千万     亿\r\n *      十亿   百亿    千亿\r\n *\r\n *                              1\r\n *      2      3       4        5\r\n *      6      7       8        9\r\n *      10\r\n *\r\n * 计算步骤\r\n * 1. 获取当前数值大小\r\n * 2. 排除个位后 数值按个，十，百，千有规律的重复 所以计算其和4的余数 pos % 4\r\n * 3. pos = 0 ~ 3 没有最大单位\r\n *    pos = 4 ~ 7 最大单位是万\r\n *    pos = 8 ~ 11 最大单位是亿\r\n * pos / 4 的整数就是最大单位\r\n *\r\n */\r\nexport function getAmountChinese(val: number) {\r\n  if (!val && val !== 0) return ''\r\n  const amount = +val\r\n  if (Number.isNaN(amount) || amount < 0) return ''\r\n  const NUMBER = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']\r\n  const N_UNIT1 = ['', '拾', '佰', '仟']\r\n  const N_UNIT2 = ['', '万', '亿', '兆']\r\n  const D_UNIT = ['角', '分', '厘', '毫']\r\n  const [integer, decimal] = amount.toString().split('.')\r\n  if (integer && integer.length > 15) return '数字较大溢出'\r\n  let res = ''\r\n  // 整数部分\r\n  if (integer) {\r\n    for (let i = 0, len = integer.length; i < len; i++) {\r\n      const num: any = integer.charAt(i)\r\n      const pos = len - i - 1 // 排除个位后 所处的索引位置\r\n      if (num === '0') {\r\n        // 当前位 等于 0 且下一位也等于 0 则可跳过计算\r\n        if (i === len - 1) {\r\n          if (integer.length === 1) res += '零' // 0.35 这种情况不可跳过计算\r\n          break\r\n        }\r\n        if (integer.charAt(i + 1) === '0') continue\r\n      }\r\n      res += NUMBER[num]\r\n      if (parseInt(num)) res += N_UNIT1[pos % 4]\r\n      if (pos % 4 === 0) res += N_UNIT2[Math.floor(pos / 4)]\r\n    }\r\n  }\r\n  res += '元'\r\n  // 小数部分\r\n  if (parseInt(decimal)) {\r\n    for (let i = 0; i < 4; i++) {\r\n      const num: any = decimal.charAt(i)\r\n      if (parseInt(num)) res += NUMBER[num] + D_UNIT[i]\r\n    }\r\n  } else {\r\n    res += '整'\r\n  }\r\n  return res\r\n}\r\n\r\n// 转千位分隔\r\nexport function thousandsFormat(num: string | number) {\r\n  if (num === 0) return '0'\r\n  if (!num) return ''\r\n  const numArr = num.toString().split('.')\r\n  numArr[0] = numArr[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\r\n  return numArr.join('.')\r\n}\r\n\r\n// 获取时间单位\r\nexport function getDateTimeUnit(format: string) {\r\n  if (format == 'YYYY') return 'year'\r\n  if (format == 'YYYY-MM') return 'month'\r\n  if (format == 'YYYY-MM-DD') return 'day'\r\n  if (format == 'YYYY-MM-DD HH:mm') return 'minute'\r\n  return 'day'\r\n}\r\n/**\r\n * 将用户输入的连续单个数字合并为一个数\r\n * @param {Array} expressions - 记录计算表达式的数组\r\n * @returns {Array} 新的数组\r\n */\r\nexport const mergeNumberOfExps = (expressions: Array<any>): Array<any> => {\r\n  const res: any = []\r\n\r\n  const isNumChar = (n: string) => /^[\\d.]$/.test(n)\r\n  for (let i = 0; i < expressions.length; i++) {\r\n    if (i > 0 && isNumChar(expressions[i - 1]) && isNumChar(expressions[i])) {\r\n      res[res.length - 1] += expressions[i]\r\n      continue\r\n    }\r\n    res.push(expressions[i])\r\n  }\r\n\r\n  return res\r\n}\r\n// /**\r\n//  * 校验表达式是否符合计算法则\r\n//  * @param {Array} expressions - 合并数字后的表达式数组\r\n//  * @returns {Boolean}\r\n//  */\r\n// export const validExp = (expressions, mergeNum = true) => {\r\n//   const temp = mergeNum ? mergeNumberOfExps(expressions) : expressions\r\n//   const arr = temp.filter((t) => !'()'.includes(t))\r\n//   // 去括号后 length应该为奇数  并且第一个字符和最后一个字符应该为数字而非计算符号\r\n//   if (\r\n//     temp.length % 2 === 0 ||\r\n//     arr.length % 2 === 0 ||\r\n//     Number.isNaN(+arr[0]) ||\r\n//     Number.isNaN(+arr[arr.length - 1])\r\n//   ) {\r\n//     return false\r\n//   }\r\n//   for (let i = 0; i < arr.length - 1; i += 2) {\r\n//     if (typeof +arr[i] !== 'number' || !Number.isNaN(+arr[i + 1])) return false\r\n//   }\r\n//   return true\r\n// }\r\n/**\r\n * 中缀转后缀（逆波兰 Reverse Polish Notation）\r\n * @param {Array} exps - 中缀表达式数组\r\n */\r\nexport const toRPN = (exps: Array<any>) => {\r\n  const s1: any[] = [] // 符号栈\r\n  const s2: any[] = [] // 输出栈\r\n  const getTopVal = (stack: string | any[]) =>\r\n    stack.length > 0 ? stack[stack.length - 1] : null\r\n  const levelCompare = (c1: any, c2: string) => {\r\n    const getIndex = (c: string) =>\r\n      ['+-', '×÷', '()'].findIndex((t) => t.includes(c))\r\n    return getIndex(c1) - getIndex(c2)\r\n  }\r\n  exps.forEach((t) => {\r\n    if (typeof t === 'string' && Number.isNaN(Number(t))) {\r\n      // 是符号\r\n      if (t === '(') {\r\n        s1.push(t)\r\n      } else if (t === ')') {\r\n        let popVal\r\n        do {\r\n          popVal = s1.pop()\r\n          popVal !== '(' && s2.push(popVal)\r\n        } while (s1.length && popVal !== '(')\r\n      } else {\r\n        let topVal = getTopVal(s1)\r\n        if (!topVal) {\r\n          // s1 为空 直接push\r\n          s1.push(t)\r\n        } else {\r\n          while (topVal && topVal !== '(' && levelCompare(topVal, t) >= 0) {\r\n            // 优先级 >= t 弹出到s2\r\n            s2.push(s1.pop())\r\n            topVal = getTopVal(s1)\r\n          }\r\n          s1.push(t)\r\n        }\r\n      }\r\n      return\r\n    }\r\n    s2.push(t) // 数字直接入栈\r\n  })\r\n  while (s1.length) {\r\n    s2.push(s1.pop())\r\n  }\r\n  return s2\r\n}\r\n// /**\r\n//  * 计算后缀表达式的值\r\n//  * @param {Array} rpnExps - 后缀表达式\r\n//  */\r\nexport const calcRPN = (rpnExps: any[]) => {\r\n  rpnExps = rpnExps.concat()\r\n  const calc = (x: any, y: any, type: any) => {\r\n    const a1 = Number(x),\r\n      a2 = Number(y)\r\n    switch (type) {\r\n      case '+':\r\n        return a1 + a2\r\n      case '-':\r\n        return a1 - a2\r\n      case '×':\r\n        return a1 * a2\r\n      case '÷':\r\n        return a1 / a2\r\n    }\r\n  }\r\n  for (let i = 2; i < rpnExps.length; i++) {\r\n    if ('+-×÷'.includes(rpnExps[i])) {\r\n      const val = calc(rpnExps[i - 2], rpnExps[i - 1], rpnExps[i])\r\n      rpnExps.splice(i - 2, 3, val)\r\n      i = i - 2\r\n    }\r\n  }\r\n  return rpnExps[0]\r\n}\r\n"],"names":[],"mappings":";AAsBO,SAAS,iBAAiB,GAAA,EAAa;AAC5C,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,KAAQ,CAAA,EAAG,OAAO,EAAA;AAC9B,EAAA,MAAM,SAAS,CAAC,GAAA;AAChB,EAAA,IAAI,OAAO,KAAA,CAAM,MAAM,CAAA,IAAK,MAAA,GAAS,GAAG,OAAO,EAAA;AAC/C,EAAA,MAAM,MAAA,GAAS,CAAC,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAG,CAAA;AAChE,EAAA,MAAM,OAAA,GAAU,CAAC,EAAA,EAAI,QAAA,EAAK,UAAK,QAAG,CAAA;AAClC,EAAA,MAAM,OAAA,GAAU,CAAC,EAAA,EAAI,QAAA,EAAK,UAAK,QAAG,CAAA;AAClC,EAAA,MAAM,MAAA,GAAS,CAAC,QAAA,EAAK,QAAA,EAAK,UAAK,QAAG,CAAA;AAClC,EAAA,MAAM,CAAC,SAAS,OAAO,CAAA,GAAI,OAAO,QAAA,EAAS,CAAE,MAAM,GAAG,CAAA;AACtD,EAAA,IAAI,OAAA,IAAW,OAAA,CAAQ,MAAA,GAAS,EAAA,EAAI,OAAO,sCAAA;AAC3C,EAAA,IAAI,GAAA,GAAM,EAAA;AAEV,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,GAAA,GAAM,QAAQ,MAAA,EAAQ,CAAA,GAAI,KAAK,CAAA,EAAA,EAAK;AAClD,MAAA,MAAM,GAAA,GAAW,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA;AACjC,MAAA,MAAM,GAAA,GAAM,MAAM,CAAA,GAAI,CAAA;AACtB,MAAA,IAAI,QAAQ,GAAA,EAAK;AAEf,QAAA,IAAI,CAAA,KAAM,MAAM,CAAA,EAAG;AACjB,UAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,GAAA,IAAO,QAAA;AACjC,UAAA;AAAA,QACF;AACA,QAAA,IAAI,OAAA,CAAQ,MAAA,CAAO,CAAA,GAAI,CAAC,MAAM,GAAA,EAAK;AAAA,MACrC;AACA,MAAA,GAAA,IAAO,OAAO,GAAG,CAAA;AACjB,MAAA,IAAI,SAAS,GAAG,CAAA,EAAG,GAAA,IAAO,OAAA,CAAQ,MAAM,CAAC,CAAA;AACzC,MAAA,IAAI,GAAA,GAAM,MAAM,CAAA,EAAG,GAAA,IAAO,QAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAC,CAAC,CAAA;AAAA,IACvD;AAAA,EACF;AACA,EAAA,GAAA,IAAO,QAAA;AAEP,EAAA,IAAI,QAAA,CAAS,OAAO,CAAA,EAAG;AACrB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,GAAA,GAAW,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA;AACjC,MAAA,IAAI,QAAA,CAAS,GAAG,CAAA,EAAG,GAAA,IAAO,OAAO,GAAG,CAAA,GAAI,OAAO,CAAC,CAAA;AAAA,IAClD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,GAAA,IAAO,QAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,gBAAgB,GAAA,EAAsB;AACpD,EAAA,IAAI,GAAA,KAAQ,GAAG,OAAO,GAAA;AACtB,EAAA,IAAI,CAAC,KAAK,OAAO,EAAA;AACjB,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,QAAA,EAAS,CAAE,MAAM,GAAG,CAAA;AACvC,EAAA,MAAA,CAAO,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,CAAE,OAAA,CAAQ,yBAAyB,GAAG,CAAA;AAC1D,EAAA,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AACxB;AAGO,SAAS,gBAAgB,MAAA,EAAgB;AAC9C,EAAA,IAAI,MAAA,IAAU,QAAQ,OAAO,MAAA;AAC7B,EAAA,IAAI,MAAA,IAAU,WAAW,OAAO,OAAA;AAChC,EAAA,IAAI,MAAA,IAAU,cAAc,OAAO,KAAA;AACnC,EAAA,IAAI,MAAA,IAAU,oBAAoB,OAAO,QAAA;AACzC,EAAA,OAAO,KAAA;AACT;AAMO,MAAM,iBAAA,GAAoB,CAAC,WAAA,KAAwC;AACxE,EAAA,MAAM,MAAW,EAAC;AAElB,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAc,SAAA,CAAU,KAAK,CAAC,CAAA;AACjD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AAC3C,IAAA,IAAI,CAAA,GAAI,CAAA,IAAK,SAAA,CAAU,WAAA,CAAY,CAAA,GAAI,CAAC,CAAC,CAAA,IAAK,SAAA,CAAU,WAAA,CAAY,CAAC,CAAC,CAAA,EAAG;AACvE,MAAA,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,IAAK,YAAY,CAAC,CAAA;AACpC,MAAA;AAAA,IACF;AACA,IAAA,GAAA,CAAI,IAAA,CAAK,WAAA,CAAY,CAAC,CAAC,CAAA;AAAA,EACzB;AAEA,EAAA,OAAO,GAAA;AACT;AA2BO,MAAM,KAAA,GAAQ,CAAC,IAAA,KAAqB;AACzC,EAAA,MAAM,KAAY,EAAC;AACnB,EAAA,MAAM,KAAY,EAAC;AACnB,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KACjB,KAAA,CAAM,MAAA,GAAS,IAAI,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,GAAI,IAAA;AAC/C,EAAA,MAAM,YAAA,GAAe,CAAC,EAAA,EAAS,EAAA,KAAe;AAC5C,IAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAChB,CAAC,MAAM,UAAA,EAAM,IAAI,CAAA,CAAE,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AACnD,IAAA,OAAO,QAAA,CAAS,EAAE,CAAA,GAAI,QAAA,CAAS,EAAE,CAAA;AAAA,EACnC,CAAA;AACA,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,KAAM;AAClB,IAAA,IAAI,OAAO,MAAM,QAAA,IAAY,MAAA,CAAO,MAAM,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG;AAEpD,MAAA,IAAI,MAAM,GAAA,EAAK;AACb,QAAA,EAAA,CAAG,KAAK,CAAC,CAAA;AAAA,MACX,CAAA,MAAA,IAAW,MAAM,GAAA,EAAK;AACpB,QAAA,IAAI,MAAA;AACJ,QAAA,GAAG;AACD,UAAA,MAAA,GAAS,GAAG,GAAA,EAAI;AAChB,UAAA,MAAA,KAAW,GAAA,IAAO,EAAA,CAAG,IAAA,CAAK,MAAM,CAAA;AAAA,QAClC,CAAA,QAAS,EAAA,CAAG,MAAA,IAAU,MAAA,KAAW,GAAA;AAAA,MACnC,CAAA,MAAO;AACL,QAAA,IAAI,MAAA,GAAS,UAAU,EAAE,CAAA;AACzB,QAAA,IAAI,CAAC,MAAA,EAAQ;AAEX,UAAA,EAAA,CAAG,KAAK,CAAC,CAAA;AAAA,QACX,CAAA,MAAO;AACL,UAAA,OAAO,UAAU,MAAA,KAAW,GAAA,IAAO,aAAa,MAAA,EAAQ,CAAC,KAAK,CAAA,EAAG;AAE/D,YAAA,EAAA,CAAG,IAAA,CAAK,EAAA,CAAG,GAAA,EAAK,CAAA;AAChB,YAAA,MAAA,GAAS,UAAU,EAAE,CAAA;AAAA,UACvB;AACA,UAAA,EAAA,CAAG,KAAK,CAAC,CAAA;AAAA,QACX;AAAA,MACF;AACA,MAAA;AAAA,IACF;AACA,IAAA,EAAA,CAAG,KAAK,CAAC,CAAA;AAAA,EACX,CAAC,CAAA;AACD,EAAA,OAAO,GAAG,MAAA,EAAQ;AAChB,IAAA,EAAA,CAAG,IAAA,CAAK,EAAA,CAAG,GAAA,EAAK,CAAA;AAAA,EAClB;AACA,EAAA,OAAO,EAAA;AACT;AAKO,MAAM,OAAA,GAAU,CAAC,OAAA,KAAmB;AACzC,EAAA,OAAA,GAAU,QAAQ,MAAA,EAAO;AACzB,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,EAAQ,CAAA,EAAQ,IAAA,KAAc;AAC1C,IAAA,MAAM,KAAK,MAAA,CAAO,CAAC,CAAA,EACjB,EAAA,GAAK,OAAO,CAAC,CAAA;AACf,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,GAAA;AACH,QAAA,OAAO,EAAA,GAAK,EAAA;AAAA,MACd,KAAK,GAAA;AACH,QAAA,OAAO,EAAA,GAAK,EAAA;AAAA,MACd,KAAK,MAAA;AACH,QAAA,OAAO,EAAA,GAAK,EAAA;AAAA,MACd,KAAK,MAAA;AACH,QAAA,OAAO,EAAA,GAAK,EAAA;AAAA;AAChB,EACF,CAAA;AACA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,IAAI,YAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAG;AAC/B,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAA;AAC3D,MAAA,OAAA,CAAQ,MAAA,CAAO,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAC5B,MAAA,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,IACV;AAAA,EACF;AACA,EAAA,OAAO,QAAQ,CAAC,CAAA;AAClB;;;;"}