JavaScript实现阿拉伯数字和中文数字互相转换


Posted in Javascript onJune 12, 2016

阿拉伯数字转中文数字
中文数字的特点:

  • 每个计数数字都跟着一个权位,权位有:十、百、千、万、亿。
  • 以“万”为小节,对应一个节权位,万以下没有节权位。
  • 每个小节内部以“十百千”为权位独立计数。
  • “十百千”不能连续出现,而“万”和“亿”作为节权位时可以和其他权位连用,如:“二十亿”。

中文数字对“零”的使用要满足以下三条规则:

  • 以10000为小节,小节的结尾即使是0,也不使用零。
  • 小节内两个非0数字之间要使用“零”。
  • 当小节的“千”位是0时(即:1~999),只要不是首小节,都要补“零”。

算法设计的一些说明:

  • 对“零”的第三个规则,把检测放在循环的最前面并默认为false,可以自然的丢弃最高小节的加零判断。
  • 单个数字转换用数组实现,var chnNumChar = ["零","一","二","三","四","五","六","七","八","九"];
  • 节权位同样用数组实现,var chnUnitSection = ["","万","亿","万亿","亿亿"];
  • 节内权位同样用数组实现,var chnUnitChar = ["","十","百","千"];

节内转换算法:

function SectionToChinese(section){
  var strIns = '', chnStr = '';
  var unitPos = 0;
  var zero = true;
  while(section > 0){
    var v = section % 10;
    if(v === 0){
      if(!zero){
        zero = true;
        chnStr = chnNumChar[v] + chnStr;
      }
    }else{
      zero = false;
      strIns = chnNumChar[v];
      strIns += chnUnitChar[unitPos];
      chnStr = strIns + chnStr;
    }
    unitPos++;
    section = Math.floor(section / 10);
  }
  return chnStr;
}

转换算法主函数:

function NumberToChinese(num){
  var unitPos = 0;
  var strIns = '', chnStr = '';
  var needZero = false;

  if(num === 0){
    return chnNumChar[0];
  }

  while(num > 0){
    var section = num % 10000;
    if(needZero){
      chnStr = chnNumChar[0] + chnStr;
    }
    strIns = SectionToChinese(section);
    strIns += (section !== 0) ? chnUnitSection[unitPos] : chnUnitSection[0];
    chnStr = strIns + chnStr;
    needZero = (section < 1000) && (section > 0);
    num = Math.floor(num / 10000);
    unitPos++;
  }

  return chnStr;
}

中文数字转阿拉伯数字
设计思想:

  • 将中文数学转换成阿拉伯数字。
  • 将中文权位转换成10的位数。
  • 对每个权位依次转换成位数并求和。
  • 零直接忽略即可。

中文数字转换成阿拉伯数字用如下对象实现:

var chnNumChar = {
  零:0,
  一:1,
  二:2,
  三:3,
  四:4,
  五:5,
  六:6,
  七:7,
  八:8,
  九:9
};

中文权位转换成10的位数及节权标志用如下对象实现:

var chnNameValue = {
  十:{value:10, secUnit:false},
  百:{value:100, secUnit:false},
  千:{value:1000, secUnit:false},
  万:{value:10000, secUnit:true},
  亿:{value:100000000, secUnit:true}
}

转换算法如下:

