参考juejin.cn/post/705676… 写的水文章
// 划分整数和小数部分
let arr = num.toString().split('.')
// 处理小数部分
let decimal = ''
let number = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']
if (arr[1]) {
decimal = '点' + [...arr[1]].map(item => number[item]).join('')
}
// 处理整数部分
let unit = ['', '万', '亿']
// 反转字符串
let str = arr[0].toString().split('').reverse().join('')
let arr4 = []
// 从低位开始划分,四个为一组
for (let i = 0; i < str.length;) {
arr4.push(fourNumToChinese(str.slice(i, i + 4)))
i += 4
}
// 拼接单位
let result = ''
for (let i = 0; i < arr4.length; i++) {
// arr4的返回值存在以下几种情况,比如:
// 零四百五十
// 一千五百八十
// 空字符串
// 前面两种情况可直接拼接单位,
// 为空字符串时:
// [ "零一十二", "", "一百" ] => 一百亿零一十二, 空字符串是需要忽略的,不需要添加单位也不需要拼接
// 0 => [''], 没有arr4[i+1],不能忽略
if (!arr4[i] && i == arr4.length - 1) {
result = '零'
}
if (!arr4[i]) continue
// 数字+单位+result
result = arr4[i] + unit[i] + result
}
return result + decimal
}
// 4321 => 一千二百三十四
function fourNumToChinese(str) {
let unit = ['', '十', '百', '千']
let number = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']
let result = ''
for (let i = 0; i < str.length; i++) {
//去除重复0,只保存一个零
if (i > 0 && str[i] == '0' && str[i - 1] == '0') {
continue
}
// 如果当前为0,则不需要添加单位
// 一千零百三十 => 一千零三十
if (str[i] == '0') {
result = number[str[i]] + result
} else {
// 数字+单位+result
result = number[str[i]] + unit[i] + result
}
}
// 1000: 一千零
// 去除末尾零
if (result[result.length - 1] == '零') {
let arr = result.split('')
arr.pop()
result = arr.join('')
}
// 11 : 一十一,去除首部一
if (str.length == 2 && str[1] == '1') {
let arr = result.split('')
arr.shift()
result = arr.join('')
}
return result
}
let arr1 = [0, 1.987, 10, 10000000001, 133, 1030, 10405, 10450, 10400]
arr1.forEach(item => console.log(toChinese(item)))