题解 | #人民币转换#

人民币转换

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)));
    }
})();

全部评论

相关推荐

震撼沃玛一整年:查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务