JS中将中文数字转化为阿拉伯数字

数字转换为中文大写,我相信已经有很多的实现了,特别是一些银行金融系统中,经常会用到大写的人民币金额。

但是,反过来,怎么将这个中文描述的人民币金额转换为数字呢?

这里分享一个我很久之前写的一个转换函数吧!直接上代码哦

实现代码

  var map = {
    "零":0,
 
    "一":1,
    "壹":1,
 
    "二":2,
    "贰":2,
    "两":2,
 
    "三":3,
    "叁":3,
 
    "四":4,
    "肆":4,
 
    "五":5,
    "伍":5,
 
    "六":6,
    "陆":6,
 
    "七":7,
    "柒":7,
 
    "八":8,
    "捌":8,
 
    "九":9,
    "玖":9,
 
    "十":10,
    "拾":10,
 
    "百":100,
    "佰":100,
 
    "千":1000,
    "仟":1000,
 
    "万":10000,
    "十万":100000,
    "百万":1000000,
    "千万":10000000,
    "亿":100000000
  };
 
  // 解析失败返回-1,成功返回转换后的数字,不支持负数
  function chinese_number_to_digit(chinese_number){
    var len = chinese_number.length;
    if(len == 0) return -1;
    if(len == 1) return (map[chinese_number]<=10) ? map[chinese_number] : -1;
    // 返回的总和
    var summary = 0;
 
    // 十开头省略一的情况 例 `十二` 和 `一十二`
    if(map[chinese_number[0]] == 10) {
      chinese_number = "一"+chinese_number;
      len++;
    }
 
    // 单位结尾,省略末尾单位的情况  例 一万二  三千一 二百五
    if(len >= 3 && map[chinese_number[len-1]] < 10){
      var last_second_num = map[chinese_number[len-2]];
      if(last_second_num == 100 || last_second_num == 1000 || last_second_num == 10000 || last_second_num == 100000000){
        for(var key in map){
          if(map[key] == last_second_num/10){
            chinese_number += key;
            len += key.length;
            break;
          }
        }
      }
    }
 
 
    // 不支持 一亿亿xxx  十亿亿xx ...
    if(chinese_number.match(/亿/g) && chinese_number.match(/亿/g).length>1) return -1;
 
    // 处理一亿以上的情况 例 三百二十三亿三千二百万两千零二十二
    var splited = chinese_number.split("亿");
    if(splited.length == 2){
      var rest = splited[1]=="" ? 0 : chinese_number_to_digit(splited[1]);
      return summary + chinese_number_to_digit(splited[0])*100000000 + rest;
    }
 
    // 下面处理小于一亿的情况 例 三千二百万两千零二十二
    splited = chinese_number.split("万");
    if(splited.length == 2){
      var rest = splited[1]=="" ? 0 : chinese_number_to_digit(splited[1]);
      return summary + chinese_number_to_digit(splited[0])*10000 + rest;
    }
 
    // 下面处理小于一万的情况 例 两千零二十二
    var i = 0;
    while (i<len){
      var first_char_num = map[chinese_number[i]];
      var second_char_num = map[chinese_number[i+1]];
      if(second_char_num > 9)
        summary+= first_char_num*second_char_num;
      i++;
      if(i==len)
        summary+=first_char_num<=9?first_char_num:0;
    }
    return summary;
  }

实现思路并不难,基本上都是一些字符串处理,再加上分段累计求和就可以做出来了

上面代码还不支持某些繁体字,需要繁体自己在map里面加就行了!

你可以复制上面代码,打开F12粘贴进去,运行试试看,下面上一个我这里的运行结果:
运行结果

觉得有用,还请点赞收藏!
励志前端,CSDN唯一账号!关注我,带你了解更多前端知识!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

励志前端小黑哥

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

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

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

打赏作者

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

抵扣说明:

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

余额充值