From 87e38f5e26cfc00432b377ef9942b6337b658ae5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98=E5=B0=8F=E5=A2=A8?= <2291200076@qq.com> Date: Sun, 27 Aug 2023 22:07:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0numToChinese=20=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E8=BD=AC=E4=B8=AD=E6=96=87=E6=95=B0=E5=AD=97=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/numToChinese 数字转中文数字.js | 55 ++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 tools/numToChinese 数字转中文数字.js diff --git a/tools/numToChinese 数字转中文数字.js b/tools/numToChinese 数字转中文数字.js new file mode 100644 index 0000000..8881601 --- /dev/null +++ b/tools/numToChinese 数字转中文数字.js @@ -0,0 +1,55 @@ +/** + * 数字转中文数字 + * + * 参考: https://www.jianshu.com/p/5927e5915ae4 + * 在原文基础上有改动 + * + * @param {*} num 输入的数字,必须是正数或小数 + * @returns 返回中文数字的字符串,如果输入不合法则返回错误信息 + */ +function numToChinese(num) { + // 检查输入是否是数字,如果不是则返回错误信息 + if (!/^\d*(\.\d*)?$/.test(num)) { + console.error("数字错误!"); + return null; + } + // 定义中文数字和单位的数组 + var chineseDigits = new Array("零", "一", "二", "三", "四", "五", "六", "七", "八", "九"); + var chineseUnits = new Array("", "十", "百", "千", "万", "亿", "点", ""); + // 将输入的数字去掉前导零,并且分割整数部分和小数部分 + var parts = ("" + num).replace(/(^0*)/g, "").split("."), + digitIndex = 0, // 记录当前处理的位数 + result = ""; // 存储结果字符串 + // 从右往左遍历整数部分的每一位数字 + for (var i = parts[0].length - 1; i >= 0; i--) { + switch (digitIndex) { + case 0: // 如果是个位数,则在结果字符串前加上空字符 + result = chineseUnits[7] + result; + break; + case 4: // 如果是万位数,则在结果字符串前加上万字符,除非后面全是零 + if (!new RegExp("0{4}\\d{" + (parts[0].length - i - 1) + "}$").test(parts[0])) + result = chineseUnits[4] + result; + break; + case 8: // 如果是亿位数,则在结果字符串前加上亿字符,并且重置位数和空字符 + result = chineseUnits[5] + result; + chineseUnits[7] = chineseUnits[5]; + digitIndex = 0; + break; + } + // 如果当前位数是百位或千位,并且后面有非零数字,但是前面是零,则在结果字符串前加上零字符 + if (digitIndex % 4 == 2 && parts[0].charAt(i + 2) != 0 && parts[0].charAt(i + 1) == 0) result = chineseDigits[0] + result; + // 如果当前数字不是零,则在结果字符串前加上对应的中文数字和单位 + if (parts[0].charAt(i) != 0) result = chineseDigits[parts[0].charAt(i)] + chineseUnits[digitIndex % 4] + result; + digitIndex++; // 增加位数计数器 + } + // 如果有小数部分,则在结果字符串后加上"点",并且遍历小数部分的每一位数字,加上对应的中文数字 + if (parts.length > 1) { + result += chineseUnits[6]; + for (var i = 0; i < parts[1].length; i++) { + result += chineseDigits[parts[1].charAt(i)]; + } + } + return result; +} + +console.log(numToChinese(999999)); \ No newline at end of file