chinese-parseint2
Version:
parse Chinese numeric strings to integer
1 lines • 6.34 kB
Source Map (JSON)
{"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, \"洞\": 0,\n\t\"1\": 1, \"一\": 1, \"壹\": 1, \"ㄧ\": 1, \"弌\": 1, \"么\": 1,\n\t\"2\": 2, \"二\": 2, \"貳\": 2, \"贰\": 2, \"弍\": 2, \"兩\": 2, \"两\": 2,\n\t\"3\": 3, \"三\": 3, \"參\": 3, \"叁\": 3, \"弎\": 3, \"参\": 3, \"叄\": 3,\n\t\"4\": 4, \"四\": 4, \"肆\": 4, \"䦉\": 4, \"刀\": 4,\n\t\"5\": 5, \"五\": 5, \"伍\": 5,\n\t\"6\": 6, \"六\": 6, \"陸\": 6, \"陆\": 6,\n\t\"7\": 7, \"七\": 7, \"柒\": 7, \"拐\": 7,\n\t\"8\": 8, \"八\": 8, \"捌\": 8, \"杯\": 8,\n\t\"9\": 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;;"}