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 相关文章推荐
让iframe子窗体取父窗体地址栏参数(querystring)
Oct 13 Javascript
使用JSLint提高JS代码质量方法分享
Dec 16 Javascript
JavaScript中使用Object.prototype.toString判断是否为数组
Apr 01 Javascript
jquery插件uploadify实现带进度条的文件批量上传
Dec 13 Javascript
javascript中apply、call和bind的使用区别
Apr 05 Javascript
JQuery 两种方法解决刚创建的元素遍历不到的问题
Apr 13 Javascript
数组Array的排序sort方法
Feb 17 Javascript
基于JavaScript定位当前的地理位置
Apr 11 Javascript
基于js 各种排序方法和sort方法的区别(详解)
Jan 03 Javascript
使用Layui搭建后台管理界面的操作方法
Sep 20 Javascript
js实现简单的打印表格
Jan 15 Javascript
leaflet加载geojson叠加显示功能代码
Feb 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
正则表达式语法
2006/10/09 Javascript
php inc文件使用的风险和注意事项
2013/11/12 PHP
php反射应用示例
2014/02/25 PHP
PHP使用xpath解析XML的方法详解
2017/05/20 PHP
php curl发送请求实例方法
2019/08/01 PHP
JavaScript事件列表解说
2006/12/22 Javascript
JS OOP包机制,类创建的方法定义
2009/11/02 Javascript
利用jQuery操作对象数组的实现代码
2011/04/27 Javascript
UI Events 用户界面事件
2012/06/27 Javascript
Extjs grid panel自带滚动条失效的解决方法
2014/09/11 Javascript
简单谈谈jQuery(function(){})与(function(){})(jQuery)
2014/12/19 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
微信WeixinJSBridge API使用实例
2015/05/25 Javascript
JavaScript中的普通函数和箭头函数的区别和用法详解
2017/03/21 Javascript
vue.js $refs和$emit 父子组件交互的方法
2017/12/20 Javascript
在react中使用vuex的示例代码
2018/07/30 Javascript
如何基于vue-cli3.0构建功能完善的移动端架子
2019/04/24 Javascript
详解vue-property-decorator使用手册
2019/07/29 Javascript
mpvue 页面预加载新增preLoad生命周期的两种方式
2019/10/17 Javascript
微信小程序上传帖子的实例代码(含有文字图片的微信验证)
2020/07/11 Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
2020/11/09 Javascript
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
python字符串中的单双引
2017/02/16 Python
解决Python requests 报错方法集锦
2017/03/19 Python
详解python--模拟轮盘抽奖游戏
2019/04/12 Python
python批量处理txt文件的实例代码
2020/01/13 Python
在pycharm中为项目导入anacodna环境的操作方法
2020/02/12 Python
Python利用FFT进行简单滤波的实现
2020/02/26 Python
pycharm配置QtDesigner的超详细方法
2021/01/25 Python
牧马人澳大利亚官网:Wrangler澳大利亚
2019/10/08 全球购物
法国春天百货官网:Printemps.com
2020/06/29 全球购物
提高EJB性能都有哪些技巧
2012/03/25 面试题
办公室内勤岗位职责范本
2013/12/09 职场文书
毕业大学生自荐信
2014/06/17 职场文书
消防志愿者活动方案
2014/08/23 职场文书
宣传稿格式范文
2015/07/23 职场文书