Numberbox组件

2018-09-13  本文已影响0人  zhanggongzi

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>number</title>
</head>
<body>

<input id="number-textbox" min="1" max="100000" precision="2" toChinese='money' >
<script type="text/javascript">
    (function(window){
        function Numberbox(obj){
            this.el = document.getElementById(obj.el);
            if(!this.el) return;
            var defaults = {
                disabled: false,
                toChinese:null,
                min: null,
                max: null,
                precision: 0,
                setThousandChar:true,
                onChange:function(value){},
                onKeyup:function(){},
                onBlur:function(){}
            };
            var options = {
                disabled: (this.el.getAttribute('disabled') ? true : undefined),
                min: (this.el.getAttribute('min')=='0' ? 0 : parseFloat(this.el.getAttribute('min')) || undefined),
                max: (this.el.getAttribute('max')=='0' ? 0 : parseFloat(this.el.getAttribute('max')) || undefined),
                precision: (parseInt(this.el.getAttribute('precision')) || undefined)
            }
            this.options = extend(defaults,options);
            this.options = extend(this.options,obj);
            var self = this;
            this.el.onkeyup = function(){
                var opts = self.options;
                var num = this.value;
                if(num.indexOf(',')>0) num =num.replace(/,/g,'');
                if (isNaN(num)){
                    this.value = '';
                    return;
                }
                if (opts.min != null && opts.min != undefined && num < opts.min){
                    this.value = opts.min.toFixed(opts.precision);
                } else if (opts.max != null && opts.max != undefined && num > opts.max){
                    this.value = opts.max.toFixed(opts.precision);
                } else {
                    this.value = String(opts.setThousandChar)=="true"?formatNumber(num):num;
                }
                if(opts.toChinese=='number'){
                    toChineseNumber(parseFloat(num),this);
                }else if(opts.toChinese=='money'){
                    toChineseMoney(parseFloat(num),this);
                }
            }
            this.el.onkeypress = function(e){
                if (e.which == 45){ //-
                    return true;
        } if (e.which == 46) {  //.
            return true;
        }
        else if ((e.which >= 48 && e.which <= 57 && e.ctrlKey == false && e.shiftKey == false) || e.which == 0 || e.which == 8) {
            return true;
        } else if (e.ctrlKey == true && (e.which == 99 || e.which == 118)) {
            return true;
        } else {
            return false;
        }
    }
    this.el.onblur = function(){
        self.fixValue();
    }
    this.el.onpaste = function(e){
        if (window.clipboardData) {
            var s = clipboardData.getData('text');
            if (/^[\d\.\,]*$/.test(s)) {
                return true;
            } else {
                return false;
            }
        } else {
            var clipboardData = e.originalEvent ? e.originalEvent.clipboardData : e.clipboardData || null;
            var val = clipboardData.getData('text') || "";
            //val = val.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,'');
            if (/^[\d\.\,]*$/.test(val)){
                return true;
            }else{
                return false;
            }
        }
    }
    this.el.ondragenter =function(){
        return false;
    }
}
function extend(obj){
    var obj2 = Array.prototype.slice.call(arguments, 1)[0];
    if(obj2){
        for(var key in obj2){
            obj[key] = obj2[key];
        }
    }
    return obj;
}

function formatNumber(num,precision){
    if(!/^(\+|-)?(\d+)(,\d{3})*(\.|\.\d+)?$/.test(num)){
        return num;
    }
    var a = RegExp.$1,b = RegExp.$2,c = RegExp.$4;
    var re = /(\d)(\d{3})(,|$)/;
    while(re.test(b)){
        b = b.replace(re,"$1,$2$3");
    }
    return  precision == null ? a +""+ b +""+ c : a +""+ b +""+ c.toFixed(precision);
}
function toChineseMoney(n, obj) {
    var MAX = 9999999999999.99;
    if(n>MAX) ret="数据过大!";
    else if (!/^(0|[1-9]\d*)(\.\d*)?$/.test(n)){
        ret = "";
    }else{
        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);
            if(str=='零元零角零分') {
                ret = '零元';
            }
            else{
                var ret = str.replace(/零(仟|佰|拾|角)/g, "零").replace(/(零)+/g, "零").replace(/零(万|亿|元)/g, "$1").replace(/(亿)万/g, "$1").replace(/^元零?|零分/g, "").replace(/元$/g, "元整");
            }
        //ret += "(转译小数点后两位)";
    }
    // if (obj) {
    //  $(obj).closest('td').width('auto'); // 在IE7下需要将父td结点的宽度变成auto,才能保证转译成中文的字符显示在同一行。 @author 朱庭乐
    //     var $span = $(obj).next("span");
    //     if($span.hasClass("validatebox-must")){
    //         $span.next("span.to-chinese").remove();
    //         if(ret)
    //             $span.after("<span class='to-chinese' style='color:red;font:14px 宋体;'><b>" + ret + "</b></span>");
    //     }else{
    //         $span.remove();
    //         if(ret)
    //             $(obj).after("<span class='to-chinese' style='color:red;font:14px 宋体;'><b>" + ret + "</b></span>");
    //     }
    // }
    console.log(ret);
    return ret;
}
function toChineseNumber(n, obj) {
    var MAX = 9999999999999.99;
    if(n>MAX) ret="数据过大!";
    else if (!/^(0|[1-9]\d*)(\.\d*)?$/.test(n)){
        ret = "";
    }else{
        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+2);
        for (var i = 0; i < n.length; i++) str += '零壹贰叁肆伍陆柒捌玖'.charAt(n.charAt(i)) + unit.charAt(i);
            if(str=='零点零零') {
                ret = '零';
            }else{
                var ret = str.replace(/点零零/g, "").replace(/零(仟|佰|拾)/g, "零").replace(/(零)+/g, "零").replace(/零(万|亿)/g, "$1").replace(/(亿)万/g, "$1").replace(/零$/g, "");
            }
        //ret += "(转译小数点后两位)";
    }
    console.log(ret);
    return ret;
}
Numberbox.prototype = {
    setDisabled:function(flag){
        var self = this;
        if(flag){
            this.el.setAttribute('disabled',true);
            this.options.disabled = true;
            this.el.style.backgroundColor = '#ccc';
        }else{
            this.el.removeAttribute('disabled');
            this.options.disabled = false;
            this.el.style.backgroundColor = '#fff';
        }
    },
    fixValue :function(){
        var self = this;
        var opts = self.options;
        var num = self.el.value;
        if(num.indexOf(',')>0) num =num.replace(/,/g,'');
        var val = num.indexOf('.') > 0 ? parseFloat(num).toFixed(opts.precision) : parseFloat(num);
        if (isNaN(val)){
        //$(target).val('').siblings("span.to-chinese").remove();
        return;
    }       
    if (opts.min != null && opts.min != undefined && val < opts.min){
        self.el.value = opts.min.toFixed(opts.precision);
    } else if (opts.max != null && opts.max != undefined && val > opts.max){
        self.el.value = opts.max.toFixed(opts.precision);
    } else {
        ////是否设置千位符 addby fengqf@20140108
        self.el.value = String(opts.setThousandChar)=="true"?formatNumber(val):val;
    }
    if(opts.toChinese=='number'){
        toChineseNumber(parseFloat(val),self.el);
    }else if(opts.toChinese=='money'){
        toChineseMoney(parseFloat(val),self.el);
    }
}

}
window.Numberbox = Numberbox;
})(window)
</script>
<script type="text/javascript">
var a = new Numberbox({
//容器
el:'number-textbox',
//当前页码
disabled:'true',
toChinese:'money'
});
</script>
</body>
</html>

上一篇下一篇

猜你喜欢

热点阅读