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.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
Jun 28 Javascript
jQuery动画效果animate和scrollTop结合使用实例
Apr 02 Javascript
jquery日历插件datepicker用法分析
Jan 22 Javascript
jQuery侧边栏实现代码
May 06 Javascript
json与jsonp知识小结(推荐)
Aug 16 Javascript
BootStrop前端框架入门教程详解
Dec 25 Javascript
自制简易打赏功能的实例
Sep 02 Javascript
详解Angular调试技巧之报错404(not found)
Jan 31 Javascript
vue-cli axios请求方式及跨域处理问题
Mar 28 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
Dec 11 Javascript
JS实现换肤功能的方法实例详解
Jan 30 Javascript
微信小程序实现转盘抽奖
Sep 21 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
2019十大人气国漫
2020/03/13 国漫
PHP 抓取新浪读书频道的小说并生成txt电子书的代码
2009/12/18 PHP
在PHP中使用X-SendFile头让文件下载更快
2014/06/01 PHP
Laravel框架表单验证详解
2014/09/04 PHP
WordPress中用于获取文章作者与分类信息的方法整理
2015/12/17 PHP
自定义min版smarty模板引擎MinSmarty.class.php文件及用法
2016/05/20 PHP
PHP调用接口用post方法传送json数据的实例
2018/05/31 PHP
PHP实现的解汉诺塔问题算法示例
2018/08/06 PHP
可拖动窗口,附带鼠标控制渐变透明,开启关闭功能
2006/06/26 Javascript
jquery 最简单的属性菜单
2009/10/08 Javascript
五个jQuery图片画廊插件 推荐
2011/05/12 Javascript
也说JavaScript中String类的replace函数
2011/09/22 Javascript
基于jquery插件实现常见的幻灯片效果
2013/11/01 Javascript
Jquery中children与find之间的区别详细解析
2013/11/29 Javascript
express的中间件bodyParser详解
2014/12/04 Javascript
node.js中使用socket.io的方法
2014/12/15 Javascript
JavaScript中的操作符==与===介绍
2014/12/31 Javascript
JavaScript数组Array对象增加和删除元素方法总结
2015/01/20 Javascript
jquery实现页面百叶窗走马灯式翻滚显示效果的方法
2015/03/12 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
浅谈js中子页面父页面方法 变量相互调用
2016/08/04 Javascript
JavaScript实现公历转农历功能示例
2017/02/13 Javascript
NodeJS仿WebApi路由示例
2017/02/28 NodeJs
js图片上传的封装代码
2017/08/01 Javascript
JavaScript arguments.callee作用及替换方案详解
2020/09/02 Javascript
基于Vue.js+Nuxt开发自定义弹出层组件
2020/10/09 Javascript
梯度下降法介绍及利用Python实现的方法示例
2017/07/12 Python
Python3.5基础之NumPy模块的使用图文与实例详解
2019/04/24 Python
pip指定python位置安装软件包的方法
2019/07/12 Python
python tkinter之顶层菜单、弹出菜单实例
2020/03/04 Python
Python BeautifulReport可视化报告代码实例
2020/04/13 Python
python实现一个简单RPC框架的示例
2020/10/28 Python
教师网络培训感言
2014/03/09 职场文书
组工干部对照检查材料
2014/08/25 职场文书
2015年元旦晚会活动总结(学生会)
2014/11/28 职场文书
网络研修随笔感言
2015/11/18 职场文书