js转换汉字金额

原文链接: https://blog.learnzs.com/2021/08/01/277/

/**
 * 数字转金额
 * @param {number} value
 * @return {string|*}
 */
function convertNumberToMoney (value) {
  if (isNaN(value)) return ''
  return value.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,')
}

/**
 * 数字转大写金额
 * @param {number} value
 * @return {string}
 */
function convertMoneyToChinese(value) {
  const digitArr = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
  const digitUnitArr = ['', '万', '亿']
  const digitSuffixArr = ['', '拾', '佰', '仟']

  // 整数部分
  const integerValueArr = String(Math.trunc(Math.abs(value)).split('')

  if (integerValueArr.length > 12) {
    throw new Error('超出最大可转换金额')
    return '超出最大可转换金额'
  }

  // 分割
  const unitValueArr = []
  integerValueArr.reverse().forEach((item, i, arr) => {
    if (unitValueArr.length === 0) {
      unitValueArr.push([item])
      return
    }
    const lastUnitItem = unitValueArr[unitValueArr.length - 1]
    if (lastUnitItem.length < 4) {
      lastUnitItem.push(item)
    } else {
      unitValueArr.push([item])
    }
  })

  // 转换
  const clearZero = (val) => val.reverse().join('').replace(/零{2,}/g, '零').replace(/(.+)(零$)/g, '$1')
  const integerResult = clearZero(unitValueArr.map((_, i) => {
    const unitValue = clearZero(_.map((_item, _index) => {
        if (+_item === 0) {
          return digitArr[_item]
        }
        return digitArr[_item] + digitSuffixArr[_index]
      }))
    return unitValue + (unitValue !== '零' ? digitUnitArr[i] : '')
  }))

  // 小数部分
  let decimalResult = ''
  if(value - Math.trunc(value) > 0) {
    const decimalArr = value.toFixed(2).substring(value.toFixed(2).indexOf('.') + 1).split('')
    decimalResult = `元零${digitArr[decimalArr[0]]}`
    if(decimalArr.length > 1){
      decimalResult += `${digitArr[decimalArr[1]]}`
    }
  }

  // 负数
  const isMinus = value < 0

  return (isMinus ? '负' : '') + integerResult + (decimalResult || '元整')
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值