js 阿拉伯数字金额转换为中文数字金额

前言

最近遇到一个需求,需要把阿拉伯数字的金额如99.9元转换为中文数字金额玖拾玖元玖分。想了一下,感觉思绪有点混乱,就在网上找了下。方法有很多,择其一,根据自己的需求修改后,这里记录下来。大概思路如下:

1、声明需要用到的中文数字
// 汉字的数字
const cnNums = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'] 
// 基本单位
const cnIntRadice = ['', '拾', '佰', '仟'] 
// 对应整数部分扩展单位
const cnIntUnits = ['', '万', '亿', '兆'] 
// 对应小数部分单位
const cnDecUnits = ['角', '分', '毫', '厘']
// 整数金额时后面跟的字符
const cnInteger = '整' 
// 整型完以后的单位
const cnIntLast = '元' 
2、定义两个变量分别存储整数部分和小数部分
// 金额整数部分
let IntegerNum 
// 金额小数部分
let DecimalNum 

if (money.indexOf('.') === -1) {
  IntegerNum = money
  DecimalNum = ''
} else {
  const moneyArr = money.split('.')
  IntegerNum = moneyArr[0]
  DecimalNum = moneyArr[1].substr(0, 4)
}
3、将阿拉伯数字转为中文数字

这是整个流程的中心点和难点。大体的思路可分为:

  • 0~9的阿拉伯数字转换,通过数字下标匹配获取
for (let i = 0; i < IntegerNum.length; i++) {
// 通过遍历拿到整数部分的每一项
let term = IntegerNum.substr(i, 1)
// 转换数字,cnNums是存储了中文零到玖的数组,直接将阿拉伯数字作为下标获取中文数字
ChineseStr += cnNums[parseInt(term)]
}
  • 单位的获取
for (let i = 0; i < IntegerNum.length; i++) {
// 剩余待处理的数量
let surplus = IntLen - i - 1
// 用于获取整数部分的扩展单位
// 剩余数量除以4,比如12345,term为1时,expandUnit则为1,
// cnIntUnits[expandUnit]对应得到的单位为万
let expandUnit = surplus / 4
// 用于获取整数部分的基本单位
// 剩余数量取余4,比如123,那么第一遍遍历term为1,surplus为2,baseUnit则为2,
// 所以cnIntRadice[baseUnit]对应得到的基本单位为'佰'
let baseUnit = surplus % 4
// 基本单位转换之后直接加上
ChineseStr += cnNums[parseInt(term)] + cnIntRadice[baseUnit]
// 扩展单位要满足大单位进阶才加
// 同时满足以下两个条件则是大单位进阶
// 剩余数量是4的倍数,并且连续为0的数量不超过3个
if (baseUnit === 0 && zeroCount < 4) {
  ChineseStr += cnIntUnits[expandUnit]
}
}
完整代码:
function changeNumberMoneyToChinese (money) {
 // 接收数字或者字符串数字
 if (typeof money === "string") {
   if (money === '') return ''
   if (isNaN(parseFloat(money))) {
     throw Error(`参数有误:${money},请输入数字或字符串数字`)
   } else {
     // 去掉分隔符(,)
     money = money.replace(/,/g, '')
   }
 } else if (typeof money === "number") {
   // 去掉分隔符(,)
   money = money.toString().replace(/,/g, '')
 } else {
   throw Error(`参数有误:${money},请输入数字或字符串数字`)
 }
 // 汉字的数字
 const cnNums = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'] 
 // 基本单位
 const cnIntRadice = ['', '拾', '佰', '仟'] 
 // 对应整数部分扩展单位
 const cnIntUnits = ['', '万', '亿', '兆'] 
 // 对应小数部分单位
 const cnDecUnits = ['角', '分', '毫', '厘']
 // 整数金额时后面跟的字符
 const cnInteger = '整' 
 // 整型完以后的单位
 const cnIntLast = '元' 
 // 金额整数部分
 let IntegerNum 
 // 金额小数部分
 let DecimalNum 
 // 输出的中文金额字符串
 let ChineseStr = '' 
 // 正负值标记
 let Symbol = '' 
 // 转成浮点数
 money = parseFloat(money)
 // 如果是0直接返回结果
 if (money === 0) {
   ChineseStr = cnNums[0] + cnIntLast + cnInteger
   return ChineseStr
 }
 // 如果小于0,则将Symbol标记为负,并转为正数
 if (money < 0) {
   money = -money
   Symbol = '负 '
 }
 // 转换为字符串
 money = money.toString()
 // 将整数部分和小数部分分别存入IntegerNum和DecimalNum
 if (money.indexOf('.') === -1) {
   IntegerNum = money
   DecimalNum = ''
 } else {
   const moneyArr = money.split('.')
   IntegerNum = moneyArr[0]
   DecimalNum = moneyArr[1].substr(0, 4)
 }
 // 获取整型部分转换
 if (parseInt(IntegerNum, 10) > 0) {
   let zeroCount = 0
   let IntLen = IntegerNum.length
   for (let i = 0; i < IntLen; i++) {
     // 获取整数的每一项
     let term = IntegerNum.substr(i, 1)
     // 剩余待处理的数量
     let surplus = IntLen - i - 1
     // 用于获取整数部分的扩展单位
     // 剩余数量除以4,比如12345,term为1时,expandUnit则为1,
     // cnIntUnits[expandUnit]对应得到的单位为万
     let expandUnit = surplus / 4
     // 用于获取整数部分的基本单位
     // 剩余数量取余4,比如123,那么第一遍遍历term为1,surplus为2,baseUnit则为2,
     // 所以cnIntRadice[baseUnit]对应得到的基本单位为'佰'
     let baseUnit = surplus % 4
     if (term === '0') {
       zeroCount++
     } else {
       // 连续存在多个0的时候需要补'零'
       if (zeroCount > 0) {
         ChineseStr += cnNums[0]
       }
       // 归零
       zeroCount = 0
       /* 
       cnNums是汉字的零到玖组成的数组,term则是阿拉伯0-9,
       直接将阿拉伯数字作为下标获取中文数字
       例如term是0则cnNums[parseInt(term)]取的就是'零',9取的就是'玖'
       最后加上单位就转换成功了!
       这里只加十百千的单位
       */
       ChineseStr += cnNums[parseInt(term)] + cnIntRadice[baseUnit]
     }
     /*
       如果baseUnit为0,意味着当前项和下一项隔了一个节权位即隔了一个逗号
       扩展单位只有大单位进阶才需要,判断是否大单位进阶,则通过zeroCount判断
       baseUnit === 0即存在逗号,baseUnit === 0 && zeroCount < 4 意为大单位进阶
     */
     if (baseUnit === 0 && zeroCount < 4) {
       ChineseStr += cnIntUnits[expandUnit]
     }
   }
   ChineseStr += cnIntLast
 }
 // 小数部分转换
 if (DecimalNum !== '') {
   let decLen = DecimalNum.length
   for (let i = 0; i < decLen; i++) {
     // 同理,参考整数部分
     let term = DecimalNum.substr(i, 1)
     if (term !== '0') {
       ChineseStr += cnNums[Number(term)] + cnDecUnits[i]
     }
   }
 }
 ChineseStr = Symbol + ChineseStr
 return ChineseStr
}

