JavaScript将数字转换为中文

前端在业务开发中经常会遇到将数字转换为中文的需求,例如:

  • 有序列表循环使用一、二、三代替1、2、3
  • 人民币数字转中文大写圆角分
第一种情况当条目少的时候可以写死,但是当条目不固定且条目多的时候,就需要有通用的转换方法,第二种情况更不用多说了,下面是我自己实现转换方法的代码示例,以转人民币大写为例。
思路如下:
  1. 中文位数:个、十、百、千、万、十万、百万、千万、亿、十亿、百亿、千亿、万亿、十万亿......
  2. 通过上面的规律,按照每四位拆分,【个、十、百、千】(个),【个、十、百、千】(万),【个、十、百、千】(亿),【个、十、百、千】(万亿)
  3. 每四位拆分后的大节点是【个、万、亿、万亿】,则大节点前面的小节点统一为【个、十、百、千】
  4. 每一位数字都有0-9十个数
const moneyToCN = (money) => {
  // NaN !== NaN
  if (Number(money) !== Number(money)) {
    return money
  }
  // 大数位,每四位一节
  const cnFigure = ['', '万', '亿', '万亿']
  // 中文数字0-9
  const cnInteger = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
  // 十进制计数“个十百千”
  const cnDecimalism = ['', '拾', '佰', '仟']
  // 先转为字符串
  const string = money + ''
  // 小数点分割
  const numbers = string.split('.')
  const integerPart = numbers[0]
  const decimalPart = numbers[1]
  // 整数部分位数
  const len = integerPart.length
  // 四位分节
  const pitch = Math.ceil(len / 4)
  const array = []
  // 分为每四位一节,从低位向高位分
  for (let index = 0; index < pitch; index++) {
    array.push(integerPart.slice((len - (index + 1) * 4 < 0) ? 0 : (len - (index + 1) * 4), len - index * 4))
  }
  // 将四位一节的数字转换为对应的中文,拼接上大数位,比如(一千一百一十一)(万),“一千一百一十一万”
  const cnArray = array.map((figure, index) => {
    const cn = figure.split('').map((char, i) => {
      return char === '0' ? '零' : (cnInteger[Number(char)] + cnDecimalism[figure.length - i - 1])
      // replace末尾的所有“零”,例如“壹仟零零零”变成“壹仟”;再replace中间的多个零,例如“壹万零零零玖”变成“壹万零玖”
    }).join('').replace(/\u96f6+$/, '').replace(/\u96f6+/g, '\u96f6')
    // 防止出现“零零零零”变成“”之后再加大数位,例如“(零零零零)万”变成“万”
    return cn.length ? (cn + cnFigure[index]) : (cnFigure[index] ? '零' : '')
  }).reverse()
  // 整数,替换掉中间连续的“零”,例如“一万亿零(亿)零(万)一千”变为“一万亿零一千”,最后可加上.replace(/^\u4e00\u5341/, '\u5341'),将“一十****”变为“十****”
  const integerCN = cnArray.join('').replace(/\u96f6+/g, '\u96f6')

  let decimalCN = ''
  if (!decimalPart || decimalPart === '0' || decimalPart === '00') {
    decimalCN = '整'
  } else {
    const [p0, p1] = decimalPart.split('')
    decimalCN = (p0 === '0' ? '零' : (cnInteger[Number(p0)] + '角')) + (!p1 || p1 === '0' ? '' : (cnInteger[Number(p1)] + '分'))
  }

  return `${integerCN || '零'}${decimalCN}`
}
复制代码

转载于:https://juejin.im/post/5cb97123518825327f54f22d

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值