Разрешить только цифры и точки в сценарии - PullRequest
15 голосов
/ 21 марта 2012

Я использую этот javascript для ограничения пользователей на ввод только цифр и только одной точки в качестве десятичного разделителя.

<script type="text/javascript">
 function fun_AllowOnlyAmountAndDot(txt)
        {
            if(event.keyCode > 47 && event.keyCode < 58 || event.keyCode == 46)
            {
               var txtbx=document.getElementById(txt);
               var amount = document.getElementById(txt).value;
               var present=0;
               var count=0;

               if(amount.indexOf(".",present)||amount.indexOf(".",present+1));
               {
              // alert('0');
               }

              /*if(amount.length==2)
              {
                if(event.keyCode != 46)
                return false;
              }*/
               do
               {
               present=amount.indexOf(".",present);
               if(present!=-1)
                {
                 count++;
                 present++;
                 }
               }
               while(present!=-1);
               if(present==-1 && amount.length==0 && event.keyCode == 46)
               {
                    event.keyCode=0;
                    //alert("Wrong position of decimal point not  allowed !!");
                    return false;
               }

               if(count>=1 && event.keyCode == 46)
               {

                    event.keyCode=0;
                    //alert("Only one decimal point is allowed !!");
                    return false;
               }
               if(count==1)
               {
                var lastdigits=amount.substring(amount.indexOf(".")+1,amount.length);
                if(lastdigits.length>=2)
                            {
                              //alert("Two decimal places only allowed");
                              event.keyCode=0;
                              return false;
                              }
               }
                    return true;
            }
            else
            {
                    event.keyCode=0;
                    //alert("Only Numbers with dot allowed !!");
                    return false;
            }

        }

    </script>

<td align="right">
<asp:TextBox ID="txtQ1gTarget" runat="server" Width="30px" CssClass="txtbx" MaxLength="6" onkeypress="return fun_AllowOnlyAmountAndDot(this);"></asp:TextBox>
</td>

Но событие onkeypress (this) возвращает требуемую ошибку объекта в этой функции в этом месте

var amount = document.getElementById(txt).value;

В чем здесь моя ошибка?

Ответы [ 13 ]

37 голосов
/ 21 марта 2012

Это отличное место для использования регулярных выражений.

Используя регулярное выражение, вы можете заменить весь этот код одной строкой.

Вы можетеиспользуйте следующие регулярные выражения для подтверждения ваших требований:

[0-9]*\.?[0-9]*

Другими словами: ноль или более числовых символов, за которыми следуют ноль или один период (ы),а затем ноль или более цифр.

Вы можете заменить свой код следующим:

function validate(s) {
    var rgx = /^[0-9]*\.?[0-9]*$/;
    return s.match(rgx);
}

Этот код может заменить всю вашу функцию!

Обратите внимание, что вы должны избегать точки с обратной косой чертой (в противном случае это означает «любой символ»).

Для получения дополнительной информации об использовании регулярных выражений с javascript, проверьте это:

Вы также можете проверить вышеприведенное регулярное выражение здесь:


Объяснение используемого регулярного выражениявыше:

  • Скобки означают « любой символ внутри этих скобок ».Вы можете использовать дефис (как выше), чтобы указать диапазон символов.

  • * означает « ноль или более от предыдущего выражения

  • [0-9]* означает « ноль или более цифр"

  • Обратная косая черта используется в качестве escape-символа для точки, поскольку точка обычно означает" любой символ ."

  • ? означает « ноль или один из предыдущих символов

  • ^ представляетначало строки.

  • $ представляет конец строки.

  • Начиная регулярное выражение с ^ и заканчивая$ гарантирует, что строка вся будет соответствовать шаблону регулярных выражений.

Надеюсь, это поможет!

15 голосов
/ 21 марта 2012

Используйте взамен Jquery.Добавьте десятичный класс к вашему текстовому полю:

<input type="text" class="decimal" value="" />

Используйте этот код в вашем JS.Он проверяет наличие нескольких десятичных знаков, а также ограничивает пользователей для ввода только чисел.

$('.decimal').keyup(function(){
    var val = $(this).val();
    if(isNaN(val)){
         val = val.replace(/[^0-9\.]/g,'');
         if(val.split('.').length>2) 
             val =val.replace(/\.+$/,"");
    }
    $(this).val(val); 
});​

Проверьте эту скрипту: http://jsfiddle.net/2YW8g/

Надеюсь, это поможет.

9 голосов
/ 21 марта 2012

Вместо использования этого:

onkeypress="return fun_AllowOnlyAmountAndDot(this);"

Вы должны использовать это:

onkeypress="return fun_AllowOnlyAmountAndDot(this.id);"

6 голосов
/ 22 декабря 2015

function isNumberKey(evt,id)
{
	try{
        var charCode = (evt.which) ? evt.which : event.keyCode;
  
        if(charCode==46){
            var txt=document.getElementById(id).value;
            if(!(txt.indexOf(".") > -1)){
	
                return true;
            }
        }
        if (charCode > 31 && (charCode < 48 || charCode > 57) )
            return false;

        return true;
	}catch(w){
		alert(w);
	}
}
<html>
  <head>
  </head>
  <body>
    <INPUT id="txtChar" onkeypress="return isNumberKey(event,this.id)" type="text" name="txtChar">
  </body>
