数字转金额大写js方法三

整体思路差不多 写法更规范 替代用的是正则匹配

function numberToChinese(num) {
    const CN_SYMBOL = '';
    const CN_ZERO = '零';
    const CN_ONE = '壹';
    const CN_TWO = '贰';
    const CN_THREE = '叁';
    const CN_FOUR = '肆';
    const CN_FIVE = '伍';
    const CN_SIX = '陆';
    const CN_SEVEN = '柒';
    const CN_EIGHT = '捌';
    const CN_NINE = '玖';
    const CN_TEN = '拾';
    const CN_HUNDRED = '佰';
    const CN_THOUSAND = '仟';
    const CN_TEN_THOUSAND = '万';
    const CN_HUNDRED_MILLION = '亿';
    const CN_SYMBOL_MONEY = '元';
    const CN_SYMBOL_DOT = '点';
    const CN_SYMBOL_FULL = '整';
    const CN_SYMBOL_FEN = '分';
    const CN_SYMBOL_JIAO = '角';
  
    const CN_NUMBERS = [CN_ZERO, CN_ONE, CN_TWO, CN_THREE, CN_FOUR, CN_FIVE, CN_SIX, CN_SEVEN, CN_EIGHT, CN_NINE];//数字的大写
    const CN_UNITS = ['', CN_TEN, CN_HUNDRED, CN_THOUSAND, CN_TEN_THOUSAND, CN_HUNDRED_MILLION];//量级大写 ‘’,拾,佰,仟,万,亿

    let integer, decimal, output;
    [integer, decimal = ''] = String(num).split('.');//整数部分,小数部分
    integer = integer.split('').reverse().join('');//整数部分 先转数组 然后倒过来 然后转字符串 

    if (Number(num) === 0) {//数字是零→零元整
      output = CN_ZERO + CN_SYMBOL_MONEY + CN_SYMBOL_FULL;
    } else {
      output = '';
      for (let i = 0; i < integer.length; i++) {
        //处理整数部分   数字大写[]+量级(为零?无量级:量级)+ 之前的
        output = CN_NUMBERS[integer[i]] + (integer[i] === '0' ? '' : CN_UNITS[i % 4]) + output;
        if (i % 4 === 3) {//如果当前数字所在的位置是整数部分的末尾或某个量级的末尾,则需要添加下一个量级,具体来说,就是将当前量级加 4 后得到下一个量级,并将其添加到输出字符串中
          output = CN_UNITS[Math.floor(i / 4) + 4] + output;
        }
      }
      output = output.replace(/零(?=零+|$|万|亿)/g, '');// /零(?=零+|$|万|亿)/g: 匹配所有的“零”,但仅在后面没有其他“零”或者字符串结尾、或者紧接着是“万”或“亿”的情况下才进行替换。
      output = output.replace(/亿(?=万)/g, '亿');//  /亿(?=万)/g: 匹配所有的“亿”,但仅在后面紧接着是“万”的情况下才进行替换。
      output = output.replace(/零+万/g, '万');//  /零+万/g: 匹配所有的“零万”,将其替换为“万”。
      output = output.replace(/零+元/g, '元');//  /零+元/g: 匹配所有的“零元”,将其替换为“元”。
      output = output.replace(/亿万/g, '亿');//   /亿万/g: 匹配所有的“亿万”,将其替换为“亿”。
      if (decimal) {//小数部分处理  数字+角/分
        output += (CN_NUMBERS[decimal[0]] || '') + (decimal[0] === '0' ? '' : CN_SYMBOL_JIAO);
        output += (CN_NUMBERS[decimal[1]] || '') + (decimal[1] === '0' ? '' : CN_SYMBOL_FEN);
      } else {
        output += CN_SYMBOL_FULL;//整
      }
    }
  
    return CN_SYMBOL + output;
  }
  
console.log(numberToChinese(123456789.12)); // 输出: "壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元壹角贰分"

复习点

一、reverse

1、定义和用法

reverse() 方法用于颠倒数组中元素的顺序。

2、语法
array.reverse()

在这里插入图片描述

3、返回值
  • Array: 颠倒顺序后的数组

二、replace

1、定义和用法

replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。

2、语法
string.replace(searchvalue,newvalue)
  • searchvalue:必须。规定子字符串或要替换的模式的 RegExp 对象。

请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象。

  • newvalue:必需。一个字符串值。规定了替换文本或生成替换文本的函数。
    在这里插入图片描述
3、返回值
  • String:一个新的字符串,是用 replacement 替换了 regexp 的第一次匹配或所有匹配之后得到的。
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
可以使用以下代码将 JS 数字换为金额大写: ```javascript function convertCurrency(money) { // 定义汉字的数字 var cnNums = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"]; // 定义汉字的单位 var cnIntRadice = ["", "拾", "佰", "仟"]; var cnIntUnits = ["", "万", "亿", "兆"]; var cnDecUnits = ["角", "分", "毫", "厘"]; // 将数字换为字符串,并分割成整数部分和小数部分 var parts = money.toString().split("."); var integer = parts[0]; var decimal = parts[1] ? parts[1].substr(0, 4) : ""; // 将整数部分换为汉字的金额大写 var result = ""; var len = integer.length; for (var i = 0; i < len; i++) { var num = parseInt(integer.charAt(i)); var unit = len - i - 1; result += cnNums[num] + cnIntRadice[unit]; if (unit == 0 && num == 1) { result += "元"; } } // 将小数部分换为汉字的金额大写 if (decimal != "") { var decLen = decimal.length; for (var i = 0; i < decLen; i++) { var num = parseInt(decimal.charAt(i)); result += cnNums[num] + cnDecUnits[i]; } } // 添加“整”字 if (result == "") { result = "零元整"; } else if (decimal == "") { result += "元整"; } // 添加单位 var unitIndex = 0; while (integer > 0) { var unit = cnIntUnits[unitIndex]; var section = integer % 10000; if (section > 0) { result = cnNums[section] + unit + result; } integer = Math.floor(integer / 10000); unitIndex++; } return result; } console.log(convertCurrency(123456789.1234)); // 壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元壹角贰分毫四厘 ``` 注意:以上代码只能将数字换为金额大写,无法将金额换为数字

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伊昂呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值