分享

js转换汉字金额

/**
 * 数字转金额
 * @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 || '元整')
}

留言

您的电子邮箱地址不会被公开。 必填项已用 * 标注