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 相关文章推荐
获取当前网页document.url location.href区别总结
May 10 Javascript
Jquery下的26个实用小技巧(jQuery tips, tricks &amp; solutions)
Mar 01 Javascript
Jquery公告滚动+AJAX后台得到数据
Apr 14 Javascript
jQuery实用函数用法总结
Aug 29 Javascript
jQuery获取及设置表单input各种类型值的方法小结
May 24 Javascript
vue双向绑定简要分析
Mar 23 Javascript
原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面
Nov 01 Javascript
Mac中安装nvm的教程分享
Dec 11 Javascript
angularJs提交文本框数据到后台的方法
Oct 08 Javascript
js实现继承的方法及优缺点总结
May 08 Javascript
JavaScript随机数的组合问题案例分析
May 16 Javascript
Echarts如何重新渲染实例详解
May 30 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
require(),include(),require_once()和include_once()的异同
2007/01/02 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
2013/07/01 PHP
discuz免激活同步登入代码修改方法(discuz同步登录)
2013/12/24 PHP
php实现按文件名搜索文件的远程文件查找器
2014/05/10 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
php post json参数的传递和接收处理方法
2018/05/31 PHP
AJAX 网页保留浏览器前进后退等功能
2011/02/12 Javascript
简单几行JS Code实现IE邮件转发新浪微博
2013/07/03 Javascript
如何实现textarea里的不同文本显示不同颜色
2014/01/20 Javascript
Jquery插件分享之气泡形提示控件grumble.js
2014/05/20 Javascript
js、jquery图片动画、动态切换示例代码
2014/06/03 Javascript
简介JavaScript中fixed()方法的使用
2015/06/08 Javascript
AngularJs动态加载模块和依赖注入详解
2016/01/11 Javascript
vue2.0开发入门笔记之.vue文件的生成和使用
2017/09/19 Javascript
vue中遇到的坑之变化检测问题(数组相关)
2017/10/13 Javascript
微信小程序适配iphoneX的实现方法
2018/09/18 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
2018/11/02 Javascript
深入了解JavaScript词法作用域
2020/07/29 Javascript
vue3+typescript实现图片懒加载插件
2020/10/26 Javascript
[03:04]2018年度DOTA2玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
python从ftp下载数据保存实例
2013/11/20 Python
Python使用遗传算法解决最大流问题
2018/01/29 Python
Python  unittest单元测试框架的使用
2018/09/08 Python
浅谈django三种缓存模式的使用及注意点
2018/09/30 Python
解决Python3 被PHP程序调用执行返回乱码的问题
2019/02/16 Python
Python识别快递条形码及Tesseract-OCR使用详解
2019/07/15 Python
python-web根据元素属性进行定位的方法
2019/12/13 Python
Python实现不规则图形填充的思路
2020/02/02 Python
在主流系统之上安装Pygame的方法
2020/05/20 Python
如何使用 Python 读取文件和照片的创建日期
2020/09/05 Python
css3圆角样式分享自定义按钮样式
2013/12/27 HTML / CSS
canvas如何实现多张图片编辑的图片编辑器
2020/03/10 HTML / CSS
Champion官网:美国冠军运动服装
2017/01/25 全球购物
交警作风整顿剖析材料
2014/10/11 职场文书
值班管理制度范本
2015/08/06 职场文书
大学生安全教育心得体会
2016/01/15 职场文书