JavaScript/ExtJS

Extjs NumberField 수정

Jake Kim 2010. 2. 24. 15:27

기본적으로 Extjs의 NumberField를 사용하게 되면 숫자형식을 벋어난 값은 입력 받을 수 없게 만들어 준다.

허용된 값들은 0-9 . - 이다.

여기서는 좀더 효과적인 NumberField 를 사용하기 위해 몇가지를 수정 했다.

1. onkeyup를 통해서 숫자값 확인
2. 숫자에 콤마 붙이기
3. 음수 확인
4. 소숫점 확인

Ext.onReady(function() {
ChageTextFieldToNumberField("textTest"); //이벤트에 적용할 필드명
//값이 여러개 일경우
//ChageTextFieldToNumberField("id1","id2","id3");
});

function toNumber(v) {
	var val;
	var n = (String(v).replace(/[^\d.]/g, ""));
	if (n.indexOf('.') >= 0) {
		val = Number(String(n.split('.')[0]).replace(/[^\d]/g, "")).toLocaleString().slice(0, -3)
			+ "." + 
			String(n.split('.')[1].replace(/[^\d]/g, ""));
	}
	else {
		val = Number(String(n).replace(/[^\d]/g, "")).toLocaleString().slice(0, -3);
	}
	//음수처리
	if (v.indexOf('-') >= 0) {
		val = "-" + val;
	}
	return val;
}
function onKeyUp_Event(field, e) {
	var v = field.getRawValue();
	field.setRawValue(toNumber(v));            
}
function ChageTextFieldToNumberField(){
	for(var i = 0 ; i < arguments.length ; i++)
	{
		var textField = arguments[i];
		if(document.getElementById(textField) != undefined)
		{
			var targetInput = document.getElementById(textField);

			var number = new Ext.form.NumberField({
				applyTo: targetInput,
				id: targetInput.id,
				allowBlank: true,
				allowNegative: true,
				selectOnFocus: true,
				enableKeyEvents: true,
				listeners: {
					scope: this,
					keyup: onKeyUp_Event
				}
			});
		}//end if
	}//end loop
} //end funtion


//Ext.form.NumberField 오버라이드를 통해 기본 메서드 변경
Ext.override(
	Ext.form.NumberField, {
		setValue: function(v) {
			v = v.replace(/,/g, "");//추가
			v = typeof v == 'number' ? v : parseFloat(String(v).replace(this.decimalSeparator, "."));
			v = isNaN(v) ? '' : String(v).replace(".", this.decimalSeparator);

			v = toNumber(v);//추가
			return Ext.form.NumberField.superclass.setValue.call(this, v);
		},
		validateValue: function(value) {
			value = value.replace(/,/g, "");//추가

			if (!Ext.form.NumberField.superclass.validateValue.call(this, value)) {
				return false;
			}
			if (value.length < 1) {
				return true;
			}
			value = String(value).replace(this.decimalSeparator, ".");

			if (isNaN(value)) {
				this.markInvalid(String.format(this.nanText, value));
				return false;
			}
			var num = this.parseValue(value);
			if (num < this.minValue) {
				this.markInvalid(String.format(this.minText, this.minValue));
				return false;
			}
			if (num > this.maxValue) {
				this.markInvalid(String.format(this.maxText, this.maxValue));
				return false;
			}
			return true;
		},
		beforeBlur: function() {
			//내용수정
			this.setValue(this.getRawValue());
		}
	}
);

...

...


TIP.
DB에 저장 해야하는 값중 소숫점의 제한이 있는 경우, 예를 들자면 ORACLE에서 NUMBER(10,2)인 경우 아래 처럼 소스를 추가하자

function toPrecisionNumber(v, scale, precision) {
        if (scale < precision) {
            throw "scale과 precision값을 확인 해주세요. (scale-precision=은 음수가 될수 없음_";
        }
        var val;
        var n = (String(v).replace(/[^\d.]/g, ""));
        if (n.indexOf('.') >= 0) {
            val = Number(String(n.split('.')[0]).replace(/[^\d]/g, "").substring(0, scale - precision)).toLocaleString().slice(0, -3)
                + "." +
                String(n.split('.')[1].replace(/[^\d]/g, "").substring(0, precision));
        }
        else {
            val = Number(String(n).replace(/[^\d]/g, "").substring(0, scale - precision)).toLocaleString().slice(0, -3);
        }

        //음수처리
        if (v.indexOf('-') >= 0) {
            val = "-" + val;
        }
        return val;
    }
    function onKeyUp_Event(field, e) {
        var v = field.getRawValue();
        
        //DB상의 10, 2 같은 값 처리
        var tmpValue = (String(v).replace(/[^\d.]/g, ""));
        var scale = parseInt(field.getEl().getAttribute('scale'));
        var precision = parseInt(field.getEl().getAttribute('precision'));
        
        if (scale && tmpValue.length > 3) {
            if (!precision) {
                precision = "0";
            }
            scale = parseInt(scale);
            precision = parseInt(precision);
            v = toPrecisionNumber(v, scale, precision);
        }
        field.setRawValue(toNumber(v));            
    }

...

...