加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

【正则表达式】——限制只能输入数字和小数点及位数

发布时间:2020-12-14 00:59:01 所属栏目:百科 来源:网络整理
导读:在项目中,特殊字符的输入限制屡见不鲜,可以说,对字符输入的限制,已经是一个程序猿的基本功。常见的字符输入限制有很多类型,如:只能输入汉字;只能输入数字和小数点;只能输入英文字母等。。。 今天,和大家分享一个比较基本的特殊字符输入限制的通用方

在项目中,特殊字符的输入限制屡见不鲜,可以说,对字符输入的限制,已经是一个程序猿的基本功。常见的字符输入限制有很多类型,如:只能输入汉字;只能输入数字和小数点;只能输入英文字母等。。。


今天,和大家分享一个比较基本的特殊字符输入限制的通用方法:只能输入数字和小数点,并且规定小数位数和最大输入值。这个基本可以解决大家数值型输入限制了。


//对文本输入框【按键】事件进行控制,限制只能输入数字、小数点、负号,并可对小数位数进行控制
//该方法只能添加到 文本输入框的 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(/rn/g,''); //替换回车换行符
    return (str.length); //返回文本域文本长度
}


多多积累代码量,把这些日常用的代码储备起来,形成自己的代码库,在开发过程中,开发效率会大大增加。自己在代码量上,实在是有很大差距,需要在项目中逐渐提高。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读