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 相关文章推荐
使用Modello编写JavaScript类
Dec 22 Javascript
用js实现手把手教你月入万刀(转贴)
Nov 07 Javascript
jquery判断小数点两位和自动删除小数两位后的数字
Mar 19 Javascript
JavaScript实现随机替换图片的方法
Apr 16 Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
Oct 28 Javascript
js控制li的隐藏和显示实例代码
Oct 15 Javascript
vue日期组件 支持vue1.0和2.0
Jan 09 Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
Sep 10 Javascript
AngularJS中table表格基本操作示例
Oct 10 Javascript
详解vue2.6插槽更新v-slot用法总结
Mar 09 Javascript
vue实现中部导航栏布局功能
Jul 30 Javascript
vue中v-model对select的绑定操作
Aug 31 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
php中定时计划任务的实现原理
2013/01/08 PHP
PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
2018/04/20 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
2019/04/02 PHP
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/06 Javascript
ExtJs事件机制基本代码模型和流程解析
2010/10/24 Javascript
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
2012/01/13 Javascript
中文路径导致unitpngfix.js不正常的解决方法
2013/06/26 Javascript
jquery动态改变onclick属性导致失效的问题解决方法
2013/12/04 Javascript
javascript分页代码实例分享(js分页)
2013/12/13 Javascript
jQuery使用height()获取高度需要注意的地方
2014/12/13 Javascript
JavaScript-html标题滚动效果的简单实现
2016/09/08 Javascript
bootstrap响应式工具使用详解
2017/11/29 Javascript
基于Vue渲染与插件的加载顺序的问题详解
2018/03/05 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
Flutter实现仿微信底部菜单栏功能
2019/09/18 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
2019/12/06 Javascript
vue.js实现简单的计算器功能
2020/02/22 Javascript
Vue CLI4 Vue.config.js标准配置(最全注释)
2020/06/05 Javascript
[02:57]DOTA2英雄基础教程 风行者
2014/01/16 DOTA
django 使用 request 获取浏览器发送的参数示例代码
2018/06/11 Python
浅析python参数的知识点
2018/12/10 Python
python通过配置文件共享全局变量的实例
2019/01/11 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
Python编程快速上手——strip()函数的正则表达式实现方法分析
2020/02/29 Python
Python pandas 列转行操作详解(类似hive中explode方法)
2020/05/18 Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
2020/05/29 Python
P/Invoke是什么
2015/07/31 面试题
护士辞职信模板
2014/01/20 职场文书
会计专业职业规划:规划自我赢取未来
2014/02/12 职场文书
纠风工作实施方案
2014/03/15 职场文书
勾股定理课后反思
2014/04/26 职场文书
副总经理任命书
2014/06/05 职场文书
总经理岗位职责说明书
2014/07/30 职场文书
美丽心灵观后感
2015/06/01 职场文书
nginx proxy_cache 缓存配置详解
2021/03/31 Servers