数字字符串转换为人民币

数字字符串转换为人民币

思路:

  • 首先将整数和小数分开。
  • 发现规律:

0001 => 壹,0011=》拾壹,0021=》贰拾壹,0300=》叁佰,0301=》叁佰零一

00010000 => 壹万,00110000=》拾壹万,00210000=》贰拾壹万,03000000=》叁佰万,03010000=》叁佰零一万

  • 通过规律发现可以以4个数字为一组 然后再判断加上 万,亿,万亿,亿亿,万亿亿,亿亿亿等

先看小数字

小数比较简单

let numSup = "零壹贰叁肆伍陆柒捌玖拾".split("");

function float2rmb(float = "") {
    // 分割数值  获得角和分的值
    const [jiao, fen] = float.split("");
    let arr = [];
    // 判断是否需要 X角
    if (parseInt(jiao) > 0) {
        arr.push(numSup[jiao] + "角");
    }
    // 判断是否需要 X分
    if (parseInt(fen) > 0) {
        arr.push(numSup[fen] + "分");
    }
    return arr.join("");
}

float2rmb("21");  //  壹角贰分
float2rmb("01");  //  壹分

整数部分

先前的思路 四个位为一组进行转换再加上万等单位,代码进行实现:

const bits = ["", "万"];  //    ["亿", "万亿"]  ["亿亿", "万亿亿"]    
const numSup = "零壹贰叁肆伍陆柒捌玖拾".split("");

function int2rmb(int = "") {
    let bit = 0;
    let rmbArr = [];
    while (int) {
        const str = int.slice(-4);
        int = int.slice(0, -4);
        let bit2rmb = int2rmbBite(str);
        if (bit2rmb) {  // 当有四位对应有值时添加单位  0001_0000_0000  => 壹亿元
            //  ["", "万"]    ["亿", "万亿"]  ["亿亿", "万亿亿"]    
            let bitstr = bits [bit % 2] + (new Array(Math.floor(bit / 2)).fill("亿")).join("");
            bit2rmb += bitstr;
            rmbArr.push(bit2rmb);
        }
        bit++;
    }
    const rmbStr = rmbArr.join("").replace(/^零*/, ""); // 去掉头部的 零
    return rmbStr ? rmbStr + "元" : "";   
}

// 四个为一组的进行转换   str.length必须为4位
function int2rmbBite(str) {
    if (str.length < 4) {
        str = new Array(4 - str.length).fill("0").join("") + str;
    }
    let bit = str.length - 1;
    const a = [];
    while (bit >= 0) {
        let item = parseInt(str[bit]);
        switch (bit) {
            case 3:
                a.unshift(numSup[item]);
                break;
            case 2:
                a.unshift(numSup[item], "拾");
                if (item === 1) a.shift();   //  10  有两种情况  拾  或者  壹拾
                if (item === 0) a.splice(1, 1);
                break;
            case 1:
                a.unshift(numSup[item], "佰");
                if (item === 0) a.splice(1, 1);
                break;
            case 0 :
                a.unshift(numSup[item], "仟");
                if (item === 0) a.splice(1, 1);
        }
        bit--;
    }
    // 正则将连续的零转为一个零,之后再去掉末尾的 零
    return a.join("").replace(/零{1,3}/g, "零").replace(/零$/, "");
}

全部代码

在合并的时候判断是否有角分值,没有的话后边加个整字。

const bits = ["", "万"];  //    ["亿", "万亿"]  ["亿亿", "万亿亿"]    
const numSup = "零壹贰叁肆伍陆柒捌玖拾".split("");

function number2rmb(numstr) {
    numstr = String(numstr);
    let [int, float] = numstr.split(".");
    int = int2rmb(int);
    float = float2rmb(float) || "整";
    return int + float;
}

function int2rmb(int = "") {
    let bit = 0;
    let rmbArr = [];
    while (int) {
        const str = int.slice(-4);
        int = int.slice(0, -4);
        let bit2rmb = int2rmbBite(str);
        if (bit2rmb) {  // 当有四位对应有值时添加单位  0001_0000_0000  => 壹亿元
            //  ["", "万"]    ["亿", "万亿"]  ["亿亿", "万亿亿"]    
            let bitstr = bits [bit % 2] + (new Array(Math.floor(bit / 2)).fill("亿")).join("");
            bit2rmb += bitstr;
            rmbArr.push(bit2rmb);
        }
        bit++;
    }
    const rmbStr = rmbArr.join("").replace(/^零*/, ""); // 去掉头部的 零
    return rmbStr ? rmbStr + "元" : "";   
}

// 四个为一组的进行转换   str.length必须为4位
function int2rmbBite(str) {
    if (str.length < 4) {
        str = new Array(4 - str.length).fill("0").join("") + str;
    }
    let bit = str.length - 1;
    const a = [];
    while (bit >= 0) {
        let item = parseInt(str[bit]);
        switch (bit) {
            case 3:
                a.unshift(numSup[item]);
                break;
            case 2:
                a.unshift(numSup[item], "拾");
                if (item === 1) a.shift();   //  10  有两种情况  拾  或者  壹拾
                if (item === 0) a.splice(1, 1);
                break;
            case 1:
                a.unshift(numSup[item], "佰");
                if (item === 0) a.splice(1, 1);
                break;
            case 0 :
                a.unshift(numSup[item], "仟");
                if (item === 0) a.splice(1, 1);
        }
        bit--;
    }
    // 正则将连续的零转为一个零,之后再去掉末尾的 零
    return a.join("").replace(/零{1,3}/g, "零").replace(/零$/, "");
}

function float2rmb(float = "") {
    // 分割数值  获得角和分的值
    const [jiao, fen] = float.split("");
    let arr = [];
    // 判断是否需要 X角
    if (parseInt(jiao) > 0) {
        arr.push(numSup[jiao] + "角");
    }
    // 判断是否需要 X分
    if (parseInt(fen) > 0) {
        arr.push(numSup[fen] + "分");
    }
    return arr.join("");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒲公英ⁿ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值