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+css使DIV始终居于屏幕中间 左下 左上 右上 右下的代码集合
Mar 10 Javascript
PHP abstract与interface之间的区别
Nov 11 Javascript
文本框水印提示效果的简单实现代码
Feb 22 Javascript
JS之获取样式的简单实现方法(推荐)
Sep 13 Javascript
利用jQuery对无序列表排序的简单方法
Oct 16 Javascript
原生JS实现九宫格抽奖效果
Apr 01 Javascript
vuejs手把手教你写一个完整的购物车实例代码
Jul 06 Javascript
Node.js五大应用性能技巧小结(必须收藏)
Aug 09 Javascript
VUE 使用中踩过的坑
Feb 08 Javascript
vue bus全局事件中心简单Demo详解
Feb 26 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
Aug 19 Javascript
详解webpack-dev-middleware 源码解读
Mar 23 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
延长phpmyadmin登录时间的方法
2011/02/06 PHP
discuz程序的PHP加密函数原理分析
2011/08/05 PHP
LotusPhp笔记之:Logger组件的使用方法
2013/05/06 PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
2013/08/16 PHP
PHP制作3D扇形统计图以及对图片进行缩放操作实例
2014/10/23 PHP
PHP简单实现断点续传下载的方法
2015/09/25 PHP
鼠标移动到一张图片时变为另一张图片
2006/12/05 Javascript
JavaScript高级程序设计(第3版)学习笔记8 js函数(中)
2012/10/11 Javascript
javascript中的document.open()方法使用介绍
2013/10/09 Javascript
JavaScript获取客户端计算机硬件及系统等信息的方法
2014/01/02 Javascript
禁止页面刷新让F5快捷键及右键都无效
2014/01/22 Javascript
jQuery EasyUI开发技巧总结
2017/09/26 jQuery
vue实现通讯录功能
2018/07/14 Javascript
详解vue-router数据加载与缓存使用总结
2018/10/29 Javascript
JavaScript中将值转换为字符串的五种方法总结
2019/06/06 Javascript
在vue-cli中引入lodash.js并使用详解
2019/11/13 Javascript
JS highcharts实现动态曲线代码示例
2020/10/16 Javascript
深入了解Vue动态组件和异步组件
2021/01/26 Vue.js
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
Python实现的弹球小游戏示例
2017/08/01 Python
pycharm 配置远程解释器的方法
2018/10/28 Python
Python 合并多个TXT文件并统计词频的实现
2019/08/23 Python
Python计算不规则图形面积算法实现解析
2019/11/22 Python
Pytorch实现LSTM和GRU示例
2020/01/14 Python
pytorch 实现L2和L1正则化regularization的操作
2021/03/03 Python
eDreams葡萄牙:全球最大的在线旅行社之一
2019/04/15 全球购物
澳大利亚在线高跟鞋商店:Shoe Me
2019/11/19 全球购物
什么是继承
2013/12/07 面试题
自我鉴定范文
2013/11/10 职场文书
心理学专业大学生职业生涯规划范文
2014/02/19 职场文书
爱我中华教学反思
2014/04/28 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
汤姆索亚历险记读书笔记
2015/06/29 职场文书
微信小程序用户授权最佳实践指南
2021/05/08 Javascript
教你怎么用python selenium实现自动化测试
2021/05/27 Python
JavaScript原型链中函数和对象的理解
2022/06/16 Javascript