题解 | #人民币转换#
人民币转换
https://www.nowcoder.com/practice/00ffd656b9604d1998e966d555005a4b
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
const CN_NUM_MAP = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"];
const UNITS = ["", "拾", "佰", "仟"];
const BIG_UNITS = ["", "万", "亿"];
const DIGITS_UNITS = ["角", "分"];
const F = "负";
const SIGN = "人民币";
const Z = "整";
const RMB = "元";
function _transform(numStr) {
const arr = numStr.toString().split("");
let result = "";
for (let i = 0; i < arr.length; i++) {
const digit = +numStr[i];
const char = CN_NUM_MAP[digit];
const unit = UNITS[numStr.length - i - 1];
if (digit === 0) {
// 末尾不为零时才需要追加
if (result[result.length - 1] !== CN_NUM_MAP[0]) {
result += char;
}
} else {
// 当字符为一同时单位为十,此时可以不用带上字符,比如:10,100, 1000这类整数,转换后应该为十,一百,一千
if (CN_NUM_MAP[1] === char && unit === UNITS[1]) {
result += unit;
} else {
result += char + unit;
}
}
}
if (result[result.length - 1] === CN_NUM_MAP[0]) {
result = result.slice(0, -1);
}
return result;
}
function convertToChineseMoneyFormat(num) {
if (!num) return num;
let result = "";
const numStr = num.toString().split(".");
let [integer, digit] = numStr;
integer = Math.abs(integer);
if (integer > 0) {
const arr = integer
.toString()
.replace(/(?=(\d{4})+$)/g, ",")
.split(",")
.filter(Boolean);
for (let i = 0; i < arr.length; i++) {
const part = arr[i];
const char = _transform(part);
const unit = char ? BIG_UNITS[arr.length - i - 1] : "";
result += (char + unit);
}
result += RMB;
}
if (num - integer === 0) {
// 整数
result += Z;
} else {
// 小数部分
for (let i = 0; i < digit.length; i++) {
if (digit[i] !== "0") {
result += (CN_NUM_MAP[digit[i]] + DIGITS_UNITS[i]);
} else if (digit[0] !== '0') {
result += CN_NUM_MAP[digit[i]];
}
}
}
if (num < 0) {
return SIGN + F + result;
}
return SIGN + result;
}
void (async function () {
// Write your code here
while ((str = await readline())) {
console.log(convertToChineseMoneyFormat(Number.parseFloat(str)));
}
})();