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 相关文章推荐
javascript xml为数据源的下拉框控件
Jul 07 Javascript
js select常用操作控制代码
Mar 16 Javascript
jquery做的一个简单的屏幕锁定提示框
Mar 26 Javascript
js字符串完全替换函数分享
Dec 03 Javascript
jQuery实现文本展开收缩特效
Jun 03 Javascript
jQuery实现表单步骤流程导航代码分享
Aug 28 Javascript
VC调用javascript的几种方法(推荐)
Aug 09 Javascript
Bootstrap模态框使用详解
Feb 15 Javascript
node koa2实现上传图片并且同步上传到七牛云存储
Jul 31 Javascript
jQuery属性选择器用法实例分析
Jun 28 jQuery
VSCode插件安装完成后的配置(常用配置)
Aug 24 Javascript
如何使用vue3打造一个物料库
May 08 Vue.js
深入解析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
PHP5中GD库生成图形验证码(有汉字)
2013/07/28 PHP
PHP获取windows登录用户名的方法
2014/06/24 PHP
php中switch与ifelse的效率区别及适用情况分析
2015/02/12 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
PHPCMS2008广告模板SQL注入漏洞修复
2016/10/11 PHP
PHP设置images目录不充许http访问的方法
2016/11/01 PHP
PHP中有关长整数的一些操作教程
2019/09/11 PHP
基于jquery实现的可以编辑选择的下拉框的代码
2010/11/19 Javascript
jQuery EasyUI API 中文文档 - Menu菜单
2011/10/03 Javascript
基于jquery的bankInput银行卡账号格式化
2012/08/22 Javascript
js修改input的type属性及浏览器兼容问题探讨与解决
2013/01/23 Javascript
Js实现双击鼠标自动滚动屏幕的示例代码
2013/12/14 Javascript
js菜单点击显示或隐藏效果的简单实例
2014/01/13 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
2015/05/11 Javascript
JavaScript中的small()方法使用详解
2015/06/08 Javascript
ECMAScript6函数默认参数
2015/06/12 Javascript
JS使用eval()动态创建变量的方法
2016/06/03 Javascript
Bootstrap CSS组件之按钮组(btn-group)
2016/12/17 Javascript
小发现之浅谈location.search与location.hash的问题
2017/06/23 Javascript
node+express+ejs使用模版引擎做的一个示例demo
2017/09/18 Javascript
Vue + better-scroll 实现移动端字母索引导航功能
2018/05/07 Javascript
Three.js中矩阵和向量的使用教程
2019/03/19 Javascript
vue router 传参获取不到的解决方式
2019/11/13 Javascript
webpack常用构建优化策略小结
2019/11/21 Javascript
JS常用排序方法实例代码解析
2020/03/03 Javascript
Vue.js获取手机系统型号、版本、浏览器类型的示例代码
2020/05/10 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
tensorflow实现KNN识别MNIST
2018/03/12 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
2020/02/17 Python
Python优秀开源项目Rich源码解析的流程分析
2020/07/06 Python
深入CSS3 动画效果的总结详解
2013/05/09 HTML / CSS
匡威意大利官方商店 :Converse意大利
2018/11/27 全球购物
小学生竞选班干部演讲稿(5篇)
2014/09/12 职场文书
2015年父亲节寄语
2015/03/23 职场文书
python疲劳驾驶困倦低头检测功能的实现
2022/04/04 Python
Android开发手册自定义Switch开关按钮控件
2022/06/10 Java/Android