美文网首页
换个姿势——中文大写金额转换为数值

换个姿势——中文大写金额转换为数值

作者: 河东客 | 来源:发表于2019-11-09 11:45 被阅读0次

面向互联网编程

近期项目中遇到中文金额计算问题,本着面向互联网编程,一番搜索下来,找到几篇文章:
:排名不分先后,完全根据个人浏览习惯

功能实现肯定都没问题,可是看着好累,肯定有朋友说:嫌弃别人的代码,要不你来一发?
好的 !-_-!

聊聊思路

首先 看几个常规的中文金额写法:

  • 贰拾玖万捌仟
  • 捌拾伍万捌仟元
  • 叁拾万元
  • 玖元肆角伍分
  • 贰佰零肆万

从样例可以看出,中文金额由两部分组成: 数值+单位 ,正是因为 单位 的参与让转换变得复杂了,不然直接搞一个 对应表 分分钟就能完成转换,另一种就是按上面几篇文章里面写的:识别数值位 和该数值位的单位,再按位 数值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(''))

后记

整个实现只考虑转化,未做输入合法性控制,代码未使用数值计算,实现的时间复杂度基本固定,好不好用只能看疗效了-_-

相关文章

网友评论

      本文标题:换个姿势——中文大写金额转换为数值

      本文链接:https://www.haomeiwen.com/subject/aibgbctx.html