最近有个需求,要把一个整数用中文计数的形式展现出来。本喵第一反应就是看文档,接口有这个字段吗?答案是没有。
第二反应,就立马跑到我们高颜值的产品小姐姐跟前,在各种嘘寒问暖之后,终于切入正题,“你这么漂亮,让后端小哥哥帮忙加个字段呗,他一定能答应!”
“小哥哥说,你想多了,没这字段!还有,这是前端展示相关,逻辑不归老子写!!老子要改bug去了!!!”。
“那个小姐姐,这个你看这个需求能不能不这么……”
“不行,这是老板说要做的!”
既然你们都这样,那我只能拼老命打开了code editor,开始弹起了键盘。
可能你们会觉得奇怪,阿拉伯数字转汉字很难吗?汉字从零到兆,也就15个汉字而已,一一对应不就行了?大不了就是出现什么“五八万十六”这种扯淡的翻译呗……
言归正传,看看这几个数字吧:
10 十
100 一百
11 十一
101 一百零一
111 一百一十一
10101 一万零一百零一
10011001 一千零一万一千零一
这是需求里提到的翻译标准:
- 最大到九千九百九十九万九千九百九十九亿九千九百九十九万九千九百九十九兆九千……,
- “一十”开头的话,隐藏开头的“一”,
- 在适当的时候要加上“零”,“一百一”这种是错误的。
最大那段就当没看到吧,反正最大量级到“兆”就对了。
话不多说,上代码:
const CN = [{base: 0, cn: '零'}, {base: 1, cn: '一'}, {base: 1, cn: '二'}, {base: 1, cn: '三'}, {base: 1, cn: '四'}, {base: 1, cn: '五'}, {base: 1, cn: '六'}, {base: 1, cn: '七'}, {base: 1, cn: '八'}, {base: 1, cn: '九'}, {base: 10, cn: '十'}, {base: 100, cn: '百'}, {base: 1000, cn: '千'}, {base: 10000, cn: '万'}, {base: 100000000, cn: '亿'}, {base: 10000000000000000, cn: '兆'}] Number. = function (i = CN.length - 1, emitLeadingOne = true) { if (this < 10) { return CN[this].cn } let a = Ma(this / CN[i].base) let b = this % CN[i].base let c = b.toCN(i - 1, emitLeadingOne && a == 0) if (a > 0) { let d = a.toCN() if (emitLeadingOne && i == 10 && a == 1) { d = '' } if (b > 0) { if (String(CN[i].base).length - String(b).length > 1) { return d + CN[i].cn + CN[0].cn + c } else { return d + CN[i].cn + c } } else { return d + CN[i].cn } } else { return c } }真的很佩服自己,来试试结果吧:
完美!
本文代码可随意使用,文章转载请标明来源,谢谢!