数字大小写转换问题

稿件来源: 阳光企业网站管理系统   撰稿作者: 太阳光   发表日期: 2015-05-12   阅读次数: 46   查看权限: 游客查看

编程实现将中文的“贰仟零伍亿叁佰扒拾万零叁拾”转换为“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)
共有0 条评论 发言请遵守【相关规定

网友评论

会员头像
发 表同步腾讯微博    验证码:  点击更新请先登陆
  • 暂无评论
关闭模块文章图片 article Pictrue
  • 我的妈妈爸爸
  • 基于koa2+mysql+vue2.0+Element阳光内容管理系统
  • 代码覆盖率工具 Istanbul 入门教程
  • 全栈工程师的武器——MEAN
  • 9款超炫的 CSS3 复选框(Checkbox)
  • 微信开发在线翻译功能
  • CSS3那些不为人知的高级属性
  • 给easyui的datebox添加清空事件
  • flash写字效果
  • kendoUI系列教程之DropDownList下拉菜单
  • kendoUI系列教程之datetimepicker日期时间选择
  • kendoUI系列教程之datepicker日期选择
  • kendoUI系列教程之combobox下拉列表框
  • kendoUI系列教程之colorpicker
  • kendoUI系列教程之calendar日历表
  • kendoUI系列教程之autocomplete自动补齐