题解 | #数组分组#

人民币转换

http://www.nowcoder.com/practice/00ffd656b9604d1998e966d555005a4b

将数字用.切割,整数部分 + 小数部分 整数部分 以4为单位切割,遍历得到中文。

举个例子: 1234 1后面 + '仟' 2后面 + '佰' 这个就是以‘1234’的长度决定的。

那什么时候加‘万’,’亿‘呢?

用整个数字的长度 / 4 向上取整, 遍历, 分为’亿‘,‘万’,‘个‘

let length = Math.ceil(num.length / 4);

(length - i )% 3 == 0 即为 ’亿‘,2 即为 ’万‘,1 为 ‘个‘ 省略不写

当中文没有出现'零' 则遇到‘0‘添加'零',

当出现 '零万' 则 替换为 ‘万零’

比如10001000 中文为'壹仟零万壹仟‘ 应该是’壹仟万零壹仟‘

let line;

function getFirst(num){
    let length = Math.ceil(num.length / 4);
    let first = num.length % 4 == 0 ? 4 : num.length % 4
    let explain = '';
    let hasAdd = false
    let canAdd = hasZero(num)
   
    for(let i = 0;i< length;i++){
        hasAdd = explain.indexOf('零') > -1
        let cur = num.substring(first+(i-1)*4,first + (i)*4);
      
        let str = getChina(cur,length - i,canAdd,hasAdd);
         explain+= str
    }
    return explain
}
function getNext(num){
    let explain = '';
    let chinaArr = '壹,贰,叁,肆,伍,陆,柒,捌,玖'.split(',');
    if(Number(num) == 0){
        explain+='整'
    }else{
        let arr = num.split('');
        let index = 0
        for(let i of arr){
        if(i != '0' && index == 0){
               explain+=chinaArr[(Number(i) - 1)] + '角'
          }else if(i != '0' && index == 1){
               explain+=chinaArr[(Number(i) - 1)] + '分'
          }
            index++
        }
    }
    return explain
}
function hasZero(num){
    let flag = false
     if(num.length == 1){
            flag = false
        }else{
             flag =  num.includes('0')
      }
    return flag
}
function getChina(num,stage,canAdd,hasAdd){
    let chinaArr = '壹,贰,叁,肆,伍,陆,柒,捌,玖'.split(',');
    let arr = num.split('');
    let str = ''
    let step = arr.length
    for(let i of arr){
        if(i != '0'){
            if(step == 4){
            str+=chinaArr[(Number(i) - 1)] + '仟'
            }else if(step == 3){
                str+=chinaArr[(Number(i) - 1)] + '佰'
            }else if(step == 2){
                if((Number(i) - 1)!=0){
                    str+=chinaArr[(Number(i) - 1)] + '拾'
                }else{
                    str+= '拾'
                }
                
            }else if(step == 1){
                str+=chinaArr[(Number(i) - 1)]
            }
        }else{
            if(canAdd && !hasAdd ){
               str+= '零'
               hasAdd = true
            }
        }
        step--
    }
    if(stage % 3 == 0){
        str+='亿'
    }else if(stage % 3 == 2 ){
        str+='万'
    }
//     console.log(str)
    str = str.replace('零万','万零')
    return str
}

while(line = readline()){
    let numArr = line.split('.');
//     两位但是后面的不是零      
    let fisrt = getFirst(numArr[0]);
    let next =  getNext(numArr[1]);
    let hasYuan = numArr[0].length > 1 || numArr[0].length == 1 && Number(numArr[0]) !=0
    console.log(`人民币${fisrt}${hasYuan ?'元':''}${next}`)
}




全部评论

相关推荐

不愿透露姓名的神秘牛友
07-08 10:39
一个证都没&nbsp;我能填什么
程序员小白条:别人有,你为什么没有,还是这个道理,社会就是比较,竞争,淘汰,你要安逸,那么就要做好淘汰的准备
点赞 评论 收藏
分享
06-13 17:33
门头沟学院 Java
顺序不记了,大致顺序是这样的,有的相同知识点写分开了1.基本数据类型2.基本数据类型和包装类型的区别3.==和equals区别4.ArrayList与LinkedList区别5.hashmap底层原理,put操作时会发生什么6.说出几种树型数据结构7.B树和B+树区别8.jvm加载类机制9.线程池核心参数10.创建线程池的几种方式11.callable与runnable区别12.线程池怎么回收线程13.redis三剑客14.布隆过滤器原理,不要背八股,说说真正使用时遇到了问题没有(我说没有,不知道该怎么回答了)15.堆的内存结构16.自己在写项目时有没有遇见过oom,如何处理,不要背八股,根据真实经验,我说不会17.redis死锁怎么办,watchdog机制如何发现是否锁过期18.如何避免redis红锁19.一个表性别与年龄如何加索引20.自己的项目的QPS怎么测的,有没有真正遇到大数量表21.说一说泛型22.springboot自动装配原理23.springmvc与springboot区别24.aop使用过嘛?动态代理与静态代理区别25.spring循环依赖怎么解决26.你说用过es,es如何分片,怎么存的数据,1000万条数据怎么写入库中27.你说用limit,那么在数据量大之后,如何优化28.rabbitmq如何批次发送,批量读取,答了延迟队列和线程池,都不对29.计网知不知道smtp协议,不知道写了对不对,完全听懵了30.springcloud知道嘛?只是了解反问1.做什么的?短信服务,信息量能到千万级2.对我的建议,基础不错,但是不要只背八股,多去实际开发中理解。面试官人不错,虽然没露脸,但是中间会引导我回答问题,不会的也只是说对我要求没那么高。面完问我在济宁生活有没有困难,最快什么时候到,让人事给我聊薪资了。下午人事打电话,问我27届的会不会跑路,还在想办法如何使我不跑路,不想扣我薪资等。之后我再联系吧,还挺想去的😭,我真不跑路哥😢附一张河科大幽默大专图,科大就是大专罢了
查看30道真题和解析
点赞 评论 收藏
分享
评论
3
1
分享

创作者周榜

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