UNPKG

chinese-parseint2

Version:
1 lines 6.34 kB
{"version":3,"file":"index.esm.mjs","sources":["../src/data.ts","../src/index.ts"],"sourcesContent":["\nexport const characters = Object.freeze({\n\t\"\": 0, \"\": 0, \"\": 0, \"\": 0, \"\": 0,\n\t\"\": 1, \"\": 1, \"\": 1, \"\": 1, \"\": 1, \"\": 1,\n\t\"\": 2, \"\": 2, \"\": 2, \"\": 2, \"\": 2, \"\": 2, \"\": 2,\n\t\"\": 3, \"\": 3, \"\": 3, \"\": 3, \"\": 3, \"\": 3, \"\": 3,\n\t\"\": 4, \"\": 4, \"\": 4, \"\": 4, \"\": 4,\n\t\"\": 5, \"\": 5, \"\": 5,\n\t\"\": 6, \"\": 6, \"\": 6, \"\": 6,\n\t\"\": 7, \"\": 7, \"\": 7, \"\": 7,\n\t\"\": 8, \"\": 8, \"\": 8, \"\": 8,\n\t\"\": 9, \"\": 9, \"\": 9, \"\": 9,\n\t\"\": 10, \"\": 10, \"\": 10, \"\": 10,\n\t\"\": 100, \"\": 100,\n\t\"\": 1000, \"\": 1000,\n\t\"\": 20, \"廿\": 20,\n\t\"\": 30, \"\": 40, \"\": 200,\n\t\"\": 1e+4, \"\": 1e+4,\n\t\"\": 1e+8, \"亿\": 1e+8,\n\t\"\": 1e+12,\n\t\"\": 1e+16, \"\": 1e+16, \"\": 1e+16,\n\t\"\": 1e+20,\n\t\"\": 1e+24, \"\": 1e+24,\n\t\"\": 1e+28, \"\": 1e+28,\n\t\"\": 1e+32, \"\": 1e+32,\n\t\"\": 1e+36, \"\": 1e+36,\n\t\"\": 1e+40, \"\": 1e+44, \"\": 1e+48,\n} as const);\n","\nimport { characters } from './data';\nexport { characters } from './data';\n\nexport function _isNegative(str: string)\n{\n\treturn /^[負负-]/.test(str)\n}\n\nexport function isSpecialCharVal(char: string | keyof typeof characters): char is keyof typeof characters\n{\n\treturn typeof getSpecialCharVal(char) === 'number'\n}\n\nexport function getSpecialCharVal(char: string | keyof typeof characters)\n{\n\treturn characters[char as keyof typeof characters]\n}\n\nexport function chinese_parseInt(str: string, radix?: number)\n{\n\tconst result = parseInt(str, radix);\n\tif (!isNaN(result)) return result;\n\tif (typeof str !== \"string\") return NaN;\n\n\tstr = str.replace(/[\\s ]+/g, \"\");\n\n\treturn _chineseParseIntCore(str);\n}\n\nexport function _chineseParseIntCore(str: string)\n{\n\tconst negative = _isNegative(str);\n\tif (negative) str = str.slice(1);\n\n\tlet charVal: number;\n\tlet result = 0;\n\t/**\n\t * 不到一萬的部分\n\t */\n\tlet partialSum = 0; ///< 不到一萬的部分\n\t/**\n\t * 個位數,預設為 -1 以區分有無\"\"的出現\n\t */\n\tlet digit = -1;\n\n\tfor (let i = 0; i < str.length; ++i)\n\t{\n\t\tcharVal = getSpecialCharVal(str.charAt(i)); ///< 暫存字元代表的數值\n\t\tif (charVal === undefined) return NaN; // 有任何不認得的字,直接 NaN\n\t\tif (charVal < 10)\n\t\t{\n\t\t\tdigit = (digit == -1)\n\t\t\t\t? charVal\n\t\t\t\t: digit * 10 + charVal // ex. 零五、二五六萬\n\t\t\t;\n\t\t}\n\t\telse if (charVal < 1e+4)\n\t\t{\n\t\t\tif (digit == -1) digit = 1;\n\t\t\tif (i > 1 && digit == 0 && getSpecialCharVal(str.charAt(i - 2)) != 100)\n\t\t\t{\n\t\t\t\tdigit = 1;\n\t\t\t} // 處理\"一千零十一\";搜尋\"千零十\"的確是出現過的。\n\t\t\tpartialSum += digit * charVal;\n\t\t\tdigit = -1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (digit != -1) partialSum += digit;\n\t\t\tif (i && getSpecialCharVal(str.charAt(i - 1)) >= 1e+4) // 為了\"四萬萬五千萬\"\n\t\t\t{\n\t\t\t\tresult *= getSpecialCharVal(str.charAt(i));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tresult += partialSum * charVal;\n\t\t\t}\n\t\t\tpartialSum = 0;\n\t\t\tdigit = -1;\n\t\t}\n\t}\n\tif (digit > 0)\n\t{\n\t\tif (str.length > 1)\n\t\t{\n\t\t\t// 為了處理\"二十四萬二\"\"二百五\"\n\t\t\tcharVal = getSpecialCharVal(str.charAt(str.length - 2));\n\t\t\tif (charVal < 100)\n\t\t\t{\n\t\t\t\tpartialSum += digit;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tcharVal /= charVal.toString().charAt(0) as any; // 把「皕」轉成100\n\t\t\t\tpartialSum += digit * (charVal / 10);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpartialSum += digit;\n\t\t}\n\t}\n\tresult += partialSum;\n\n\tif (negative) result *= -1;\n\n\treturn result;\n}\n\nexport default chinese_parseInt\n"],"names":["characters","Object","freeze","_isNegative","str","test","isSpecialCharVal","char","getSpecialCharVal","chinese_parseInt","radix","result","parseInt","isNaN","NaN","_chineseParseIntCore","replace","negative","charVal","slice","partialSum","digit","i","length","charAt","undefined","toString"],"mappings":"MACaA,IAAaC,OAAOC,OAAO;EACvC,KAAK;EAAG,GAAK;EAAG,KAAK;EAAG,GAAK;EAAG,GAAK;EACrC,KAAK;EAAG,GAAK;EAAG,GAAK;EAAG,GAAK;EAAG,GAAK;EAAG,GAAK;EAC7C,KAAK;EAAG,GAAK;EAAG,GAAK;EAAG,GAAK;EAAG,GAAK;EAAG,GAAK;EAAG,GAAK;EACrD,KAAK;EAAG,GAAK;EAAG,GAAK;EAAG,GAAK;EAAG,GAAK;EAAG,GAAK;EAAG,GAAK;EACrD,KAAK;EAAG,GAAK;EAAG,GAAK;EAAG,GAAK;EAAG,GAAK;EACrC,KAAK;EAAG,GAAK;EAAG,GAAK;EACrB,KAAK;EAAG,GAAK;EAAG,GAAK;EAAG,GAAK;EAC7B,KAAK;EAAG,GAAK;EAAG,GAAK;EAAG,GAAK;EAC7B,KAAK;EAAG,GAAK;EAAG,GAAK;EAAG,GAAK;EAC7B,KAAK;EAAG,GAAK;EAAG,GAAK;EAAG,GAAK;EAC7B,GAAK;EAAI,GAAK;EAAI,GAAK;EAAI,GAAK;EAChC,GAAK;EAAK,GAAK;EACf,GAAK;EAAM,GAAK;EAChB,GAAK;EAAI,GAAK;EACd,GAAK;EAAI,GAAK;EAAI,GAAK;EACvB,GAAK;EAAM,GAAK;EAChB,GAAK;EAAM,GAAK;EAChB,GAAK;EACL,GAAK;EAAO,GAAK;EAAO,GAAK;EAC7B,GAAK;EACL,GAAK;EAAO,GAAK;EACjB,GAAK;EAAO,GAAK;EACjB,GAAK;EAAO,GAAK;EACjB,GAAK;EAAO,GAAK;EACjB,GAAK;EAAO,GAAK;EAAO,GAAK;;;ACtBxB,SAAUC,YAAYC;EAE3B,OAAO,SAASC,KAAKD;AACtB;;AAEM,SAAUE,iBAAiBC;EAEhC,OAA0C,mBAA5BC,kBAAkBD;AACjC;;AAEM,SAAUC,kBAAkBD;EAEjC,OAAOP,EAAWO;AACnB;;AAEgB,SAAAE,iBAAiBL,GAAaM;EAE7C,MAAMC,IAASC,SAASR,GAAKM;EAC7B,OAAKG,MAAMF,KACQ,mBAARP,IAAyBU,MAI7BC,qBAFPX,IAAMA,EAAIY,QAAQ,WAAW,OAHFL;AAM5B;;AAEM,SAAUI,qBAAqBX;EAEpC,MAAMa,IAAWd,YAAYC;EAG7B,IAAIc;EAFAD,MAAUb,IAAMA,EAAIe,MAAM;EAG9B,IAAIR,IAAS,GAITS,IAAa,GAIbC,KAAS;EAEb,KAAK,IAAIC,IAAI,GAAGA,IAAIlB,EAAImB,UAAUD,GAClC;IAEC,IADAJ,IAAUV,kBAAkBJ,EAAIoB,OAAOF,UACvBG,MAAZP,GAAuB,OAAOJ;IAC9BI,IAAU,KAEbG,KAAmB,KAAVA,IACNH,IACQ,KAARG,IAAaH,IAGRA,IAAU,SAEJ,KAAVG,MAAaA,IAAQ,IACrBC,IAAI,KAAc,KAATD,KAAsD,OAAxCb,kBAAkBJ,EAAIoB,OAAOF,IAAI,QAE3DD,IAAQ;IAETD,KAAcC,IAAQH,GACtBG,KAAS,OAIK,KAAVA,MAAaD,KAAcC,IAC3BC,KAAKd,kBAAkBJ,EAAIoB,OAAOF,IAAI,OAAO,OAEhDX,KAAUH,kBAAkBJ,EAAIoB,OAAOF,MAIvCX,KAAUS,IAAaF;IAExBE,IAAa,GACbC,KAAS;AAEV;EA0BD,OAzBIA,IAAQ,MAEPjB,EAAImB,SAAS,KAGhBL,IAAUV,kBAAkBJ,EAAIoB,OAAOpB,EAAImB,SAAS;EAChDL,IAAU,MAEbE,KAAcC,KAIdH,KAAWA,EAAQQ,WAAWF,OAAO,IACrCJ,KAAcC,KAASH,IAAU,QAKlCE,KAAcC;EAGhBV,KAAUS,GAENH,MAAUN,MAAW,IAElBA;AACR;;"}