手写一个把费用/价格转化成中文的js

1.功能介绍

最近工作的时候遇到了一个统计酒店价格并且转成中文在页面显示的需求,抽空研究了一下,捣鼓出来这么个js,没有灵光一闪的亮点,但好歹能用了

2.算法

1.把传入的字符串切割为数组,长度为1则表示是整数,长度为2则表示还有小数部分;
2.取整数部分,例如 1,234,567,890这个数字,把亿数量级的切割出来当做a,把万数量级的切割出来为b,把个数量级的切割出来为c,那么这个数字被转化的最终结果就是“a亿b万c”了;
3.把a、b、c分别转化成“X千X百X十”的格式,结果:x千x百x十x亿x千x百x十x万x千x百x十x;
4.小数部分转化成x角x分,这个就好做了

3.实现

话不多说 代码如下:

/**
 * 把汉字存起来,待会儿数字n的转化就是chineseNumb[n];
*/
let chineseNumb =['零','壹','贰','叁','肆','伍','陆','柒','捌','玖'];
/**
 * 辅助函数,用于把四位的字符串转成中文
 * @param str 输入的字符串
 * @param isBegin 是否是开头部分,开头部分和中间部分读法都不同 true||false
 * @returns {string} 四位字符串
 */
function turnToChinese(str,isBegin){
    let result = "";
    let numb = parseInt(str);
    if (numb === 0) {
        result = isBegin?"":"零";
    }else if(numb>0 && numb<10){
        //一位数 000x
        let g = chineseNumb[numb];
        result = result + (isBegin?""+g:"零"+g);
    }else if (numb>=10 && numb<100) {
        //两位数 00xx
        let s = chineseNumb[parseInt(numb/10)]+"拾";
        let g = (numb%10===0?"":chineseNumb[numb%10]);
        result = result +(isBegin?""+s+g:"零"+s+g);
    }else if(numb>=100 && numb<1000){
        //三位数 0xxx
        let b = chineseNumb[parseInt(numb/100)]+"佰";
        let s = (parseInt(numb%100/10)===0?"零":chineseNumb[parseInt(numb%100/10)]+"拾");
        let g = (numb%10===0?"":chineseNumb[numb%10]);
        result = result +(isBegin?""+b+s+g:"零"+b+s+g);
    }else{
        //四位数 xxxx
        let q = chineseNumb[parseInt(numb/1000)]+"仟";
        let b = (parseInt(numb%1000/100)===0?"零":chineseNumb[parseInt(numb%1000/100)]+"佰");
        let s = (parseInt(numb%100/10)===0?"零":chineseNumb[parseInt(numb%100/10)]+"拾");
        let g = (numb%10===0?"":chineseNumb[numb%10]);
        result = result +q+b+s+g;
    }
    return result.replace(/零零/,"零");
}
/**
 * 转换接口 传入字符串直接调用
 * @param str 需要传入的字符串
 * @returns {string} 返回的也是字符串
 */
function priceToChinese(str){
    //拆分成两部分,整数部分和小数部分
    let numb_array = str.split('.');
    //返回的结果
    let result = "";
    //获取到整数部分
    let intPart = numb_array[0];
    //整数部分长度
    let intPartLength = intPart.length;
    //只支持千亿级别的数据
    if (intPartLength>13) {
        alert("超出最大范围,请使用科学计数法");
    }
    if (intPartLength>9) {
        //亿的部分  n2亿
        let n2 = intPart.substring(intPartLength-12,intPartLength-8);
        if (parseInt(n2) !== 0) {
            result = result + turnToChinese(n2,true)+"亿";
        }
        //万的部分 n1万
        let n1 = intPart.substring(intPartLength-8,intPartLength-4);
        if (parseInt(n1) !==0) {
            result = result + turnToChinese(n1,false)+"万";
        }
        //少于一万的部分 n0
        let n0 = intPart.substring(intPartLength-4,intPartLength);
        result = result + turnToChinese(n0,false);

        //当0作为结尾时不需要显示这个“零”
        if (result.endsWith("零",result.length)) {
            result = result.substring(0,result.length-1);
        }
    } else if (intPartLength>4) {
        //万的部分 n1万
        let n1 = intPart.substring(intPartLength-8,intPartLength-4);
        if (parseInt(n1) !==0) {
            result = result + turnToChinese(n1,true)+"万";
        }
        //少于一万的部分 n0
        let n0 = intPart.substring(intPartLength-4,intPartLength);
        result = result + turnToChinese(n0,false);
        //当0作为结尾时不需要显示这个“零”
        if (result.endsWith("零",result.length)) {
            result = result.substring(0,result.length-1);
        }
    }else if(intPartLength<=4){
        //少于一万的部分 n0
        let n0 = intPart.substring(intPartLength-4,intPartLength);
        result = result + turnToChinese(n0,true);
        if (result.endsWith("零",result.length)) {
            result = result.substring(0,result.length-1);
        }
    }
    //如果以小数点分割后 只有整数部分||小数部分为0,拼接上 “圆整”,否则还应加上“角分”单位
    if (numb_array.length ===1) {
        return result+"圆整";
    }else{
		//获取小数部分 只要前两位,如果只有一位,则补全为两位
        let fp = (numb_array[1]+"0").substring(0,2);
		let floatPart = parseInt(fp);
        if (floatPart === 0) {
            return result + "圆整";
        }
        result = result + "圆";
        let j = parseInt(floatPart/10);
        result += chineseNumb[j]+"角";
        let fen = floatPart%10;
        result+=chineseNumb[fen]+"分";
        return result;
    }
}


4.github地址戳这里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值