题解 | #数组分组#

人民币转换

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}`)
}




全部评论

相关推荐

11-06 12:53
吉林大学 Java
如题,ip属地末九,计算机科班大三本科生。想找一段寒假实习,也是第一次找实习。&nbsp;从大二暑假7月开始准备Java后端,前期有点磨叽,导致现在手忙脚乱。目前第二个项目黑马点评快写完了,第一个项目是苍穹外卖(两个项目都是烂大街的,这就很头大)。算法题在lc上从大二至今陆续刷了将近六百题,hot100已过一遍,面试150目前刷了一半。八股刚看了不到一周,想请教一下各位牛友,这一版简历哪些地方需要继续改进,接着优化?&nbsp;同时,是现在立即开始投递,边投边背八股,完善项目。还是说八股再背个小半个月再开始投递比较好一点,我现在担心的是到了这个月下旬或者12月再开始投递简历面试会有点晚,听同学说到年底hc数量会大...
mikeu04:简历顶部留名字即可,你写“后端开发实习生-Java”就是把自己的方向限制死了。我建议把这揉在个人简介里,说你对后端开发充满热情就行。性别出生年份以及微信号不是必须的。 把个人简介从教育背景里拿出来,第一个写。你的个人简介有点太泛了。把“爱好中长跑”去了,加点数字(“拥有xxx年的xxx经历”),加点你最熟的几个语言或技术栈。和别人的简介区分开来。 专业技能放项目经历前面。面试官一般会优先看这个再往下看你做了什么项目来考察你是否具备这些技能。实习我不是很清楚,但像Redis, JVM, 消息模型,计算机网络这些属于基本知识。你如果了解GCP, AWS, Docker 这些实际生产工具就可以把八股知识换掉。 项目简介可以和工作内容揉在一起。项目简介还是太长了,就一句话,“开发了一个基于【1,2个主要框架】为【目标客户群体】的【产品类型】, 实现了【产品价值】”。产品价值不是功能。比如一个在线计算器,它的功能是算数,但它的价值可以是让人在没带计算器的情况下算数(可访问性)或比手算效率提升了80%。工作内容多加点数字,你这个产品有多少人用了?浏览量是多少?技术上xxx性能提升了多少%?(实在想不出来就丢给deepseek :) 11 月理论上秋招已经结束了。八股是背不完的。无脑投,刷笔试,中了面试邀请就突击面经八股,没问题的。
大厂面试问八股多还是项目...
点赞 评论 收藏
分享
评论
3
1
分享

创作者周榜

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