jQuery: как лучше всего ограничить ввод только чисел для текстовых полей? (разрешить десятичные точки)

Как лучше всего ограничить ввод только "чисел" для текстовых полей?

Я ищу что-то, что позволяет использовать десятичные точки.

Я вижу много примеров. Но еще предстоит решить, какой из них использовать.

Обновление от Правин Джеганатан

Больше никаких плагинов, jQuery реализовал свой собственный jQuery.isNumeric(), добавленный в v1.7. См .: https://stackoverflow.com/a/20186188/66767


person wenbert    schedule 21.05.2009    source источник
comment
Это вопрос, основанный на мнении, но очень полезный. Вопросы, основанные на мнении, должны быть разрешены. Человеку, который ищет эту информацию, нужно только знать, что это только ответы, основанные на мнении. ТЭГА было бы достаточно.   -  person Thiago C. S Ventura    schedule 28.04.2014


Ответы (40)


Обновлять

Для этого есть новое и очень простое решение:

Он позволяет использовать любой фильтр ввода для текста <input>, включая различные числовые фильтры. Это будет правильно обрабатывать копирование + вставку, перетаскивание + удаление, сочетания клавиш, операции контекстного меню, клавиши без ввода и все раскладки клавиатуры.

См. этот ответ или попробуйте сами на JSFiddle.

плагин jquery.numeric

Я успешно реализовал множество форм с помощью jquery.numeric плагин.

$(document).ready(function(){
    $(".numeric").numeric();
});

Более того, это работает и с текстовыми полями!

Однако обратите внимание, что Ctrl + A, Копировать + Вставить (через контекстное меню) и Перетаскивать + Drop не работают должным образом.

HTML 5

Благодаря более широкой поддержке стандарта HTML 5 мы можем использовать атрибут pattern и тип number для элементов input, чтобы ограничить ввод только числа. В некоторых браузерах (особенно в Google Chrome) он также ограничивает вставку нечислового содержимого. Дополнительная информация о number и других новых типах ввода доступна здесь.

person TheVillageIdiot    schedule 21.05.2009
comment
Этот плагин не позволяет использовать backspace в Opera. - person Darryl Hein; 01.08.2009
comment
@Darryl, исходный текст состоит всего из нескольких десятков строк, поэтому я уверен, что модифицирую его, чтобы это было тривиально. Я только что нашел этот плагин и изменил его так, что теперь есть опция allowDecimal для тех случаев, когда я хочу разрешить только целочисленные значения ... источник очень прост и хорошо написан. - person Earlz; 30.06.2010
comment
Это не работает при копировании и вставке в поля ввода с type="number". - person Tallmaris; 13.05.2013
comment
@Tallmaris, это действительно очень старый вопрос и ответ. В HTML внесено много изменений, и это следует учитывать. - person TheVillageIdiot; 14.05.2013
comment
Привет, @TheVillageIdiot, ты прав. Я не хотел показаться грубым в комментарии (который, вероятно, немного суховат) :) Дело в том, что я видел несколько недавних комментариев, поэтому я просто хотел уточнить, что это, вероятно, на данный момент, не лучшее решение для проблема. - person Tallmaris; 14.05.2013
comment
Он каким-то образом блокирует некоторые плагины jQUery - person DmitryBoyko; 17.07.2014
comment
Еще одна проблема с этим плагином заключается в том, что что угодно можно скопировать и вставить в поле ввода. Вы должны знать об этом поведении! Быстрое хакерское решение для целых чисел может заключаться в присоединении обработчика события изменения с кодом из приведенного ниже ответа, который может выглядеть так: control.val(control.val().replace(/[^0-9\.]/g, "")); - person Christoph Meißner; 17.12.2014
comment
Если вы выберете строку рядом и перетащите ее внутрь поля, плагин не разрешает числовые символы. - person Marcelo Rodovalho; 23.11.2015
comment
это позволяет использовать одиночную цитату, например 123'09 '' - person Ali; 05.06.2016

Если вы хотите ограничить ввод (в отличие от проверки), вы можете работать с ключевыми событиями. что-то вроде этого:

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

И:

jQuery('.numbersOnly').keyup(function () { 
    this.value = this.value.replace(/[^0-9\.]/g,'');
});

Это сразу дает пользователю понять, что он не может вводить буквенные символы и т. Д., А не позже, на этапе проверки.

Вы все равно захотите проверить, потому что ввод может быть заполнен путем вырезания и вставки с помощью мыши или, возможно, с помощью автозаполнения формы, которое может не запускать ключевые события.