最终结果:
在这里插入图片描述
阿拉伯数字金额转中文金额方法有很多种,至于这里为什么选择这一种,因为它跟我最初的想法有点相似,即通过数组匹配转换中文。
这里也感谢博主提供的思路,已点赞:)

THE END

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以回答这个问题。以下是将数字金额转换中文大写金额的JavaScript代码: ```javascript function convertToChineseNumeral(amount) { const chineseNumeral = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"]; const chineseUnit = ["", "拾", "佰", "仟"]; const chineseBigUnit = ["", "萬", "亿", "兆"]; let num = parseFloat(amount); let chineseAmount = ""; if (isNaN(num)) { return ""; } let isNegative = num < 0; if (isNegative) { num = -num; } let fraction = Math.round((num - Math.floor(num)) * 100); if (fraction == 0) { chineseAmount += "整"; } else { chineseAmount += chineseNumeral[Math.floor(fraction / 10)] + "角"; chineseAmount += chineseNumeral[fraction % 10] + "分"; } num = Math.floor(num); let unitIndex = 0; while (num > 0) { let currentUnit = ""; for (let i = 0; i < 4 && num > 0; i++) { let currentNumeral = num % 10; if (currentNumeral > 0) { currentUnit = chineseUnit[i] + currentUnit; currentUnit = chineseNumeral[currentNumeral] + currentUnit; } else if (currentUnit != "") { currentUnit = chineseNumeral[currentNumeral] + currentUnit; } num = Math.floor(num / 10); } if (currentUnit != "") { currentUnit += chineseBigUnit[unitIndex]; } chineseAmount = currentUnit + chineseAmount; unitIndex++; } if (chineseAmount == "") { chineseAmount = chineseNumeral[0]; } if (isNegative) { chineseAmount = "负" + chineseAmount; } return chineseAmount; } console.log(convertToChineseNumeral(123456789.01)); // 壹亿贰仟叁佰肆拾伍萬陆仟柒佰捌拾玖元零壹分 ``` 希望这个代码能帮到你。如果你有其它问题,欢迎继续询问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值