/**
- 将数字转换为最高位为元的大写金额,支持小数点后两位,
- 例如 16000.50 会被转换为 "壹万陆仟元伍角整"
- @param {Number} num 数字
- @returns {String} 转换后的中文大写金额 */ export function convertNumberToChineseMoney (number) { // 非法数据判断 if (isNaN(number)) { return '非法数据!' }
// 大写数字 const CN_UPPER_NUMBER = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
// 数量级 const CN_UPPER_UNIT = ['', '拾', '佰', '仟']
// 整数部分 let integerPart = Math.floor(number)
// 小数部分 let decimalPart = Math.round((number - integerPart) * 100)
// 整数部分转换 let integerStr = '' let zeroFlag = false // 是否需要补零 for (let i = 0; integerPart > 0; i++) { const mod = integerPart % 10 // 取个位数 if (mod === 0) { if (zeroFlag) { // 补零 integerStr = CN_UPPER_NUMBER[0] + integerStr } } else { zeroFlag = false integerStr = CN_UPPER_NUMBER[mod] + CN_UPPER_UNIT[i % 4] + integerStr } zeroFlag = zeroFlag || mod === 0 integerPart = Math.floor(integerPart / 10) }
// 小数部分转换 let decimalStr = '' if (decimalPart > 0) { const decimalStrArr = decimalPart.toString().split('') decimalStr = decimalStrArr.map((numStr, index) => { const num = parseInt(numStr) if (num === 0) { return CN_UPPER_NUMBER[0] } else { return CN_UPPER_NUMBER[num] + CN_UPPER_UNIT[2 + index] } }).join('') }
// 拼接整数和小数部分
let result = integerStr + (decimalStr ? 元${decimalStr} : '元整')
return result }
/**
- 将整数或非负整数转换为中文大写数字
- @param {Number} num 要转换的数字
- @returns {String} 转换后的中文大写数字 */ export function convertNumberToChinese(num) { const chineseNums = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']; const chineseUnits = ['', '十', '百', '千', '万', '亿']; const MAX_NUM = 999999999999999; // 最大支持处理的数字 if (isNaN(num) || num > MAX_NUM) { // 检查输入数据是否合法 throw new Error('不支持的数字'); } if (num === 0) { // 特殊处理 0 的情况 return chineseNums[0]; } let chineseStr = ''; let digit = 0; // 当前位数 let prevIsZero = true; // 前一位是否为零 while (num > 0) { const unit = digit % 5; // 当前位数所在的单位,每 4 位为一个大单位 const numStr = chineseNums[num % 10]; if (numStr !== '零') { chineseStr = numStr + chineseUnits[unit] + chineseStr; prevIsZero = false; } else { if (prevIsZero || unit === 4) { // 处理多余的零和位数单位 chineseStr = chineseStr.slice(1); } chineseStr = '零' + chineseStr; prevIsZero = true; } num = Math.floor(num / 10); digit++; } return chineseStr; }