person Keith Bentrup    schedule 21.05.2009
comment
+1 - Я собирался предложить то же самое. Стоит отметить, что эта форма проверки может выполняться при нажатии клавиши, а не в конце. Единственное, что я бы добавил, - это некоторая форма предупреждения о том, что то, что вводит пользователь, отклоняется. Если просто не отображать буквы, очень многие люди подумают, что их клавиатура сломана. возможно, слегка измените цвет фона или границы ... до тех пор, пока пользователь знает, что ваше приложение действительно что-то делает. - person nickf; 21.05.2009
comment
согласованный. у меня есть пример на tarbuilders.com. если щелкнуть контакт, форма проверяет вводимые пользователем данные на лету, и, если они действительны, появляется зеленая рамка и галочка. недействительный - ›красный и х - person Keith Bentrup; 21.05.2009
comment
См. этот ответ, чтобы исправить проблему со стрелкой. - person Hanna; 21.06.2013
comment
Обратите внимание, что вы по-прежнему можете вставлять символы и буквы, щелкнув правой кнопкой мыши ›вставить. Легкий способ исправить это: $doc.on('keyup blur input propertychange', 'input[name="price"]', function(){$(this).val($(this).val().replace(/[^0-9\.]/g,''));}); - person Rens Tillmann; 13.11.2015
comment
ДЕРЬМО, если я напишу числа, например, 123, а затем нажму буквенную клавишу, то есть он очистит ввод ... - person candlejack; 13.04.2017
comment
Хорошо, но допускает использование нескольких десятичных разделителей. - person Souvik Ghosh; 23.08.2017

Я подумал, что лучший ответ - это просто сделать это.

jQuery('.numbersOnly').keyup(function () {  
    this.value = this.value.replace(/[^0-9\.]/g,''); 
});

но я согласен, что это немного неудобно, когда клавиши со стрелками и кнопка удаления привязывают курсор к концу строки (и из-за этого он был возвращен мне при тестировании)

Я добавил простое изменение

$('.numbersOnly').keyup(function () {
    if (this.value != this.value.replace(/[^0-9\.]/g, '')) {
       this.value = this.value.replace(/[^0-9\.]/g, '');
    }
});

таким образом, если есть какая-либо кнопка, которая не приведет к изменению текста, просто проигнорируйте это. С его помощью вы можете нажимать стрелки и удалять, не переходя до конца, но он очищает любой нечисловой текст.

person James Nelli    schedule 09.08.2012
comment
Для повышения производительности создайте переменную с результатом замены вместо того, чтобы запускать ее дважды. - person DriverDan; 07.06.2013
comment
keypress можно использовать для дальнейшего упрощения, потому что, очевидно, keyup и keydown срабатывают по любой клавише клавиатуры, тогда как keypress только срабатывает по символьным клавишам (таким образом, не срабатывает по стрелке и удаляет ключи). См. Этот ответ для справки: stackoverflow.com/a/1367720/1298685 - person Ian Campbell; 08.01.2014
comment
Он принимает более одного десятичного знака. Как принять только один десятичный знак. Я подал заявку на текстовое поле суммы. Он также берет 12.5.6. Как ограничить на один балл. - person niru dyogi; 23.05.2014
comment
@IanCampbell keypress означает, что вы можете сначала ввести символ, который не удаляется. Не получится. Keydown делает то же самое. Я могу заставить его работать только с клавиатурой. - person nickdnk; 19.01.2015

В плагине jquery.numeric есть несколько ошибок, о которых я уведомил автора. Он позволяет использовать несколько десятичных знаков в Safari и Opera, и вы не можете вводить backspace, клавиши со стрелками или несколько других управляющих символов в Opera. Мне нужен был ввод положительных целых чисел, поэтому в конце концов я просто написал свой собственный.

$(".numeric").keypress(function(event) {
  // Backspace, tab, enter, end, home, left, right
  // We don't support the del key in Opera because del == . == 46.
  var controlKeys = [8, 9, 13, 35, 36, 37, 39];
  // IE doesn't support indexOf
  var isControlKey = controlKeys.join(",").match(new RegExp(event.which));
  // Some browsers just don't raise events for control keys. Easy.
  // e.g. Safari backspace.
  if (!event.which || // Control keys in most browsers. e.g. Firefox tab is 0
      (49 <= event.which && event.which <= 57) || // Always 1 through 9
      (48 == event.which && $(this).attr("value")) || // No 0 first digit
      isControlKey) { // Opera assigns values for control keys.
    return;
  } else {
    event.preventDefault();
  }
});
person Dave Aaron Smith    schedule 09.02.2010
comment
С помощью этого кода вообще невозможно ввести 0. Протестировано с Chrome и FF на Mac. - person jaredstenquist; 25.06.2013
comment
Я обновил это, чтобы принять 0 цифр (48 == event.which && ($ (this) .val () ›0)) || // Нет 0 первой цифры - person aljordan82; 30.09.2013
comment
Это отличное решение, но в нем отсутствуют десятичные знаки, просто добавьте (46 == event.which &&! ($ (This) .val (). Includes (.))) || - person DiamondDrake; 01.08.2016
comment
Не могу напечатать 0 вообще. - person PJ7; 04.12.2016

