阿拉伯数字与中文数字转换算法 发表于 2017-03-02 | 分类于 算法的乐趣 | 《算法的乐趣》- 王晓华 读书笔记,原文用C语言实现算法 现在改用JavaScript实现算法 阿拉伯数字转换中文表示12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273// 单个数字转换:数组下标定义中文数字表var chnNumChar = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];// 节与权位识别。节:以万为单位截断。一维表// 32位正数能表达的最大数,节权是万亿已经够了。最低的节没有节权,使用空字符串做占位符(算法设计的一致性处理技巧)var chnUnitSection = ['', '万', '亿', '万亿'];// 每个节内数字的权位// 通过移位可以确定每个数字对应的权位;以移位次数做下标,查节权表即可var chnUnitChar = ['', '十', '百', '千'];// 算法设计:先对阿拉伯数字分节,确定节权位名称// var chnStr = 1000;function NumberToChinese(num) { // 输出字符串 var chnStr = ''; // 记录节的位置:0代表“”,1代表万,2代表亿 var unitPos = 0; // 中转状态 var strIns = ''; // 是否需要补0 var needZero = false; // 移位循环 每节取余10000 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; // 千位是0,需要下一个section补0 needZero = (section < 1000) && (section > 0); num = parseInt(num / 10000); unitPos++; } return chnStr;}// 将一个节的数字转换成中文数字function SectionToChinese (section) { var chnStr = ''; var strIns = ''; var unitPos = 0; // 确保连续多个,只补一个中文0 var zero = true; while (section > 0) { var v = section % 10; if (v === 0) { if ((section === 0) || !zero) { zero = true; chnStr = chnNumChar[v] + chnStr; } } else { // 至少有一个数字不是 zero = false; // 此位对应的中文数字 strIns = chnNumChar[v]; // 此位对应的中文权位 strIns += chnUnitChar[unitPos]; chnStr = strIns + chnStr; } // 移位 unitPos++; section = parseInt(section / 10); } return chnStr;}var body = document.querySelector('body');var num = 10010441;var text = document.createTextNode(num + ' => '+ NumberToChinese(num));// 输出 “10010441 => 一千零一万零四百四十一”body.appendChild(text);