</html>
5 голосов
/ 03 марта 2017

Просто добавьте код ниже во введенный текст:

onkeypress='return event.charCode == 46 || (event.charCode >= 48 && event.charCode <= 57)'
3 голосов
/ 09 сентября 2016
<input type="text" class="decimal" value="" />
$('.decimal').keypress(function(evt){
    return (/^[0-9]*\.?[0-9]*$/).test($(this).val()+evt.key);
});

Я думаю, что это простое решение может быть.

2 голосов
/ 06 сентября 2012

Это работает лучше всего для меня.

Я также применяю средство форматирования валюты к размытию, где десятичная часть округляется до 2 цифр на всякий случай после проверки с помощью parseFloat.

Функции, которые получают и устанавливают позицию курсора, взяты из блога Вишала Монпара. Я также делаю некоторые приятные вещи с этими функциями. При желании вы можете легко удалить 2 блока кода, в которых вводятся 2 десятичных знака, и избавиться от функций set / get caret.

<html>
<body>
<input type="text" size="30" maxlength="30" onkeypress="return numericValidation(this,event);" />
<script language="JavaScript">
    function numericValidation(obj,evt) {
        var e = event || evt; // for trans-browser compatibility

        var charCode = e.which || e.keyCode;        

        if (charCode == 46) { //one dot
            if (obj.value.indexOf(".") > -1)
                return false;
            else {
                //---if the dot is positioned in the middle give the user a surprise, remember: just 2 decimals allowed
                var idx = doGetCaretPosition(obj);
                var part1 = obj.value.substr(0,idx),
                    part2 = obj.value.substring(idx);

                if (part2.length > 2) {
                    obj.value = part1 + "." + part2.substr(0,2);
                    setCaretPosition(obj, idx + 1);
                    return false;
                }//---

                //allow one dot if not cheating
                return true;
            }
        }
        else if (charCode > 31 && (charCode < 48 || charCode > 57)) { //just numbers
            return false;
        }

        //---just 2 decimals stubborn!
        var arr = obj.value.split(".") , pos = doGetCaretPosition(obj);

        if (arr.length == 2 && pos > arr[0].length && arr[1].length == 2)                               
            return false;
        //---

        //ok it's a number
        return true;
    }

    function doGetCaretPosition (ctrl) {
        var CaretPos = 0;   // IE Support
        if (document.selection) {
        ctrl.focus ();
            var Sel = document.selection.createRange ();
            Sel.moveStart ('character', -ctrl.value.length);
            CaretPos = Sel.text.length;
        }
        // Firefox support
        else if (ctrl.selectionStart || ctrl.selectionStart == '0')
            CaretPos = ctrl.selectionStart;
        return (CaretPos);
    }

    function setCaretPosition(ctrl, pos){
        if(ctrl.setSelectionRange)
        {
            ctrl.focus();
            ctrl.setSelectionRange(pos,pos);
        }
        else if (ctrl.createTextRange) {
            var range = ctrl.createTextRange();
            range.collapse(true);
            range.moveEnd('character', pos);
            range.moveStart('character', pos);
            range.select();
        }
    }
</script>
</body>
</html>
1 голос
/ 08 декабря 2016

Попробуйте это для нескольких текстовых файлов (используя селектор классов):

Нажмите здесь, например, ..

var checking = function(event){
	var data = this.value;
	if((event.charCode>= 48 && event.charCode <= 57) || event.charCode== 46 ||event.charCode == 0){
		if(data.indexOf('.') > -1){
 			if(event.charCode== 46)
  				event.preventDefault();
		}
	}else
		event.preventDefault();
	};

	function addListener(list){
		for(var i=0;i<list.length;i++){
    		list[i].addEventListener('keypress',checking);
    	}
	}
	var classList = document.getElementsByClassName('number');
	addListener(classList);
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
  <input type="text" class="number" value="" /><br><br>
  <input type="text" class="number" value="" /><br><br>
  <input type="text" class="number" value="" /><br><br>
  <input type="text" class="number" value="" /><br><br>
</body>
</html>
1 голос
/ 08 декабря 2016

попробуйте этот код

var check = function(evt){

var data = document.getElementById('num').value;
if((evt.charCode>= 48 && evt.charCode <= 57) || evt.charCode== 46 ||evt.charCode == 0){
if(data.indexOf('.') > -1){
 if(evt.charCode== 46)
  evt.preventDefault();
}
}else
evt.preventDefault();
};

document.getElementById('num').addEventListener('keypress',check);
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
<input type="text" id="num" value="" />



</body>
</html>
1 голос
/ 11 сентября 2013
function isNumber(evt) {
    evt = (evt) ? evt : window.event;
    var charCode = (evt.which) ? evt.which : evt.keyCode;
    if (charCode > 31 && (charCode < 46 || charCode > 57)) {
        return false;
    }
    return true;
}

Вы должны использовать эту функцию и написать свойства этого элемента;

HTML-код:

<input id="deneme" data-mini="true" onKeyPress="return isNumber(event)" type="text"/>`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...