function ChineseToNumber(chnStr){
  var rtn = 0;
  var section = 0;
  var number = 0;
  var secUnit = false;
  var str = chnStr.split('');

  for(var i = 0; i < str.length; i++){
    var num = chnNumChar[str[i]];
    if(typeof num !== 'undefined'){
      number = num;
      if(i === str.length - 1){
        section += number;
      }
    }else{
      var unit = chnNameValue[str[i]].value;
      secUnit = chnNameValue[str[i]].secUnit;
      if(secUnit){
        section = (section + number) * unit;
        rtn += section;
        section = 0;
      }else{
        section += (number * unit);
      }
      number = 0;
    }
  }
  return rtn + section;
}
Javascript 相关文章推荐
jQuery点击后一组图片左右滑动的实现代码
Aug 16 Javascript
js iframe跨域访问(同主域/非同主域)分别深入介绍
Jan 24 Javascript
js delete 用法(删除对象属性及变量)
Aug 24 Javascript
JavaScript学习笔记(三):JavaScript也有入口Main函数
Sep 12 Javascript
详解jQuery中基本的动画方法
Dec 14 Javascript
原生和jQuery的ajax用法详解
Jan 23 Javascript
使用get方式提交表单在地址栏里面不显示提交信息
Feb 21 Javascript
js中document.referrer实现移动端返回上一页
Feb 22 Javascript
Angular4开发解决跨域问题详解
Aug 28 Javascript
ios设备中angularjs无法改变页面title的解决方法
Sep 13 Javascript
微信小程序登录对接Django后端实现JWT方式验证登录详解
Jul 29 Javascript
原生js实现的移动端可拖动进度条插件功能详解
Aug 15 Javascript
深入解析JavaScript中的arguments对象
Jun 12 #Javascript
基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
Jun 12 #Javascript
JS弹出窗口插件zDialog简单用法示例
Jun 12 #Javascript
jQuery实现拖拽页面元素并将其保存到cookie的方法
Jun 12 #Javascript
仅一个form表单 js实现注册信息依次填写提交功能
Jun 12 #Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
Jun 12 #Javascript
浅谈如何实现easyui的datebox格式化
Jun 12 #Javascript
You might like
Ajax+PHP 边学边练之四 表单
2009/11/27 PHP
PHP 获取客户端真实IP地址多种方法小结
2010/05/15 PHP
php smarty模板引擎的6个小技巧
2014/04/24 PHP
Linux安装配置php环境的方法
2016/01/14 PHP
jquery 简短几句代码实现给元素动态添加及获取提示信息
2011/09/01 Javascript
枚举的实现求得1-1000所有出现1的数字并计算出现1的个数
2013/09/10 Javascript
Chrome扩展页面动态绑定JS事件提示错误
2014/02/11 Javascript
nodejs创建web服务器之hello world程序
2015/08/20 NodeJs
jquery实现拖动效果(代码分享)
2017/01/25 Javascript
Vue表单之v-model绑定下拉列表功能
2019/05/14 Javascript
JavaScript使用localStorage存储数据
2019/09/25 Javascript
JavaScript实现更换背景图片
2019/10/18 Javascript
微信小程序绑定手机号获取验证码功能
2019/10/22 Javascript
Vue v-bind动态绑定class实例方法
2020/01/15 Javascript
[50:01]Ti4 冒泡赛第二天 NEWBEE vs Titan
2014/07/15 DOTA
Python中的测试模块unittest和doctest的使用教程
2015/04/14 Python
对Python中type打开文件的方式介绍
2018/04/28 Python
python定时关机小脚本
2018/06/20 Python
Pycharm无法使用已经安装Selenium的解决方法
2018/10/13 Python
Python SMTP发送邮件遇到的一些问题及解决办法
2018/10/24 Python
python+flask实现API的方法
2018/11/21 Python
flask框架单元测试原理与用法实例分析
2019/07/23 Python
结合OpenCV与TensorFlow进行人脸识别的实现
2019/10/10 Python
Python基本语法之运算符功能与用法详解
2019/10/22 Python
一文轻松掌握python语言命名规范规则
2020/06/18 Python
什么是Smarty变量操作符?如何使用Smarty变量操作符
2014/07/18 面试题
最新的大学生找工作自我评价
2013/09/29 职场文书
顶岗实习接收函
2014/01/09 职场文书
工程专业求职自荐书范文
2014/02/18 职场文书
班风口号
2014/06/18 职场文书
补充协议书
2015/01/28 职场文书
爱鸟护鸟的宣传语
2015/07/13 职场文书
2016年秋季新学期致辞
2015/07/30 职场文书
React中的Context应用场景分析
2021/06/11 Javascript
Spring Data JPA框架Repository自定义实现
2022/04/28 Java/Android
Python自动操作神器PyAutoGUI的使用教程
2022/06/16 Python