发票数字转金额大写(保留两位小数)

发布时间 2023-07-28 18:07:39作者: lutwelve

数字金额转大写

/**
* description 数字转换成大写
* params: val => number
*/
function translateNumber(val) {
    if (!Number(val) || !val) return 0
    let num = 0
    let copyNum = []
    if (String(val).includes('.')) { // 存在小数点的情况
        copyNum = String(val).split('.')
        num = Number(copyNum[0])
    } else {
	num = Number(val)
	}
    const numStr = Number((num + '').replace(/[,,]*/g, '')) + ''
    num = parseInt(Number(numStr)) // 转为整数
    let capitalArr = '零壹贰叁肆伍陆柒捌玖拾'
    let unitArr = ['拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟'] // 单位
    const resArr = [] // 记录结果,后边json.in就可
    let index = numStr.length - 1 //记录位数
    let idu = 0 // 记录单位
    let decade = 10
    const capitalUp = (num, decade, index) => {
        const unit = num / decade
        const capital = capitalArr[Number(numStr[index])]
        if (unit < 1) {
            resArr.push(capital)
            // 出现一十一这种情况
            if (Number(numStr[index]) === 1 && (numStr.length === 2 || numStr.length === 6 || numStr.length === 10)) {
                resArr.pop()
            }
            return false
        } else {
            if (capital === '零') {
                // 万、亿单位不删除
                if (!['万', '亿'].includes(resArr[resArr.length - 1])) {
                    resArr.pop()
                }
                // 前面有零再删掉一个零
                if (resArr[resArr.length - 1] === '零') {
                    resArr.pop()
                }
            }
            resArr.push(capital)
            // 过滤存在 零万、零亿 这种情况
            if (['万', '亿'].includes(resArr[resArr.length - 2]) && capital === '零') {
                resArr.pop()
            }
            // 过滤 1亿万 这种情况
            if (resArr[0] === '万' && resArr[1] === '亿') {
                resArr.shift()
            }
            // 末尾 零 删掉
            if (resArr[0] === '零') {
                resArr.pop()
            }
            resArr.push(unitArr[idu++])
            capitalUp(num, decade * 10, --index)
        }
    }
    capitalUp(num, decade, index)
    let afterBox = []
    if (copyNum.length) { // 拼接角和分
        const strAfter = copyNum[1].substring(0, 2).split('')
        strAfter.forEach((i, index) => {
            const shuZhi = capitalArr[Number(i)]
            if (index === 0) {
                if (shuZhi !== '零') {
                    afterBox.push(shuZhi)
                    afterBox.push('角')
                }
            } else if (index === 1) {
                if (shuZhi !== '零') {
                    afterBox.push(shuZhi)
                    afterBox.push('分')
                }
            }
        })
    }
    return resArr.reverse().join('') + '元' + afterBox.join('')
}