Больше никаких плагинов, jQuery реализовал собственный jQuery.isNumeric () добавлен в v1.7.

jQuery.isNumeric( value )

Определяет, является ли его аргумент числом.

Образцы результатов

$.isNumeric( "-10" );     // true
$.isNumeric( 16 );        // true
$.isNumeric( 0xFF );      // true
$.isNumeric( "0xFF" );    // true
$.isNumeric( "8e5" );     // true (exponential notation string)
$.isNumeric( 3.1415 );    // true
$.isNumeric( +10 );       // true
$.isNumeric( 0144 );      // true (octal integer literal)
$.isNumeric( "" );        // false
$.isNumeric({});          // false (empty object)
$.isNumeric( NaN );       // false
$.isNumeric( null );      // false
$.isNumeric( true );      // false
$.isNumeric( Infinity );  // false
$.isNumeric( undefined ); // false

Вот пример того, как связать isNumeric () со слушателем событий.

$(document).on('keyup', '.numeric-only', function(event) {
   var v = this.value;
   if($.isNumeric(v) === false) {
        //chop off the last char entered
        this.value = this.value.slice(0,-1);
   }
});
person Praveen    schedule 25.11.2013
comment
+1 без плагинов. Я хотел бы добавить небольшое изменение, чтобы разрешить разделитель тысяч. Вместо var v = this.value; измените его на var v = this.value.replace(/,/g,'');. Такие числа как 21,345,67.800 тоже считаются. - person maan81; 13.04.2015
comment
Кто-нибудь знает, как это проверяет числа? Использует ли он коды клавиш или регулярные выражения? Это важно, если вы рассматриваете разные раскладки клавиатуры. - person Christopher Grigg; 07.08.2015
comment
Это очень близко. Однако, если вы удерживаете нажатой клавишу с символом, проверка не выполняется должным образом. Персонаж побежит. Вместо этого попробуйте следующее: $(document).on('keyup keypress', '#somethingSomething', function(){ var aValue = $(this).val(); if($.isNumeric(aValue) === false){ $(this).val(aValue.slice(0,-1)); } }); - person Gwi7d31; 16.08.2016

Плагин numeric (), упомянутый выше, не работает в Opera (вы не можете вернуться назад, удалить или даже использовать клавиши назад или вперед).

Приведенный ниже код как в JQuery, так и в Javascript будет работать отлично (и это всего две строки).

JQuery:

$(document).ready(function() {
    $('.key-numeric').keypress(function(e) {
            var verified = (e.which == 8 || e.which == undefined || e.which == 0) ? null : String.fromCharCode(e.which).match(/[^0-9]/);
            if (verified) {e.preventDefault();}
    });
});

Javascript:

function isNumeric(e)
{
    var keynum = (!window.event) ? e.which : e.keyCode;
    return !((keynum == 8 || keynum == undefined || e.which == 0) ? null : String.fromCharCode(keynum).match(/[^0-9]/));
}

Конечно, это только для чисто числового ввода (плюс клавиши возврата, удаления, перехода вперед / назад), но его можно легко изменить, включив в него точки и символы минус.

person Mike Gibbs    schedule 10.09.2013
comment
цифровая клавиатура также не разрешена - person Graham; 17.11.2016

Вы можете использовать плагин проверки с его number ().

$("#myform").validate({
  rules: {
    field: {
      required: true,
      number: true
    }
  }
});
person Dror    schedule 21.05.2009
comment
К вашему сведению - number () не работает с экспоненциальными числами. - person ScottLenart; 03.04.2019

Нет необходимости в длинном коде для ограничения ввода чисел, просто попробуйте этот код.

Он также принимает допустимые значения int и float.

Подход Javascript

onload =function(){ 
  var ele = document.querySelectorAll('.number-only')[0];
  ele.onkeypress = function(e) {
     if(isNaN(this.value+""+String.fromCharCode(e.charCode)))
        return false;
  }
  ele.onpaste = function(e){
     e.preventDefault();
  }
}
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />

Подход jQuery

