zoukankan      html  css  js  c++  java
  • JS实现一个数转换成大写数字

    适用场景:票据,结算凭证等。
    将任意数字的金额,转换成汉字大写的形式。
    例如:1234.50 -> 壹仟贰佰叁拾肆圆伍角。
    壹、贰、叁、肆
     1     //把小数前的数分成4位处理,不足位添0,例如:123456 => 0012,3456
     2     if (!Number.prototype.cutNum) {
     3         Number.prototype.cutNum = function () { //判断Number对象是否有cutNum方法
     4             let num = '' + this; //this指需要转换的数,然后由number类型转为string类型
     5             let len = Math.ceil(num.length/4);
     6             let arr = [];
     7             let v_len = num.length;
     8             while (len > 0){
     9                 let cut_start = v_len -4 > 0 ? v_len-4 : 0;
    10                 let cut_len = v_len -4 > 0 ? 4: v_len;
    11                 let v = num.substr(cut_start,cut_len);
    12                 if(v.length != 4){
    13                     arr.push('0'.repeat(4 - v.length) + v);
    14                 }else{
    15                     arr.push(v);
    16                 }
    17                 len--;
    18                 v_len -= 4;
    19             }
    20             return arr.length != 1 ? arr.reverse().join(',') : '' + arr;
    21         }
    22     }
    23     if (!Number.prototype.numToChinese) {
    24         Number.prototype.numToChinese = function () {
    25             //有小数点的分为两部分:小数前的数firstPart和小数后的数secondPart,小数前的数进行cutNum方法处理
    26             //如果小数前的数不足4位,添0补位
    27             let $this = '' + this,
    28                 firstPart = '',
    29                 secondPart = '';
    30             if(/./.test($this)){
    31                 let arrPre = $this.split('.');
    32                 firstPart = arrPre[0];
    33                 if(firstPart.length > 12){
    34                     return '数字不能超过仟亿';
    35                 }
    36                 secondPart = arrPre[1];
    37                 if(secondPart.length > 2){
    38                     return '小数点后的数字不能超过2位';
    39                 }
    40             }else{
    41                 firstPart = $this;
    42             }
    43             //第一部分:处理小数前的数
    44             let firstPartArr = [];
    45             if(firstPart.length > 4){
    46                 firstPartArr = parseInt(firstPart).cutNum().split(','); //firstPart是字符串类型
    47             }else {
    48                 firstPartArr = firstPartArr.concat('0'.repeat(4-firstPart.length) + firstPart);
    49             }
    50             const arrMap = [['0','零'],['1','壹'],['2','贰'],['3','叁'],['4','肆'],
    51                             ['5','伍'], ['6','陆'],['7','柒'],['8','捌'],['9','玖']],
    52                 unit = ['仟','佰','拾',''];
    53             let map = new Map(arrMap), //创建Map对象
    54                 splitAddUnit = [], //存放4位分割后的单位
    55                 returnArr = []; //最终返回的值
    56             if(firstPartArr.length == 3){
    57                 splitAddUnit = ['亿','万'];
    58             }else if(firstPartArr.length == 2){
    59                 splitAddUnit = ['万'];
    60             }else{
    61                 splitAddUnit = [''];
    62             }
    63             for(let k = 0; k < firstPartArr.length; k++){
    64                 for(let j = 0; j < firstPartArr[k].length; j++){
    65                     if(firstPartArr[k][j] != 0){
    66                         //利用Map对象映射相应的值
    67                         returnArr.push(map.get(firstPartArr[k][j]) + unit[j]);
    68                     }
    69                 }
    70                 if(splitAddUnit[k]){
    71                     returnArr.push(splitAddUnit[k]);
    72                 }
    73             }
    74             returnArr.push('元');
    75             //第二部分:处理小数后的数
    76             if(secondPart){
    77                 if(/^0+$/.test(secondPart)){ //小数后的数全为0时
    78                     returnArr.push('整');
    79                 }else{
    80                     const pointAfterUnit = ['角','分'];
    81                     for(let j = 0; j < secondPart.length; j++){
    82                         let val = map.get(secondPart[j]) + pointAfterUnit[j];
    83                         returnArr.push(val);
    84                     }
    85                 }
    86             }else{
    87                 returnArr.push('整');
    88             }
    89             return returnArr.join('');
    90         }
    91     }
    92     (1234660.12).numToChinese(); //number类型需要加圆括号

    这题来源于一个前端交流群(328336346,此群风气正,管理赞,推荐),开始花了半个小时写,发现比想象的难,放弃还是坚持?犹豫了一会儿,选择苦逼的想思路吧,后来想起上一篇文章“JS实现千位分隔符”能用上场了,前前后后花了4个小时写出该方法,然后就分享一下啦。(写的不怎么好,欢迎吐糟!)

  • 相关阅读:
    Direct2D 几何计算和几何变幻
    ORACLE触发器具体解释
    HI3518E用J-link烧写裸板fastboot u-boot流程
    NYOJ
    使用ServletFileUpload实现上传
    再看数据库——(2)视图
    cookie登录功能实现
    耗时输入框
    Android开发 ----------怎样真机调试?
    Windows搭建Eclipse+JDK+SDK的Android --安卓开发入门级
  • 原文地址:https://www.cnblogs.com/belongto/p/8298807.html
Copyright © 2011-2022 走看看