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+FSO遍历文件夹下文件并显示
Mar 07 Javascript
Locate a File Using a File Open Dialog Box
Jun 18 Javascript
JavaScript判断文件上传类型的方法
Sep 02 Javascript
Bootstrap 模态框(Modal)插件代码解析
Dec 21 Javascript
javaScript和jQuery自动加载简单代码实现方法
Nov 24 jQuery
jQuery实现页码跳转式动态数据分页
Dec 31 jQuery
vue 全选与反选的实现方法(无Bug 新手看过来)
Feb 09 Javascript
基于webpack-hot-middleware热加载相关错误的解决方法
Feb 22 Javascript
关于自定义Egg.js的请求级别日志详解
Dec 12 Javascript
KnockoutJS数组比较算法实例详解
Nov 25 Javascript
vue实现随机验证码功能(完整代码)
Dec 10 Javascript
微信小程序换肤功能实现代码(思路详解)
Aug 25 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
便携利器 — TECSUN PL-365简评
2021/03/02 无线电
谈谈PHP语法(3)
2006/10/09 PHP
php实现的简单日志写入函数
2015/03/31 PHP
高效的表格行背景隔行变色及选定高亮的JS代码
2010/12/04 Javascript
javascript笔记 String类replace函数的一些事
2011/09/22 Javascript
jquery 实现两级导航菜单附效果图
2014/03/07 Javascript
Javascript基础知识(一)核心基础语法与事件模型
2014/09/29 Javascript
javascript学习笔记(八)正则表达式
2014/10/08 Javascript
Nodejs学习笔记之Stream模块
2015/01/13 NodeJs
JS实现表单中checkbox对勾选中增加边框显示效果
2015/08/21 Javascript
详解页面滚动值scrollTop在FireFox与Chrome浏览器间的兼容问题
2015/12/03 Javascript
使用postMesssage()实现iframe跨域页面间的信息传递
2016/03/29 Javascript
JS在onclientclick里如何控制onclick的执行
2016/05/30 Javascript
基于Bootstrap仿淘宝分页控件实现代码
2016/11/07 Javascript
原生javascript实现的全屏滚动功能示例
2017/09/19 Javascript
vue.js单文件组件中非父子组件的传值实例
2018/09/13 Javascript
微信小程序封装多张图片上传api代码实例
2019/12/30 Javascript
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
2020/03/06 Javascript
小程序跳转H5页面的方法步骤
2020/03/06 Javascript
Python isinstance函数介绍
2015/04/14 Python
Python实现感知机(PLA)算法
2017/12/20 Python
Python的CGIHTTPServer交互实现详解
2018/02/08 Python
pyhton列表转换为数组的实例
2018/04/04 Python
[原创]Python入门教程5. 字典基本操作【定义、运算、常用函数】
2018/11/01 Python
Idea安装python显示无SDK问题解决方案
2020/08/12 Python
使用python实现学生信息管理系统
2021/02/25 Python
css3的@media属性实现页面响应式布局示例代码
2014/02/10 HTML / CSS
Lookfantastic意大利官网:英国知名美妆购物网站
2019/05/31 全球购物
旅游管理专业学生求职信
2013/09/28 职场文书
违纪检讨书2000字
2014/02/08 职场文书
四查四看剖析材料
2014/02/14 职场文书
农村婚礼主持词
2014/03/13 职场文书
俞敏洪一分钟演讲稿
2014/08/26 职场文书
篮球赛闭幕式主持词
2015/07/03 职场文书
新娘父亲婚礼致辞
2015/07/27 职场文书
一篇文章带你学习Mybatis-Plus(新手入门)
2021/08/02 Java/Android