JavaScript 人民币数字转换成大写

2008-04-15 11:15 | 分类 WebDev | By ming | 发表评论 »

    前些天刚好用到,在网上搜出来就那么一个,看起来比较乱,所以干脆自已写一个。主要是利用数组来完成(刚好那么多个元素),目前最大支持到千亿为止。

<html>
<body>
人民币数值:<input type='text' id='fchars' />
<input type='button' id='fsubmit' value='转换' />
<hr />
结果:<div id='fresult'></div>

<script type='text/javascript'>
var $ = function(id) {
    return document.getElementById(id);
};
$('fsubmit').onclick = function() {
    $('fresult').innerHTML = new rmbConverter().transToUpper($('fchars').value);
};

var rmbConverter = function() {
};

rmbConverter.prototype = {
    upperChars: ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'],
    /*数组刚好10个元素,下标从0到9,那么数字0-9刚好对应upperChars[0-9]*/
    upperUnits: ['', '拾', '佰', '仟', '万', '亿'],
    /*转换四位数*/
    transThousand: function(floatStr) {
        var tdata = {
            result: parseInt(floatStr) > 0,/*是否全为零*/
            data: [],
            bZero: false/*低位全为零*/
        };
        if (tdata.result) {
            /*从高位开始取*/
            for (var l = floatStr.length, i = l - 1; i >= 0; i--) {
                var notZero = floatStr.charAt(i) > 0;
                if (notZero) {
                    tdata.data.push(this.upperChars[floatStr.charAt(i)]);
                    tdata.data.push(this.upperUnits[i]);
                } else {
                    if (parseInt(floatStr.substr(0, i + 1)) == 0) {
                        tdata.bZero = true;
                        continue;
                    }
                    tdata.data.push(this.upperChars[0]);
                }
            }
            tdata.data = tdata.data.join('').replace(/[\u96F6]+/g,'\u96F6');
            /*对可能出现的多个相连的零更换成单个*/
        }
        return tdata;
    },
    transLeft: function(floatStr) {/*转换整数部分*/
        var result = [];
        floatStr = floatStr.split('').reverse().join('');/*反转字符串*/
        for (var l = floatStr.length, i = 0; i < l; i += 4) {
            /*每次取四个转换*/
            var tdata = this.transThousand(floatStr.substr(i, 4));
            if (tdata.result) {
                if (tdata.bZero)
                    result.unshift(this.upperChars[0]);//补全低位的零
                if (i == 4)
                    result.unshift(this.upperUnits[4]);
                else if (i == 8)
                    result.unshift(this.upperUnits[5]);
                result.unshift(tdata.data);               
            }
        }
        return result.join('').replace(/[\u96F6]+/g,'\u96F6');
    },
    transToUpper: function(floatStr) {
        var result = [];
        var floatArr = ('' + floatStr).split('.');//把人民币分割成两部分:整数、小数
        if (floatArr.length > 1) {
            for (var i = 0, l = floatArr[1].length; i < l && i < 2; i++) {/*只保留两位小数*/
                result.unshift(this.upperChars[floatArr[1].charAt(i)]);
            }
            result.push(' 点 ');/*整数、小数之间分隔符*/
        }
        result.push(this.transLeft(floatArr[0]));
        return result.reverse().join('');
    }
};
</script>
</body></html>

使用 var converter =  new rmbConverter();

     converter.transToUpper(123456789.012);

    结果:"壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖 点 零壹"


Tags:

转载请遵循"署名-非商业性使用-相同方式共享" 的创作共用协议。

返回正文

留下评论

(如发言后未显示则有待审核)