1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 人民币大写金额转换为数字

人民币大写金额转换为数字

时间:2021-02-20 04:59:02

相关推荐

人民币大写金额转换为数字

人民币大写金额分为数字和单位两种汉字类型,“零壹贰叁肆伍陆柒捌玖”分别代表数字“0123456789”,“分角拾佰仟万亿”分别代表“0.01 0.1 10 100 1000 100000000”,除此之外还有一些汉字具有补充含义,比如“元”,“整”,“正”,但是这些汉字并不具有实际的计算能力,在计算前可以直接忽略。中文大写金额数字前应标明“人民币”字样,大写金额数字应紧接“人民币”字样填写,“人民币”字样声明了金额类型,在金额转换之前应该去除该字样。

人民币大写金额具有一定规律,我们首先分析人民币的组成规则。人民币大写金额从左往右与数字金额相对应,一般情况下,数字汉字和单位汉字构成一位真正的数字,比如“壹拾”代表数字10;如果数字的单位属于“个”,那么单位“个”省略不写,虽然“个”具有单位的性质,却因人们长期的习惯而被省略了。数字“零”在人民币中不仅仅代表数字0,它还具有省略的功能,比如“壹仟零壹”中的“零”代表了0*100和0*10。数字“亿”比较特殊,因为在人民币大写中它属于最大的单位,一般情况下,人民币大写允许两位单位汉字连续,比如“壹拾万”,值得注意的是,前一个单位必须小于后一个单位,数字“壹拾万”中的“拾”必须小于“万”,而“壹万万”的表示是错误的,应该写成“壹亿”。注:“壹亿亿”是允许的,因为单位“亿”已经达到最大,所以“亿亿”只能这样表示了,然而生活中基本碰不到“亿亿”的数量级。

人民币大写最大的特点就是数量级跃升。同样的一段数字和单位,遇到不同的“基础单位”,他们代表的意义是不同的。比如数字“1230123”对应人民币“壹佰贰拾叁万零壹佰贰拾叁”,这里“壹佰贰拾叁”的“基础单位”存在“万”和“个”,因而其分别代表了壹佰贰拾叁万和壹佰贰拾叁。所谓“基础单位”是指“个”,“万”,“亿”等10000的倍数,根据人民的习惯,如果金额达到了万的数量级就用XXX万表示,如果金额达到了亿的数量级就用XXX亿来表示,这样的表示方法能够直观的看出金额的最大量级(基础单位),而一般情况下默认省略的基础单位是“个”。如果能把握基础单位在数字计算中的作用,我们就能解析人民币大写金额,并实现转化过程。

由于人民币存在很多非数字非单位意义的汉字,同时又省略了很多有计算意义的汉字,所以我们在真正转换前需要一些特殊处理(preWork)。这些处理不仅能够使人民币金额变得简洁完整,而且为了方便数字的顺序解析,我们还需要将人民币字符翻转,从左到右单位变为从小到大(同一个基础单位)。对于“个玖拾捌佰柒仟陆万零伍拾肆佰叁仟贰亿壹”的预处理:

① 清除无意义字符

② 翻转

③ 补充单位(基础单位)“个”

④ 顺序解析,遇到基础单位“万”,判断后面的汉字是否为也是单位,如果是则补充数字“零”,否则继续顺序解析

⑤ 顺序解析,遇到基础单位“亿”,后面的字符是数字,顺序解析并结束

金额字符经过预处理极大简化了转换的过程,转换比较简单,从左到右顺序遍历字符串,每次截取出“单位”+“数字”的汉字块并计算数值,最关键的一点就是不能忘记附加基础单位,这是控制金额数量级的重要参数。

/*规整函数:清除零,翻转金额,补充省略单位和数字*/function preWork(str){var res=new Array();str=str.split("").reverse().join("").replace(/零/g,"").replace(/元/g,"").replace(/整/g,"");while(str.length>0){//顺序添加单位if(isNumberExist(str.charAt(0))){res.push("个");//数字作为结尾补充单位res.push(str.charAt(0));str=str.substring(1);continue;}if(isWeightExist(str.charAt(0))){res.push(str.charAt(0));str=str.substring(1);}else{return "";//既不是数字又不是单位}//if(isWeightExist(str.charAt(0))){if(getWeight(res[res.length-1])>getWeight(str.charAt(0))){res.push("零");continue;}else{return "";}}res.push(str.charAt(0));str=str.substring(1);}return res.join("");}

解析过程同样非常简单,将金额数字单位定义在数组中,汉字金额后面是对应的数字,汉字单位后面对应的是数字单位,每次解析的过程:寻找匹配的汉字类型,如果找到该汉字,返回汉字后面的数字,如果没有找到该汉字,则返回异常(-1)。

/*转换函数:实现转换*/function Parse(str){var sum=0;var currentWeight=0;var baseWeight=1;if(str=="")return -1;while(str.length>0){if(str.charAt(0)=="万" || str.charAt(0)=="亿"){baseWeight=baseWeight*10000;str="个"+str.substring(1);}var temp=Calculate(str.substring(0,2),baseWeight);if(temp>=0)sum+=temp;elsereturn -1;str=str.substring(2);}return sum;}

计算过程最为简单,每部分计算的结果=数字*单位*基础单位,其中如果发生解析错误,则返回异常(-1)。

/*计算函数:计算某段数值,异常时返回-1*/function Calculate(str,unit){if(isWeightExist(str.charAt(0))){if(isNumberExist(str.charAt(1))){return getWeight(str.charAt(0))*getNumber(str.charAt(1))*unit;}else{return -1;}}//单位+数字if(isNumberExist(str.charAt(0))){if(isWeightExist(str.charAt(1))){getNumber(str.charAt(0))*getWeight(str.charAt(1))*unit;}else{return -1;}}//数字+单位//非数字或单位:异常return -1;}

其他必要的函数:

function isNumberExist(num){var numberList=new Array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖");if(numberList.indexOf(num)<0)return false;elsereturn true;}function isWeightExist(wei){var weightList=new Array("分","角","个","拾","佰","仟","万","亿");if(weightList.indexOf(wei)<0)return false;elsereturn true;}function getNumber(num){var numberSample=new Array("零","0","壹","1","贰","2","叁","3","肆","4","伍","5","陆","6","柒","7","捌","8","玖","9");return Number(numberSample[numberSample.indexOf(num)+1]); }function getWeight(wei){var weightSample=new Array("分","0.01","角","0.1","个","1","拾","10","佰","100","仟","1000","万","10000","亿","100000000");return Number(weightSample[weightSample.indexOf(wei)+1]);}

调用方法:

alert(Parse(preWork("壹万贰仟叁佰肆拾伍")));

结果:

在实际的转换过程中,输入的人民币大写金额被限制在壹亿亿一下,因为日常情况下基本达不到亿亿级别。人民币大写的金额精度只有小数点后两位,“厘”也是汉字单位,同样的在生活中很少见到(单位“厘”在利息计算中比较常见一些),所以转换前不需要考虑。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。