Js金额转换

1 篇文章 0 订阅
1 篇文章 0 订阅

最近在做项目,前端涉及到金额转换,***分转元、元转分、转换为中文大写金额、格式化3位一个逗号***整理了一下,分享给大家!


/**
 * 分转化为元 - 正则解决精度
 * @param {Number} fen
 */
export const fenToYuan = (fen) => {
  let num = fen
  num = fen * 0.01
  num += ''
  const reg = num.indexOf('.') > -1 ? /(\d{1,3})(?=(?:\d{3})+\.)/g : /(\d{1,3})(?=(?:\d{3})+$)/g
  num = num.replace(reg, '$1')
  num = toDecimal2(num)
  return num
}

/**
 * 元转分 - 解决精度问题 yuan:要转换的钱,单位元; digit:转换倍数
 * @param {Number} yuan
 * @param {Number} digit
 */
export const yuanToFen = (yuan, digit) => {
  let m = 0
  const s1 = yuan.toString()
  const s2 = digit.toString()
  if (s1.indexOf('.') !== -1) {
    m += s1.split('.')[1].length
  }
  if (s2.indexOf('.') !== -1) {
    m += s2.split('.')[1].length
  }
  return Number(s1.replace('.', '')) * Number(s2.replace('.', '')) / Math.pow(10, m)
}

/**
 * 判断是否最多两位小数,正负均可
 * @param inputNumber
 */
export const checkTwoPointNum = (inputNumber) => {
  const patten = /^-?\d+\.?\d{0,2}$/
  return patten.test(inputNumber)
}

/**
 * 强制保留2位小数,如:2,会在2后面补上00.即2.00
 * @param x
 */
export const toDecimal2 = (x) => {
  let f = parseFloat(x)
  if (isNaN(f)) {
    return false
  }
  f = Math.round(x * 100) / 100
  var s = f.toString()
  var rs = s.indexOf('.')
  if (rs < 0) {
    rs = s.length
    s += '.'
  }
  while (s.length <= rs + 2) {
    s += '0'
  }
  return s
}

/**
 * 金额转为大写汉字
 * @param money
 */
export const priceUppercase = (money) => {
  // 汉字的数字
  const cnNumbs = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
  // 基本单位
  const cnIntRadices = ['', '拾', '佰', '仟']
  // 对应整数部分扩展单位
  const cnIntUnits = ['', '万', '亿', '兆']
  // 对应小数部分单位
  const cnDecUnits = ['角', '分', '毫', '厘']
  // var cnInteger = '整'; //整数金额时后面跟的字符
  // 整型完以后的单位
  let cnIntLast = '元'
  // 最大处理的数字
  const maxNum = 999999999999999.9999
  // 额整数部分
  let IntegerNum
  // 金额小数部分
  let DecimalNum
  // 输出的中文金额字符串
  let ChineseStr = ''
  // 分离金额后用的数组,预定义
  let parts
  if (money === '') {
    return ''
  }
  money = parseFloat(money)
  if (money >= maxNum) {
    // $.alert('超出最大处理数字');
    return ''
  }
  if (money === 0) {
    // ChineseStr = cnNumbs[0]+cnIntLast+cnInteger;
    ChineseStr = cnNumbs[0] + cnIntLast
    // document.getElementById('show').value=ChineseStr;
    return ChineseStr
  }
  // 转换为字符串
  money = money.toString()
  if (money.indexOf('.') === -1) {
    IntegerNum = money
    DecimalNum = ''
    cnIntLast = '元整'
  } else {
    parts = money.split('.')
    IntegerNum = parts[0]
    DecimalNum = parts[1].substr(0, 4)
  }
  let zeroCount = 0
  let IntLen = 0
  let n
  let p
  let m
  let q
  let decLen = 0
  // 获取整型部分转换
  if (parseInt(IntegerNum, 10) > 0) {
    zeroCount = 0
    IntLen = IntegerNum.length
    for (var i = 0; i < IntLen; i++) {
      n = IntegerNum.substr(i, 1)
      p = IntLen - i - 1
      q = p / 4
      m = p % 4
      if (n === '0') {
        zeroCount++
      } else {
        if (zeroCount > 0) {
          ChineseStr += cnNumbs[0]
        }
        // 归零
        zeroCount = 0
        ChineseStr += cnNumbs[parseInt(n)] + cnIntRadices[m]
      }
      if (m === 0 && zeroCount < 4) {
        ChineseStr += cnIntUnits[q]
      }
    }
    ChineseStr += cnIntLast
    // 整型部分处理完毕
  }
  // 小数部分
  if (DecimalNum !== '') {
    decLen = DecimalNum.length
    for (i = 0; i < decLen; i++) {
      n = DecimalNum.substr(i, 1)
      if (n !== '0') {
        ChineseStr += cnNumbs[Number(n)] + cnDecUnits[i]
      }
    }
  }
  if (ChineseStr === '') {
    // ChineseStr += cnNumbs[0]+cnIntLast+cnInteger;
    ChineseStr += cnNumbs[0] + cnIntLast
  }/* else if( DecimalNum == '' ){
    ChineseStr += cnInteger;
    ChineseStr += cnInteger;
  } */
  return ChineseStr
}

/**
 * 格式化金钱,三位加一个逗号
 * @param num
 */
