去年面试的时候一道笔试题,让我当场写出来。奈何初出茅庐,经验有限,于是折戟沙场。那是我便暗暗记住,终有一天要将它斩在手下。最近闲来无事,试了一下,感觉没那么难了,话不多说,上代码!
/**
* @desc 转为汉字大写
* @param s { string|number } 输入的数字
* @return { string } 大写 汉字
*/
const chinaDx = function (s) {
const digit = ['零', '壹', '贰', '叁', '肆',
'伍', '陆', '柒', '捌', '玖']
return digit[Number(s)]
}
const toChnUpperCase = function (number) {
if (typeof number !== 'number') return '数据错误'
let translateStr = '' // 结果字符串
let decimalStr = '' // 小数点后的部分
// console.log(number)
var unit = ['圆', '拾', '佰', '仟', '万', '拾', '百', '千', '亿', '拾']
const decimalUnit = ['角', '分', '厘']
let splitNumber = (number + '').split('.')
const str = splitNumber[0] // 整数部分
const decimal = splitNumber[1] ?? [] // 小数部分
const isInteger = !decimal.length // 判断是否为整数
/*
循环整数部分,从最后一位开始循环
定义循环变量
*/
let i = str.length - 1,
j = 0
while (i > -1) {
var c = str[i]
// 整数部分追加,直接赋值是往后追加
translateStr = chinaDx(c) + unit[j] + translateStr
i--
j++
}
translateStr = translateStr.replace(/^壹拾/, '拾')
/*
循环小数部分
*/
for (let i = 0; i < decimal.length; i++) {
const d = decimal[i]
decimalStr += chinaDx(d) + decimalUnit[i]
}
isInteger ? translateStr += '整' : translateStr
return translateStr + decimalStr
}
有啥问题欢迎大家留言讨论