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 相关文章推荐
自动完成JS类(纯JS, Ajax模式)
Mar 12 Javascript
JS backgroundImage控制
May 19 Javascript
javascript 同时在IE和FireFox获取KeyCode的代码
Feb 07 Javascript
jquery 缓存问题的几个解决方法
Nov 11 Javascript
代码触发js事件(click、change)示例应用
Dec 13 Javascript
JQuery+Ajax无刷新分页的实例代码
Feb 08 Javascript
JavaScript设计模式学习之“类式继承”
Mar 12 Javascript
jQuery通用的全局遍历方法$.each()用法实例
Jul 04 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
Sep 28 Javascript
Node.js调用fs.renameSync报错(Error: EXDEV, cross-device link not permitted)
Dec 27 Javascript
bootstrap 弹出框modal添加垂直方向滚轴效果
Jul 09 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
Sep 18 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
php adodb连接带密码access数据库实例,测试成功
2008/05/14 PHP
php不写闭合标签的好处
2014/03/04 PHP
php求一个网段开始与结束IP地址的方法
2015/07/09 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
2019/10/10 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
javascript获取所有同类checkbox选项(实例代码)
2013/11/07 Javascript
AngularJS中关于ng-class指令的几种实现方式详解
2016/09/17 Javascript
jQuery中get方法用法分析
2016/12/07 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
2016/12/14 Javascript
vuejs2.0实现一个简单的分页示例
2017/02/22 Javascript
Express系列之multer上传的使用
2017/10/27 Javascript
使用webpack打包koa2 框架app
2018/02/02 Javascript
bootstrap与pagehelper实现分页效果
2018/12/29 Javascript
使用Vue中 v-for循环列表控制按钮隐藏显示功能
2019/04/23 Javascript
js实现单元格拖拽效果
2020/02/10 Javascript
javascript 模块依赖管理的本质深入详解
2020/04/30 Javascript
[58:21]DOTA2亚洲邀请赛 4.3 突围赛 Liquid vs VGJ.T 第二场
2018/04/04 DOTA
Python实现监控程序执行时间并将其写入日志的方法
2015/06/30 Python
python绘制漏斗图步骤详解
2019/03/04 Python
基于python3监控服务器状态进行邮件报警
2019/10/19 Python
python Event事件、进程池与线程池、协程解析
2019/10/25 Python
pandas中read_csv、rolling、expanding用法详解
2020/04/21 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
某公司的.net工程师面试题笔试题
2013/11/22 面试题
大学生职业生涯规划书汇总
2014/03/20 职场文书
党员干部承诺书范文
2014/03/25 职场文书
2014教育局对照检查材料思想汇报
2014/09/23 职场文书
网吧温馨提示
2015/07/17 职场文书
小学运动会宣传稿
2015/07/23 职场文书
Golang 获取文件md5校验的方法以及效率对比
2021/05/08 Golang
django学习之ajax post传参的2种格式实例
2021/05/14 Python
详解Java线程池是如何重复利用空闲线程的
2021/06/26 Java/Android
利用Python判断整数是否是回文数的3种方法总结
2021/07/07 Python
详解 TypeScript 枚举类型
2021/11/02 Javascript
攻略丨滑雪究竟该选哪款对讲机?
2022/02/18 无线电