export const priceToThousands = (num) => {
  if (num) {
    num = toDecimal2(num)
    // 将num中的$,去掉,将num变成一个纯粹的数据格式字符串
    num = num.toString().replace(/\$|\,/g, '')
    // 如果num不是数字,则将num置0,并返回
    if (num === '' || isNaN(num)) {
      return 'Not a Number ! '
    }
    // 如果num是负数,则获取她的符号
    const sign = num.indexOf('-') > 0 ? '-' : ''
    // 如果存在小数点,则获取数字的小数部分
    let cents = num.indexOf('.') > 0 ? num.substr(num.indexOf('.')) : ''
    // 注意:这里如果是使用change方法不断的调用,小数是输入不了的
    cents = cents.length > 1 ? cents : ''
    // 获取数字的整数数部分
    num = num.indexOf('.') > 0 ? num.substring(0, (num.indexOf('.'))) : num
    // 如果没有小数点,整数部分不能以0开头
    if (cents === '') {
      if (num.length > 1 && num.substr(0, 1) === '0') {
        return 'Not a Number ! '
      }
    } else {
      // 如果有小数点,且整数的部分的长度大于1,则整数部分不能以0开头
      if (num.length > 1 && num.substr(0, 1) === '0') {
        return 'Not a Number ! '
      }
    }
    // 针对整数部分进行格式化处理,这是此方法的核心,也是稍难理解的一个地方,逆向的来思考或者采用简单的事例来实现就容易多了
    /*
      也可以这样想象,现在有一串数字字符串在你面前,如果让你给他家千分位的逗号的话,你是怎么来思考和操作的?
      字符串长度为0/1/2/3时都不用添加
      字符串长度大于3的时候,从右往左数,有三位字符就加一个逗号,然后继续往前数,直到不到往前数少于三位字符为止
      */
    for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++) {
      num = num.substring(0, num.length - (4 * i + 3)) + ',' + num.substring(num.length - (4 * i + 3))
    }
    // 将数据(符号、整数部分、小数部分)整体组合返回
    return (sign + num + cents)
  }
  // 以下是demo
  // const fen = 1100
  // fenToYuan(fen)
  // const yuan = 110.12
  // yuanToFen(yuan, 100) // 第二个参数是倍数,这里固定写100就行
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<script type="text/javascript"> function CheckAlls(checked) { len = document.frmmain.elements.length; var i=0; for( i=0; i<len; i++) { if (document.frmmain.elements[i].name=='check_node_0') { if(document.frmmain.elements[i].disabled == false){ document.frmmain.elements[i].checked=(checked==true?true:false); } } } } </script><script> document.onpropertychange= function() { var a= document.getElementById('field6163').value;//取小写金额的值 var numberValue=new String(Math.round(a*100)); // 数字金额 var String1 = "零壹贰叁肆伍陆柒捌玖"; // 汉字数字 var String2 = "万仟佰拾亿仟佰拾万仟佰拾元角分"; // 对应单位 var len=numberValue.length; // numberValue 的字符串长度 //alert(len); var Ch1; // 数字的汉语读法 var Ch2; // 数字位的汉字读法 var nZero=0; // 用来计算连续的零值的个数 var String3; // 指定位置的数值 { if(len>15){ alert("超出计算范围"); return fase; } if (numberValue==0){ chineseValue = "零元整"; } else { chineseValue=""; } String2 = String2.substr(String2.length-len, len); // 取出对应位数的STRING2的值 for(var i=0; i<len; i++){ String3 = parseInt(numberValue.substr(i, 1),10); // 取出需转换的某一位的值 if ( i != (len - 3) && i != (len - 7) && i != (len - 11) && i !=(len - 15) ){ if ( String3 == 0 ){ Ch1 = ""; Ch2 = ""; nZero = nZero + 1; } else if ( String3 != 0 && nZero != 0 ){ Ch1 = "零" + String1.substr(String3, 1); Ch2 = String2.substr(i, 1); nZero = 0; } else{ Ch1 = String1.substr(String3, 1); Ch2 = String2.substr(i, 1); nZero = 0; } } else{ // 该位是万亿,亿,万,元位等关键位 if( String3 != 0 && nZero != 0 ){ Ch1 = "零" + String1.substr(String3, 1); Ch2 = String2.substr(i, 1); nZero = 0; } else if ( String3 != 0 && nZero == 0 ){ Ch1 = String1.substr(String3, 1); Ch2 = String2.substr(i, 1); nZero = 0; } else if( String3 == 0 && nZero >= 3 ){ Ch1 = ""; Ch2 = ""; nZero = nZero + 1; } else{ Ch1 = ""; Ch2 = String2.substr(i, 1); nZero = nZero + 1; } if( i == (len - 11) || i == (len - 3)){ // 如果该位是亿位或元位,则必须写上 Ch2 = String2.substr(i, 1); } } chineseValue =chineseValue +Ch1 + Ch2; } if ( String3 == 0 ){ // 最后一位(分)为0时,加上“整” chineseValue = chineseValue + "整"; } } //alert(chineseValue); document.getElementById('field6421').value=chineseValue; } </script>
好的,我可以回答这个问题。以下是将数字金额转换为中文大写金额的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、付费专栏及课程。

余额充值