1. 程式人生 > >【正則表示式】——限制只能輸入數字和小數點及位數

【正則表示式】——限制只能輸入數字和小數點及位數

      在專案中,特殊字元的輸入限制屢見不鮮,可以說,對字元輸入的限制,已經是一個程式猿的基本功。常見的字元輸入限制有很多型別,如:只能輸入漢字;只能輸入數字和小數點;只能輸入英文字母等。。。

      今天,和大家分享一個比較基本的特殊字元輸入限制的通用方法:只能輸入數字和小數點,並且規定小數位數和最大輸入值。這個基本可以解決大家數值型輸入限制了。

//對文字輸入框【按鍵】事件進行控制,限制只能輸入數字、小數點、負號,並可對小數位數進行控制
//該方法只能新增到 文字輸入框的 onkeypress事件
//  引數obj:        輸入框物件
//  引數_fragMaxLen: 小數位長度,預設值為2, -1表示不限制小數位長度,0表示只能輸入整數
//  引數_hasNegative: 是否允許輸入負號,預設為true,即允許
//示例:
//   <input maxlength="10" onfocus="this.select()" onkeypress="return inputFloatCheck(this, 3);"
//   onpaste="inputFloatPaste(this)" ondrop="event.returnValue = false;" onblur="inputFloatCheck(this, 3)"/>
function inputFloatCheck(obj, _fragMaxLen, _hasNegative, _maxValue) {
    //alert(event.keyCode + "" + event.shiftKey);
    //alert();
    if (document.selection.type.toLowerCase() == "text") {
        document.selection.clear();
    }
    var fragMaxLen = 2;
    var isHasNegative = true;
    if (arguments.length > 1) {
        try {
            fragMaxLen = parseInt(arguments[1]);
        } catch (e) { }
    }
    if (arguments.length > 2) {
        try {
            isHasNegative = arguments[2];
        } catch (e) { }
    }
    var nCursorPos = getTextInputCursorPos(obj);
    var maxValue = undefined;
    if (arguments.length > 3) {
        try {
            maxValue = parseFloat(arguments[3]);
        } catch (e) { }
    }
    if (event.keyCode >= 48 && event.keyCode <= 57) {
        if (maxValue != undefined) { //判斷是否大於給定的最大值
            var testValue = obj.value.substring(0, nCursorPos) + (event.keyCode - 48) + obj.value.substring(nCursorPos);
            testValue = parseFloat(testValue);
            if (testValue > maxValue) {
                event.returnValue = false;
                return false;
            }
        }
    }
    if (event.keyCode >= 48 && event.keyCode <= 57) {
        if (fragMaxLen > 0) { //如果有小數位限制
            var nDotPos = obj.value.indexOf(".");
            if (nDotPos > -1) {//如果當前已經有小數點
                if (nCursorPos > nDotPos) { //游標在小數點後
                    var str1 = obj.value.substring(nDotPos + 1);
                    if (str1.length >= fragMaxLen) {//當前小數位長度超過最大小數位長度
                        event.returnValue = false;
                        return false;
                    }
                }
            }
        }
        return true;
    }
    if (event.keyCode == 45 && isHasNegative) {//輸入負號

        if (obj.value.indexOf("-") > -1) { //已經有負號,則不允許再輸入

        } else {		//如果當前沒有負號,則負號只能出現在第一個字元位置
            if (getTextInputCursorPos(obj) == 0) {
                return true;
            }
        }
        event.returnValue = false;
        return false;
    }
    if (fragMaxLen != 0) { //fragMaxLen==0 表示只能輸入整數
        if (event.keyCode == 46) { //輸入小數點
            if (obj.value.indexOf(".") > -1) {//已經有小數點,則不允許再輸入
            } else if (obj.value.indexOf("-") > -1) {		//如果當前沒有小數點,有負號,則小數點不能在負號之前
                if (getTextInputCursorPos(obj) > 0) {
                    return true;
                }
            } else {
                return true;
            }
            event.returnValue = false;
            return false;
        }
    }
    event.returnValue = false;
    return false;
}

function getTextInputCursorPos(obj) {
    var rngSel = document.selection.createRange(); //建立選擇域
    var rngTxt = obj.createTextRange(); //建立文字域
    var flag = rngSel.getBookmark(); //用選擇域建立書籤
    rngTxt.collapse(); //瓦解文字域到開始位,以便使標誌位移動
    rngTxt.moveToBookmark(flag); //使文字域移動到書籤位
    rngTxt.moveStart('character', -obj.value.length); //獲得文字域左側文字
    str = rngTxt.text.replace(/\r\n/g, ''); //替換回車換行符
    return (str.length); //返回文字域文字長度
}

      多多積累程式碼量,把這些日常用的程式碼儲備起來,形成自己的程式碼庫,在開發過程中,開發效率會大大增加。自己在程式碼量上,實在是有很大差距,需要在專案中逐漸提高。