面向互联网编程
近期项目中遇到中文金额计算问题,本着面向互联网编程,一番搜索下来,找到几篇文章:
注:排名不分先后,完全根据个人浏览习惯
- https://www.jianshu.com/p/3b21342e2d8a
- https://www.cnblogs.com/fger/p/11165841.html
- https://blog.csdn.net/qq_16136377/article/details/81192506
功能实现肯定都没问题,可是看着好累,肯定有朋友说:嫌弃别人的代码,要不你来一发?
好的 !-_-!
聊聊思路
首先 看几个常规的中文金额写法:
- 贰拾玖万捌仟
- 捌拾伍万捌仟元
- 叁拾万元
- 玖元肆角伍分
- 贰佰零肆万
从样例可以看出,中文金额由两部分组成: 数值+单位 ,正是因为 单位 的参与让转换变得复杂了,不然直接搞一个 对应表 分分钟就能完成转换,另一种就是按上面几篇文章里面写的:识别数值位 和该数值位的单位,再按位 数值x单位 进行 相加得到 转换数,嗯 是个方法,有没有其他方法?
再来看看大写数的组成:
##单位
'仟', '佰','拾','兆','仟','佰','拾','亿','仟','佰','拾','万','仟','佰','拾','元','角','分'
##数值
'零', '壹' , '贰' , '叁' , '肆' , '伍' , '陆' , '柒' , '捌' , '玖'
仔细观察可以发现,如果把满 单位 的数作为模板,是否可以简化转换? 答案是肯定的
代码实现 (js版本)
var chinese_money='贰佰零伍万玖仟陆佰捌拾伍';
//兼容部分不规范大写数值
CN_NUM = {'〇': 0, '一': 1, '二': 2, '三': 3, '四': 4, '五': 5, '六': 6, '七': 7, '八': 8, '九': 9, '零': 0,
'壹': 1, '贰': 2, '叁': 3, '肆': 4, '伍': 5, '陆': 6, '柒': 7, '捌': 8, '玖': 9, '貮': 2, '两': 2}
//零 不影响数值转换,还会干扰,噪点去掉
chinese_money=replace(chinese_money,'零','');
var to_array=chinese_money.split('');
var stand_unit=['分','角','元','拾','佰','仟','万','拾','佰','仟','亿','拾','佰','仟','兆'];
var index_tag=0;
var result_money=new Array();
//逆序处理
var reverse_array=to_array.reverse();
//使用工具中封装的方法, 浏览器执行直接去掉或者换成 console.log
writeToLog("l","==待转换数值逆序为= "+reverse_array.join(""))
for (var i=0; i<reverse_array.length ;i++ ){
cndig=reverse_array[i];
//是数字
writeToLog("l"," 待转换值 ==="+ cndig +" = 是否为数值 = "+ CN_NUM.hasOwnProperty(cndig) )
if(CN_NUM.hasOwnProperty(cndig) ===true){
writeToLog("l","="+cndig +" =转换数值为= "+CN_NUM[cndig])
if(i===0){
//第一位不是单位, 则设置单位为元
index_tag=3;
result_money.push('.00')
}
result_money.push(CN_NUM[cndig]);
} else {
//是单位
while(index_tag< stand_unit.length ){
writeToLog("l"," index_tag==="+ index_tag+" -- "+stand_unit[index_tag]+" ==="+result_money.join(""))
//找单位下标
var unitdig=stand_unit[index_tag];
index_tag++;
//如果单位出现,等下一个数字,如果元后面不是数字,则要补充一个0
if(unitdig=='元'){
result_money.push('.');
}
if(cndig==unitdig){
//判断单位后 是否为值 比如 叁拾万 逆序后,如果不是则补0
if( (i+1) < reverse_array.length){
if(CN_NUM.hasOwnProperty(reverse_array[i+1])===false){
result_money.push(0);
}
}
break;
}else{
result_money.push(0);
}
}
}
}
writeToLog("l", chinese_money +"== convert to =="+ result_money.reverse().join(''))
后记
整个实现只考虑转化,未做输入合法性控制,代码未使用数值计算,实现的时间复杂度基本固定,好不好用只能看疗效了-_-
网友评论