业务有个需求需要展示:xxx一,xxx二 这样的,搜了几个方法都有瑕疵,还是自己写一个吧:
/**
* @Description: 阿拉伯数字转中文小写
* @param {String, Number} num 要转化的数字
* @return {String} 转换后的中文小写
*/
export function formatNumberToChinese(num) {
// 1234
const basic = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']
const unit = ['', '十', '百', '千', '万', '十万', '百万', '千万', '亿']
const resArr = []
const numArr = parseInt(num.toString()).toString().split('') // ['1', '2', '3', '4'] parseInt字符串可以去掉数字开头的0
numArr.forEach((item, index) => {
/**
* 不需要数字的情况
* 1、10-19之间的数,不需要[一]
* 2、最后一位是0的不需要[零]
*/
const nonNeedNum_1 = (numArr.length === 2 && index === 0 && +item === 1)
const nonNeedNum_2 = (index === numArr.length - 1) && (+item === 0)
const basicRes = (nonNeedNum_1 || nonNeedNum_2) ? '' : basic[item]
/**
* 不需要单位的情况
* 1、当前数字是0,比如101,[一百零一],不需要[十]
*/
const nonNeedUnit_1 = (+item === 0)
const unitRes = nonNeedUnit_1 ? '' : unit[numArr.length - 1 - index]
// 拼接数字和单位
const curJoin = basicRes + unitRes
/**
* 如果结果数组的最后一位是[零]且当前也是[零],则不需要拼接
*/
const nonNeedJoin_1 = (resArr.slice(-1)[0] === '零') && (basicRes === '零') // 兼容 不用.at(-1)
if (!nonNeedJoin_1) {
resArr.push(curJoin)
}
})
const res = resArr.join('')
// 如果数字不是0而最后一位是[零]就得嘎掉
if (+num && res.substring(res.length - 1) === '零') {
return res.substring(0, res.length - 1)
}
return res
}
目前是没发现有对不上的情况,如果大家发现了请在评论中指出我去修复