公共方法之-金额数字转换为中文

144 阅读1分钟

例如: 将金额12341234 转换为 一千二百三十四万一千二百三十四

第一步

  • 按照中文书写习惯,每4位利用,号进行分割
  • 根据号将分成数组
  • filter去掉空串
// 创建一个转换函数
function toChineseNumber(num) {
    // 将数字每4位分割
    const parts = num.toString().replace(/(?=(\d{4})+$)/g,',').split(',').filter(Boolean);
}

// 打印结果得
['1234', '1234']

第二步

  • 单独看数组的某一项1234
  • 循环1234,并将其映射为中文
// 中文映射
const chineseMap = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
function toChineseNumber(num) {
    // 将数字每4位分割
    const parts = num.toString().replace(/(?=(\d{4})+$)/g,',').split(',').filter(Boolean);
    for(let i = 0; i < parts.length; i++) {
        const c = _transform(parts[i]);
    }
}
function _transform(str) {
    let result = '';
    for(let i = 0; i < str.length; i++) {
        let c = chineseMap[str[i]];
    }
    console.log(result);
    return result;
}

// 打印结果得
一二三四
一二三四

第三步

  • 根据映射中文的思路,映射出对应的单位
...
const units = ['', '十', '百', '千'];
function _transform(str) {
    let result = '';
    for(let i = 0; i < str.length; i++) {
        let c = chineseMap[str[i]];
        let u = units[str.length - i - 1];
        result += c + u;
    }
    return result;
}
// 打印结果得
一千二百三十四
一千二百三十四
  • 特殊情况处理:12041210021000
...
function _transform(str) {
    let result = '';
    for(let i = 0; i < str.length; i++) {
        let c = chineseMap[str[i]];
        let u = units[str.length - i - 1];
        // 如果结果为零,不带单位
        if (c === '零') {
            u = '';
        }
        // 如果结果为一,单位为十,一省略
        if (c === '一' && u === '十') {
            c = '';
        }
        result += c + u;
    }
    return _handleZero(result);
}

// 将重复的0和结尾的零去掉
function _handleZero(str) {
    return str.replace(/零+/g, '零').replace(/零$/g, '');
}

第四步

  • 补充大单位万和亿
...
const bitUnits = ['', '万', '亿'];
function toChineseNumber(num) {
    // 将数字每4位分割
    const parts = num.toString().replace(/(?=(\d{4})+$)/g, ',').split(',').filter(Boolean);
    let result = '';
    for(let i = 0; i < parts.length; i++) {
        const c = _transform(parts[i]);
        let u = bitUnits[parts.length - i - 1];
        // 如果输出结果为空,即0000的情况,补一个零
        if (c === '') {
            result += '零';
            continue;
        }
        result += c + u;
    }
    return _handleZero(result);
}
...

最终代码如下:

const chineseMap = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
const units = ['', '十', '百', '千'];
const bitUnits = ['', '万', '亿'];

/**
 * 数字转中文
 */
function toChineseNumber(num) {
    // 将数字每4位分割
    const parts = num.toString().replace(/(?=(\d{4})+$)/g, ',').split(',').filter(Boolean);
    let result = '';
    for(let i = 0; i < parts.length; i++) {
        const c = _transform(parts[i]);
        let u = bitUnits[parts.length - i - 1];
        if (c === '') {
            result += '零';
            continue;
        }
        result += c + u;
    }
    return _handleZero(result);
}

function _transform(str) {
    let result = '';
    for(let i = 0; i < str.length; i++) {
        let c = chineseMap[str[i]];
        let u = units[str.length - i - 1];
        if (c === '零') {
            u = '';
        }
        if (c === '一' && u === '十') {
            c = '';
        }
        result += c + u;
    }
    result = _handleZero(result);
    return result;
}

function _handleZero(str) {
    return str.replace(/零+/g, '零').replace(/零$/g, '');
}

console.log(toChineseNumber(12341234))