在之前常用的金额数字的格式化方法 里边有金额数字的格式化,以及阿拉伯数字转为中文大写金额数字的方法,在一些使用中文小写数字的时候就不适用,这里将方法进行了扩展使用更加完善
代码直接放到下方,可以直接封装成一个numberToChineseUpper.js 文件,使用时直接引入到相应的地方
注意:该处理有包含 是否去除10~20的前缀,例如:一十改为十, 11转为 一十一改为 十一 这样的格式处理
注意注释部分内容
/**
* 阿拉伯数字转换为中文数字(包含大写数字)
* @param {Number} money 需要转换的数字
* @param {Boolean} isUppercase 是否采用大写
* @param {Boolean} isMoney 是否金额
* @param {Boolean} isDeletePre 是否去除10~20的前缀,例如:一十改为十, 11转为 一十一改为 十一
* @returns 汉字数字
*/
const numberToChineseUpper = (money = 0, isUppercase = false, isMoney = false, isDeletePre = true) => {
// 汉字的数字
let cnNums = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']
if (isUppercase) {
cnNums = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
}
// 基本单位
let cnIntRadice = ['', '十', '百', '千']
if (isUppercase) {
cnIntRadice = ['', '拾', '佰', '仟']
}
// 对应整数部分扩展单位
const cnIntUnits = ['', '万', '亿', '兆']
// 对应小猪部分单位
const cnDecUnits = ['角', '分', '毫', '厘']
// 整数金额时后面跟的字符
const cnInteger = '整'
// 整数结束时的单位
const cnIntLast = '圆'
// 最大处理的数字, 纯数字可能失去精度问题,用字符串
const maxNum = '99999999999999.9999'
// 金额整数部分
let integerNum
// 金额小数部分
let decimaNUm
// 输出的中文金额字符串
let chineseStr = ''
// 分离金额后用的数组,预定义
let parts
if (money === '') {
return ''
}
money = parseFloat(money)
if (money >= Number(maxNum)) {
// 超出最大处理数字
return '超出最大处理数字'
}
if (money === 0) {
if (isMoney) {
chineseStr = cnNums[0] + cnIntLast + cnInteger
} else {
chineseStr = cnNums[0]
}
return chineseStr
}
// 转换为字符串
money = money.toString()
if (money.indexOf('.') === -1) {
integerNum = money
decimaNUm = ''
} else {
parts = money.split('.')
integerNum = parts[0]
// 小数点后最多取4
decimaNUm = parts[1].substr(0, 4)
}
// 获取整型部分
if (parseInt(integerNum, 10) > 0) {
let zeroCount = 0
for (let i = 0; i < integerNum.length; i++) {
const n = integerNum.substr(i, 1)
const p = integerNum.length - i - 1
const q = p / 4
const m = p % 4
if (n === '0') {
zeroCount++
} else {
if (zeroCount > 0) {
chineseStr += cnNums[0]
}
// 归零
zeroCount = 0
chineseStr += cnNums[parseInt(n)] + cnIntRadice[m]
}
if (m === 0 && zeroCount < 4) {
chineseStr += cnIntUnits[q]
}
}
if (isMoney) {
chineseStr += cnIntLast
}
}
// 小数部分
if (decimaNUm !== '') {
for (let i = 0; i < decimaNUm.length; i++) {
const n = decimaNUm.substr(i, 1)
if (n !== '0') {
if (isMoney) {
chineseStr += cnNums[Number(n)] + cnDecUnits[i]
} else {
chineseStr += cnNums[Number(n)]
}
}
}
}
if (chineseStr === '') {
if (isMoney) {
chineseStr += cnNums[0] + cnIntLast + cnInteger
} else {
chineseStr += cnNums[0]
}
} else if (decimaNUm === '') {
if (isMoney) {
chineseStr += cnInteger
}
}
// 10~20之间数字特殊处理,例如:一十改为十, 11转为 一十一改为 十一
if (isDeletePre && money >= 10 && money < 20) {
return chineseStr.replace(/^(一|壹)/, '')
}
return chineseStr
}
export default numberToChineseUpper