$(function(){

  $('.number-only').keypress(function(e) {
	if(isNaN(this.value+""+String.fromCharCode(e.charCode))) return false;
  })
  .on("cut copy paste",function(e){
	e.preventDefault();
  });

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />

ОБНОВЛЕНИЕ

Вышеупомянутые ответы предназначены для наиболее распространенного варианта использования - проверки ввода как числа.

Но ниже фрагмент кода для особых случаев использования.

  • Разрешение отрицательных чисел
  • Отображение недопустимого нажатия клавиши перед его удалением.

$(function(){
      
  $('.number-only').keyup(function(e) {
        if(this.value!='-')
          while(isNaN(this.value))
            this.value = this.value.split('').reverse().join('').replace(/[\D]/i,'')
                                   .split('').reverse().join('');
    })
    .on("cut copy paste",function(e){
    	e.preventDefault();
    });

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />

person vinayakj    schedule 17.05.2015

Ниже я использую, чтобы буквально блокировать нажатия клавиш. Это позволяет использовать только числа 0–9 и десятичную точку. Легко реализовать, не требует большого количества кода и работает как шарм:

<script>
function isNumberKey(evt) {
    var charCode = (evt.which) ? evt.which : event.keyCode;
    if (charCode != 46 && charCode > 31 && (charCode < 48 || charCode > 57)) {
        return false;
    } else {
        return true;
    }      
}
</script>

<input value="" onkeypress="return isNumberKey(event)">
person kaleazy    schedule 26.10.2012
comment
Если кому-то интересно - вы можете ограничить десятичные дроби, удалив charCode != 46 из оператора if. Отличный ответ! - person Gaʀʀʏ; 07.12.2012
comment
Точно, я удалил charCode! = 46, чтобы пропустить десятичные дроби. Спасибо, kaleazy, этот ответ отлично сработал для меня. - person msqar; 16.04.2013
comment
Это плохое решение, потому что оно не принимает во внимание возврат, стрелки, клавиши управления и другие необходимые нажатия клавиш. - person DriverDan; 07.06.2013
comment
Я только что опубликовал решение, которое похоже на это, но также обрабатывает обратное пространство, стрелки и не использует жестко заданные коды клавиш. Посмотрите здесь: stackoverflow.com/a/23468513/838608 - person Håvard Geithus; 05.05.2014

В качестве небольшого улучшения этого предложения вы можете использовать Плагин проверки с его число (), цифры и range. Например, следующее гарантирует, что вы получите положительное целое число от 0 до 50:

$("#myform").validate({
  rules: {
    field: {
      required: true,
      number: true,
      digits: true,
      range : [0, 50]
    }
  }
});
person Brad Parks    schedule 01.08.2012

Вы не видите волшебного появления и исчезновения алфавитов при нажатии клавиши. Это работает и с пастой для мыши.

$('#txtInt').bind('input propertychange', function () {
    $(this).val($(this).val().replace(/[^0-9]/g, ''));
});
person Null Head    schedule 15.05.2013
comment
Я обнаружил, что это самый простой метод для целых чисел, хотя и не позволяет использовать десятичные дроби. - person nickdnk; 19.01.2015
comment
Для десятичного числа вы, вероятно, могли бы обновить регулярное выражение до чего-то вроде /[^0-9.]/g - person Null Head; 21.01.2015
comment
Мне не нужны десятичные дроби. Это было просто потому, что OP это сделал, но да :) - person nickdnk; 21.01.2015

Сначала я попытался решить эту проблему с помощью jQuery, но меня не устраивало, что нежелательные символы (не цифры) действительно появляются в поле ввода непосредственно перед удалением при нажатии клавиш.

В поисках других решений я нашел это:

Целые числа (неотрицательные)

<script>
  function numbersOnly(oToCheckField, oKeyEvent) {
    return oKeyEvent.charCode === 0 ||
        /\d/.test(String.fromCharCode(oKeyEvent.charCode));
  }
</script>

<form name="myForm">
<p>Enter numbers only: <input type="text" name="myInput" 
    onkeypress="return numbersOnly(this, event);" 
    onpaste="return false;" /></p>
</form>

Источник: https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers.onkeypress#Example Живой пример: http://jsfiddle.net/u8sZq/

Десятичные точки (неотрицательные)

Чтобы разрешить использование одной десятичной точки, вы можете сделать что-то вроде этого:

<script>
  function numbersOnly(oToCheckField, oKeyEvent) {        
    var s = String.fromCharCode(oKeyEvent.charCode);
    var containsDecimalPoint = /\./.test(oToCheckField.value);
    return oKeyEvent.charCode === 0 || /\d/.test(s) || 
        /\./.test(s) && !containsDecimalPoint;
  }
</script>

Источник: Только что написал это. Кажется, работает. Живой пример: http://jsfiddle.net/tjBsF/

Другие настройки

  • Чтобы разрешить ввод большего количества символов, просто добавьте их в регулярное выражение, которое действует как базовый фильтр кода символов.
  • Чтобы реализовать простые контекстные ограничения, посмотрите на текущее содержимое (состояние) поля ввода (oToCheckField.value)

Некоторые вещи, которые вам могут быть интересны:

  • Допускается только одна десятичная точка
  • Разрешить знак минус, только если он расположен в начале строки. Это позволит использовать отрицательные числа.

Недостатки

  • Положение каретки недоступно внутри функции. Это значительно снизило контекстные ограничения, которые вы можете реализовать (например, отсутствие двух одинаковых последовательных символов). Не уверен, как лучше всего получить к нему доступ.

Я знаю, что заголовок требует решений jQuery, но, надеюсь, кому-то это все равно пригодится.

person Håvard Geithus    schedule 05.05.2014

Спасибо за сообщение Дэйв Аарон Смит

Я отредактировал ваш ответ, чтобы принять десятичную точку и числа из раздела чисел. Эта работа идеально подходит для меня.

$(".numeric").keypress(function(event) {
  // Backspace, tab, enter, end, home, left, right,decimal(.)in number part, decimal(.) in alphabet
  // We don't support the del key in Opera because del == . == 46.
  var controlKeys = [8, 9, 13, 35, 36, 37, 39,110,190];
  // IE doesn't support indexOf
  var isControlKey = controlKeys.join(",").match(new RegExp(event.which));
  // Some browsers just don't raise events for control keys. Easy.
  // e.g. Safari backspace.
  if (!event.which || // Control keys in most browsers. e.g. Firefox tab is 0
      (49 <= event.which && event.which <= 57) || // Always 1 through 9
      (96 <= event.which && event.which <= 106) || // Always 1 through 9 from number section 
      (48 == event.which && $(this).attr("value")) || // No 0 first digit
      (96 == event.which && $(this).attr("value")) || // No 0 first digit from number section
      isControlKey) { // Opera assigns values for control keys.
    return;
  } else {
    event.preventDefault();
  }
});
person lekshmi    schedule 05.08.2011

   window.jQuery.fn.ForceNumericOnly =
       function () {

           return this.each(function () {
               $(this).keydown(function (event) {
                   // Allow: backspace, delete, tab, escape, and enter
                   if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
                       // Allow: Ctrl+A
                       (event.keyCode == 65 && event.ctrlKey === true) ||
                       // Allow: home, end, left, right
                       (event.keyCode >= 35 && event.keyCode <= 39)) {
                       // let it happen, don't do anything
                       return;
                   } else {
                       // Ensure that it is a number and stop the keypress
                       if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {
                           event.preventDefault();
                       }
                   }
               });
           });
       };

И примените это ко всем нужным входам:

$('selector').ForceNumericOnly();
person David Freire    schedule 25.02.2014

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

$field.keyup(function(){
    var val = $j(this).val();
    if(isNaN(val)){
         val = val.replace(/[^0-9\.]/g,'');
         if(val.split('.').length>2) val =val.replace(/\.+$/,"");
    }
    $j(this).val(val); 
});
  • показать визуальную обратную связь (перед исчезновением появляется неправильная буква)
  • позволяет десятичные дроби
  • ловит несколько "."
  • не имеет проблем с левым / правым дель и т. д.
person mordy    schedule 17.01.2012

HTML5 поддерживает номер типа ввода с глобальной поддержкой браузера 88% + согласно CanIUse по состоянию на октябрь 2015 года.

<input type="number" step="0.01" min="0" name="askedPrice" id="askedPrice" />

Это решение не связано с JQuery, но его преимущество в том, что на мобильных телефонах клавиатура Android будет оптимизирована для ввода чисел.

В качестве альтернативы можно использовать текст типа ввода с новым параметром «шаблон». Подробнее в спецификации HTML5.

Я думаю, что это лучше, чем решение jquery, поскольку в этом вопросе предоставленное решение jquery не поддерживает разделитель тысяч. Если вы можете использовать html5.

JSFiddle: https://jsfiddle.net/p1ue8qxj/

person Mladen Adamovic    schedule 06.10.2015

/ * это моя кроссбраузерная версия Как разрешить только числовые (0-9) в поле ввода HTML с помощью jQuery?
* /

$("#inputPrice").keydown(function(e){
    var keyPressed;
    if (!e) var e = window.event;
    if (e.keyCode) keyPressed = e.keyCode;
    else if (e.which) keyPressed = e.which;
    var hasDecimalPoint = (($(this).val().split('.').length-1)>0);
    if ( keyPressed == 46 || keyPressed == 8 ||((keyPressed == 190||keyPressed == 110)&&(!hasDecimalPoint && !e.shiftKey)) || keyPressed == 9 || keyPressed == 27 || keyPressed == 13 ||
             // Allow: Ctrl+A
            (keyPressed == 65 && e.ctrlKey === true) ||
             // Allow: home, end, left, right
            (keyPressed >= 35 && keyPressed <= 39)) {
                 // let it happen, don't do anything
                 return;
        }
        else {
            // Ensure that it is a number and stop the keypress
            if (e.shiftKey || (keyPressed < 48 || keyPressed > 57) && (keyPressed < 96 || keyPressed > 105 )) {
                e.preventDefault();
            }
        }

  });
person roger    schedule 18.06.2012

Просто прогоните содержимое через parseFloat (). Он вернет NaN при неверном вводе.

person Maciej Łebkowski    schedule 21.05.2009

Вы можете использовать autoNumeric на сайте decorplanit.com. У них есть хорошая поддержка чисел, а также валюты, округления и т. Д.

Я использовал среду IE6 с несколькими настройками css, и это был разумный успех.

Например, можно определить класс css numericInput, который можно использовать для украшения ваших полей масками числового ввода.

адаптировано с веб-сайта autoNumeric:

$('input.numericInput').autoNumeric({aSep: '.', aDec: ','}); // very flexible!
person Zero Distraction    schedule 07.02.2012
comment
autoNumeric определенно лучший способ - person Prethen; 10.01.2013

Если вы используете HTML5, вам не нужно слишком усердствовать, чтобы выполнить проверку. Просто используйте -

<input type="number" step="any" />

Атрибут step позволяет использовать десятичную точку.

person Jay Blanchard    schedule 23.05.2014
comment
Не так, Firefox и Opera позволяют вводить нечисловой текст. - person Michael Fever; 29.05.2014
comment
@MichaelDeMut, вы правы, он позволяет вводить нечисловой текст, но не проходит проверку в FF (у меня не было возможности протестировать в Opera). - person Jay Blanchard; 30.05.2014

Я думаю, что это хороший способ решить эту проблему, и он предельно прост:

$(function() {
    var pastValue, pastSelectionStart, pastSelectionEnd;

    $("input").on("keydown", function() {
        pastValue          = this.value;
        pastSelectionStart = this.selectionStart;
        pastSelectionEnd   = this.selectionEnd;
    }).on("input propertychange", function() {
        var regex = /^[0-9]+\.?[0-9]*$/;

        if (this.value.length > 0 && !regex.test(this.value)) {
            this.value          = pastValue;
            this.selectionStart = pastSelectionStart;
            this.selectionEnd   = pastSelectionEnd;
        }
    });
});

Пример: JSFiddle

Рассмотрены сценарии

Большинство подобных рекомендаций здесь не соответствуют хотя бы одному из них или требуют большого количества кода для покрытия всех этих сценариев.

  1. Допускается только 1 десятичная точка.
  2. Позволяет использовать клавиши home, end и arrow.
  3. Позволяет использовать delete и backspace в любом индексе.
  4. Позволяет редактировать по любому индексу (если ввод соответствует регулярному выражению).
  5. Позволяет ctrl + v и shift + insert для правильного ввода (то же самое с правой кнопкой мыши + вставить).
  6. Не мерцает текстовое значение, потому что событие keyup не используется.
  7. Восстанавливает выбор после неверного ввода.

Неудачные сценарии

  • Начиная с 0.5 и удалить только ноль не получится. Это можно исправить, изменив регулярное выражение на /^[0-9]*\.?[0-9]*$/, а затем добавив событие размытия, чтобы добавить 0, когда текстовое поле начинается с десятичной точки (при желании). См. Этот расширенный сценарий, чтобы лучше понять, как это исправить.

Плагин

Чтобы упростить задачу, я создал этот простой плагин jquery:

$("input").limitRegex(/^[0-9]+\.?[0-9]*$/);
person David Sherret    schedule 18.12.2014

Лучший способ - проверять контекст текстового поля всякий раз, когда оно теряет фокус.

Вы можете проверить, является ли содержимое «числом», используя регулярное выражение.

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

person jrharshath    schedule 21.05.2009
comment
Регулярное выражение будет /^\d*\.{0,1}\d+$/ - person Chetan S; 21.05.2009

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

function numonly(root){
    >>var reet = root.value;
    var arr1 = reet.length;
    var ruut = reet.charAt(arr1-1);
    >>>if (reet.length > 0){
        var regex = /[0-9]|\./;
        if (!ruut.match(regex)){
            var reet = reet.slice(0, -1);
            $(root).val(reet);
        >>>>}
    }
}
//Then use the even handler onkeyup='numonly(this)'
person Alex Homm    schedule 06.03.2010

Это фрагмент, который я только что сделал (используя часть кода Питера Мортенсена / Кейта Бентрупа) для проверки целочисленного процента в текстовом поле (требуется jQuery):

/* This validates that the value of the text box corresponds
 * to a percentage expressed as an integer between 1 and 100,
 * otherwise adjust the text box value for this condition is met. */
$("[id*='percent_textfield']").keyup(function(e){
    if (!isNaN(parseInt(this.value,10))) {
        this.value = parseInt(this.value);
    } else {
        this.value = 0;
    }
    this.value = this.value.replace(/[^0-9]/g, '');
    if (parseInt(this.value,10) > 100) {
        this.value = 100;
        return;
    }
});

Этот код:

  • Позволяет использовать основные цифровые клавиши и цифровую клавиатуру.
  • Проверяет, чтобы исключить символы с цифрами Shift (например, #, $,% и т. Д.)
  • Заменяет значения NaN на 0
  • Заменяет на 100 значений больше 100

Надеюсь, это поможет нуждающимся.

person Francisco Alvarado    schedule 08.11.2010


Другой способ сохранить позицию курсора на входе:

$(document).ready(function() {
  $('.numbersOnly').on('input', function() {
    var position = this.selectionStart - 1;

    fixed = this.value.replace(/[^0-9\.]/g, '');  //remove all but number and .
    if(fixed.charAt(0) === '.')                  //can't start with .
      fixed = fixed.slice(1);

    var pos = fixed.indexOf(".") + 1;
    if(pos >= 0)
      fixed = fixed.substr(0,pos) + fixed.slice(pos).replace('.', '');  //avoid more than one .

    if (this.value !== fixed) {
      this.value = fixed;
      this.selectionStart = position;
      this.selectionEnd = position;
    }
  });
});

Преимущества:

  1. Пользователь может использовать клавиши со стрелками, Backspace, Delete, ...
  2. Работает, когда вы хотите вставить числа

Plunker: Демо-версия

person Carlos Toledo    schedule 01.04.2016

Я только что нашел еще лучший плагин. Дает вам гораздо больше контроля. Предположим, у вас есть поле DOB, где оно должно быть числовым, но также принимает "/" или " -" символы.

Отлично работает!

Проверьте это на http://itgroup.com.ph/alphanumeric/.

person Bachir El Khoury    schedule 10.10.2009

    $(".numeric").keypress(function(event) {
  // Backspace, tab, enter, end, home, left, right
  // We don't support the del key in Opera because del == . == 46.
  var controlKeys = [8, 9, 13, 35, 36, 37, 39];
  // IE doesn't support indexOf
  var isControlKey = controlKeys.join(",").match(new RegExp(event.which));
  // Some browsers just don't raise events for control keys. Easy.
  // e.g. Safari backspace.
  if (!event.which || // Control keys in most browsers. e.g. Firefox tab is 0
      (49 <= event.which && event.which <= 57) || // Always 1 through 9
      (48 == event.which && $(this).attr("value")) || // No 0 first digit
      isControlKey) { // Opera assigns values for control keys.
    return;
  } else {
    event.preventDefault();
  }
});

Этот код мне очень понравился, мне просто пришлось добавить 46 в массив controlKeys, чтобы использовать точку, хотя я не думаю, что это лучший способ сделать это;)

person Reedyseth    schedule 12.07.2010

Я использовал это с хорошими результатами ..

ini=$("#id").val();
a=0;
$("#id").keyup(function(e){
    var charcode = (e.which) ? e.which : e.keyCode;
    // for decimal point
    if(!(charcode===190 || charcode===110))
    {           // for numeric keys andcontrol keys
        if (!((charcode>=33 && charcode<=57) || 
        // for numpad numeric keys
        (charcode>=96 && charcode<=105) 
        // for backspace
        || charcode==8)) 
        {
            alert("Sorry! Only numeric values allowed.");
            $("#id").val(ini);
        }
        // to include decimal point if first one has been deleted.
        if(charcode===8)
        {
            ini=ini.split("").reverse();
            if(ini[0]==".")
            a=0;                 
        }
    }
    else
    {
        if(a==1)
        {
            alert("Sorry! Second decimal point not allowed.");
            $("#id").val(ini);
        }
        a=1;
    }
    ini=$("#id").val();
});


find keycodes at http://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes
person Kaustubh    schedule 27.07.2012

Это очень просто, потому что у нас уже есть встроенная функция javascript "isNaN".

$("#numeric").keydown(function(e){
  if (isNaN(String.fromCharCode(e.which))){ 
    return false; 
  }
});
person Jyothu    schedule 20.12.2012

Плагин jquery.numeric мне тоже подходит.

Единственное, что мне не нравится, - это интуиция. Нажатие клавиш «запрещается» без какой-либо обратной связи с пользователем, который может стать параноиком или задаться вопросом, сломана ли его клавиатура.

Я добавил в плагин второй обратный вызов для простой обратной связи при заблокированном вводе. возможный:

$('#someInput').numeric(
    null, // default config
    null, // no validation onblur callback
    function(){
        // for every blocked keypress:
        $(this).effect("pulsate", { times:2 }, 100);
    }
);

Конечно, это просто пример (с использованием jQuery UI). Любая простая визуальная обратная связь поможет.

person Tabbernaut    schedule 03.09.2013

Я использую эту функцию, и она отлично работает

$(document).ready(function () {
        $("#txt_Price").keypress(function (e) {
            //if the letter is not digit then display error and don't type anything
            //if (e.which != 8 && e.which != 0 && (e.which < 48 || e.which > 57)) 
            if ((e.which != 46 || $(this).val().indexOf('.') != -1) && (e.which < 48 || e.which > 57)) {
                //display error message
                $("#errmsg").html("Digits Only").show().fadeOut("slow");
                return false;
            }
        });
    }); 
person kamal.shalabe    schedule 19.02.2014

Есть хороший плагин jquery под названием Jquery Mask Plugin, который предназначен для создания масок для полей формы и html, но вы также можете использовать его, чтобы просто определить, какие данные можно вводить внутри поля:

$('.numeric-input').mask('0#');

Теперь внутри вашего поля формы будут разрешены только числа.

person David    schedule 20.03.2016

Использование события нажатия клавиши

  1. Метод массива
var asciiCodeOfNumbers = [48, 49, 50, 51, 52, 53, 54, 54, 55, 56, 57]
$(".numbersOnly").keypress(function (e) {
        if ($.inArray(e.which, asciiCodeOfNumbers) == -1)
            e.preventDefault();
    });
  1. Прямой метод
$(".numbersOnly").keypress(function (e) {
        if (e.which < 48 || 57 < e.which)
            e.preventDefault();
    });
person samurai    schedule 27.09.2016

Я использовал ответ Джеймса Нелли и добавил onpaste = "return false;" (Håvard Geithus), чтобы во входные данные вводились только целые числа. Даже если вы пытались наклеить, он этого не позволит.

person tksilicon    schedule 13.10.2014

Этот код относится к ограничению алфавитов в текстовых полях, необходимо ввести только номер, подтвержденный при нажатии клавиши. Надеюсь, это поможет вам

HTML-теги:

<input id="txtPurchaseAmnt" style="width:103px" type="text" class="txt" maxlength="5" onkeypress="return isNumberKey(event);" />

только функция Числа (клавиша) {

        var keycode = (key.which) ? key.which : key.keyCode

        if ((keycode > 47 && keycode < 58) || (keycode == 46 || keycode == 8) || (keycode == 9 || keycode == 13) || (keycode == 37 || keycode == 39)) {

            return true;
        }
        else {
            return false;
        }
    }
person Praveen04    schedule 27.01.2014

РАЗРЕШЕНЫ ТАКЖЕ ОТРИЦАТЕЛЬНЫЕ ЧИСЛА

Следующий код также принимает отрицательные числа

HTML

<input type="text" name="myText" />

JS

var pastValue, pastSelectionStart, pastSelectionEnd;

$("input").on("keydown", function() {
    pastValue          = this.value;
    pastSelectionStart = this.selectionStart;
    pastSelectionEnd   = this.selectionEnd;
}).on("input propertychange", function() {

    if ( this.value.length > 0 && $.isNumeric(this.value) == false && this.value != '-' ) {
        this.value          = pastValue;
        this.selectionStart = pastSelectionStart;
        this.selectionEnd   = pastSelectionEnd;
    }
}).on('blur', function(){
        if(this.value == '-')
            this.value = '';
});
person Muhammad Inaam Munir    schedule 09.01.2017

У меня есть этот фрагмент кода, который очень хорошо выполняет свою работу.

 var prevVal = '';
$(".numericValue").on("input", function (evt) {
    var self = $(this);
    if (self.val().match(/^-?\d*(\.(?=\d*)\d*)?$/) !== null) {
        prevVal = self.val()
    } else {
        self.val(prevVal);
    }
    if ((evt.which != 46 || self.val().indexOf('.') != -1) && (evt.which < 48 || evt.which > 57) && (evt.which != 45 && self.val().indexOf("-") == 0)) {
        evt.preventDefault();
    }
});
person Agnibha    schedule 24.03.2017

Вы можете использовать проверку HTML5 для ввода текста, добавив шаблон. Нет необходимости вручную проверять регулярное выражение или коды клавиш.

<input type="text" pattern="[0-9.]+" />

$("input[type=text][pattern]").on("input", function () {
    if (!this.checkValidity())
        this.value = this.value.slice(0, -1);
});

Для решения с input [type = number] см. Мой полный ответ здесь

person jBelanger    schedule 13.04.2018

Пожалуйста, добавьте внизу скрипта:

if(this.value.length == 1 && this.value == 0)
 this.value = "";
person Fabian Ramirez    schedule 14.04.2011