文章分类 Classification
数字大小写转换问题
稿件来源: 阳光企业网站管理系统 撰稿作者: 太阳光 发表日期: 2015-05-12 阅读次数: 57 查看权限: 游客查看
编程实现将中文的“贰仟零伍亿叁佰扒拾万零叁拾”转换为“200503800030”
问题是由:编程实现将中文的“贰仟零伍亿叁佰捌拾万零叁拾”转换为“200503800030” 引发的
网上搜索很多是数字转成中文金额,其中一个解法是:
function DX(n) { if (!/^(0|[1-9]\d*)(\.\d+)?$/.test(n)) return "数据非法"; var unit = "仟百拾亿仟百拾万仟百拾元角分", str = ""; n += "00"; var p = n.indexOf('.'); if (p >= 0) n = n.substring(0, p) + n.substr(p+1, 2); unit = unit.substr(unit.length - n.length); for (var i=0; i < n.length; i++) str += '零壹贰叁肆伍陆柒捌玖'.charAt(n.charAt(i)) + unit.charAt(i); return str.replace(/零(仟|百|拾|角)/g, "零").replace(/(零)+/g, "零").replace(/零(万|亿|元)/g, "$1").replace(/(亿)万|壹(拾)/g, "$1$2").replace(/^元零?|零分/g, "").replace(/元$/g, "元整"); }
稍微修改一下就变成一个数字转成中文的方法:
function getDX(n) { var unit = "仟佰拾亿仟佰拾万仟佰拾", str = "";n +=""; unit = unit.substr(unit.length - n.length + 1); for (var i=0; i < n.length; i++) { str += '零壹贰叁肆伍陆柒捌玖'.charAt(n.charAt(i)) + unit.charAt(i); } return str.replace(/零(仟|佰|拾)/g, "零").replace(/零+/g, "零").replace(/零(万|亿|$)/g, "$1").replace(/(亿)万|壹(拾)/g, "$1$2"); }
但是让中文转成数字却网上没找到,苦想了一下我先写了这个方法:
function getNumber(str){ var arr = {"亿": 100000000, "万": 10000, "仟": 1000, "佰": 100, "拾": 10}, obj = {"壹": 1,"贰": 2,"叁": 3,"肆": 4,"伍": 5,"陆": 6,"柒": 7,"捌": 8,"玖": 9}; str = str.replace(/(零|佰|^)拾/g, "$1壹拾"); str = str.replace(/零/g, ""); for (var k in obj) str = str.replace(new RegExp(k, "g"), obj[k]); str = ("(" + str + ")").replace(/(亿|万)/g, function (a, b) { return ")*" + arr[b] + "+("; }).replace(/(仟|佰|拾)/g, function (a, b) { return "*" + arr[b] + "+"; }); str = str.replace(/\+\)/g, ")"); return eval(str); }
思路是转换成一个数学式子最后eval得出数字。我们都知道js尽量少用eval,所以又改进了一个方法:
function getNumb(str) { var obj = {"亿": 100000000,"万": 10000,"仟":1000,"佰":100,"拾":10,"壹":1,"贰": 2,"叁": 3,"肆": 4,"伍": 5,"陆": 6,"柒": 7,"捌": 8,"玖": 9}, arr = str.replace(/(零|佰|^)拾/g, "$1壹拾").replace(/零/g, "").split(/(亿|万|仟|佰|拾)/),a = 0, l = 0; for (var i = 0; i < arr.length;i = i + 2 ) { var f = arr[i],n = arr[i + 1]; if(f == ""){ arr.splice(i,1);i--;//清除空数组,避免使用filter }else if (/亿|万/.test(f)) { a += l * obj[f];l = 0;i --; }else if (/亿|万/.test(n)) { a += (l + obj[f]) * obj[n];l = 0; } else { l += obj[f] * (obj[n] ? obj[n] : 1); } } return a + l; }
还有没有更好,简单直接点的方法呢?其实这个中文转成数字重点是补零位,于是我曾经尝试用正侧补零位,但发现情况太多种了,一直没法完美解决。经过分析我觉得使用填空方式来完成:
function getNumber(str){ var obj = {"零":0,"壹":1,"贰": 2,"叁": 3,"肆": 4,"伍": 5,"陆": 6,"柒": 7,"捌": 8,"玖": 9}, arr = [[0,0,0,0],[0,0,0,0],[0,0,0,0]], array = str.replace(/(零|佰|^)拾/g, "$1壹拾").split(/([万亿])/), l = array.length - 1; function setArray(s,n){ if("" == s) return; var t = arr[n],b = s.split(/([拾佰仟零])/g),k = b.length-1; t[3] = obj[b[k] ? b[k]:"零"]; for(;k--;){ if(/[拾佰仟]/.test(b[k])){ t[{"拾":2,"佰":1,"仟":0}[b[k]]] = obj[b[k - 1] ? b[k - 1]:"零"]; } } } setArray(array[l],2); for(;l--;){ ([array[l]] == "万"||[array[l]] == "亿") && setArray(array[l-1],{"万":1,"亿":0}[array[l]]); } return arr.join("").replace(/,/g,"").replace(/^0+/g,""); }
首先对特殊的“拾”转成“壹拾”字符。然后以万或者亿分割数组,数组长度可能值为1、3、5。总之最后一个数组就是个位,然后判断数组元素是否为“万”或者“亿”来确定它们是数组的哪部分。然后再分别用[拾佰仟零]分割字符串并放到里面的数组里,最后整个数组合并并处理逗号和多余的0就OK。
逻辑非常清晰,代码也非常给力。
关键词: 数字转中文 编辑时间: 2015-05-14 22:18:11
0
高兴0
支持0
搞笑0
不解0
谎言0
枪稿0
震惊0
无奈0
无聊0
反对0
愤怒
0%(0)
0%(0)
- 暂无评论
文章图片 article Pictrue
网友评论