Как сделать type = «number» только для положительных чисел


285

в настоящее время у меня есть следующий код

<input type="number" />

получается что-то вроде этого

введите описание изображения здесь

Маленькие селекторы справа позволяют цифре переходить в минус. Как мне это предотвратить?

У меня есть сомнения по поводу использования type="number", оно вызывает больше проблем, чем решает, я все равно собираюсь проверить его, так что я должен просто вернуться к использованию type="text"?


4
Вам все еще нужно будет проверить значение на сервере. Любой может переопределить поле, чтобы отправить любой контент, который он хочет.
zzzzBov

2
@zzzzBov Да, я проверяю его с помощью php, а также использую операторы prepare, единственное, о чем нужно беспокоиться, это пользователи, которые ячменя знают, как использовать веб-браузер. LOL
Ариан Фауртош,

Ответы:


636

Добавить в minатрибут

<input type="number" min="0">


37
Это работает для стрелок селектора, но позволяет вводить отрицательное число
Дэвид Бертон

2
Изменение атрибута min="0.000001"поможет в большинстве случаев. Более 6 знаков после запятой, JavaScript преобразует его в экспоненциальный формат.
MarkMYoung

По умолчанию это разрешает только целые числа, но не десятичные. См. Разрешение десятичных значений .
ул

118

Я нашел другое решение для предотвращения отрицательного числа.

<input type="number" name="test_name" min="0" oninput="validity.valid||(value='');">

Вы не можете добавить плавающие числа с этим. Кроме того, числовой степпер здесь тоже не работает.
Hamzox

1
oninput="validity.valid||(value='');"останавливает один от набора-ve чисел
Привет Вселенная

5
Это должно быть помечено как правильный ответ, поскольку оно также не позволяет вводить символ "-"
JanBrus

Это прекрасно работает, если вам нужны только положительные целые числа, как я. Спасибо!
Борис

74

Это зависит от того, насколько точно вы хотите быть. Если вы хотите принимать только целые числа, чем:

<input type="number" min="1" step="1">

Если вы хотите плавать, например, с двумя цифрами после десятичной точки:

<input type="number" min="0.01" step="0.01">


Кажется, в настоящее время это работает без шага = "1" ... я все еще должен добавить это?
Ариан Фауртош

@ Ариан, вы можете опустить его, если не указали maxзначение.
Павло

1
Шаг 1 - браузер по умолчанию, у вас все в порядке
Стефан Мюллер,

4
Это по-прежнему не мешает вводить неверные значения - если вы опустите значение шага, Chrome уменьшает проверку, которую он делает при наборе текста, чтобы вы могли вводить нечисловые значения. При установке шага он позволяет только вводить значения за пределами диапазона минимальных и максимальных значений - все еще неправильно, но лучше.
Дэвид Бертон

min = "1" step = "1" по-прежнему позволяет мне вводить числа с плавающей запятой, например 1.2. Как я могу форсировать только целые числа?
Сэм

51

Вы можете заставить ввод содержать только положительное целое число, добавив onkeypressв inputтег.

<input type="number" onkeypress="return event.charCode >= 48" min="1" >

Вот, event.charCode >= 48 гарантируется, что возвращаются только числа, большие или равные 0, а minтег гарантирует, что вы можете прийти к минимуму 1, прокручивая строку ввода.


3
На Edge вы можете ввести «А» в этом.
Эми Бланкеншип

10
Вы все еще можете вставить отрицательное число
метил

5

Вы можете использовать следующее, чтобы type="number"принимать только положительные числа:

input type="number" step="1" pattern="\d+"

2
Можете ли вы попытаться объяснить, что делает ваше утверждение и почему оно помогает? Кроме того, у вас есть два разных фрагмента. Который правильный?
Aenadon

2
добавляя атрибут шага, вы ограничиваете ввод целочисленным значением, а добавление шаблона гарантирует, что при использовании дробной части поле будет помечено как недействительное, но зависит от реализаций браузера (Firefox помечает поле как красный при потере фокуса ввода, тогда как Chrome не позволяет вы вводите запрещенные значения в первую очередь). Надо проверить это на сервере / клиенте.
Deepali


3

Пытаться

<input type="number" pattern="^[0-9]" title='Only Number' min="1" step="1">


Когда вы определяете тип, вам нужен определенный формат для роли.
Рожерио де Мораес

7
Пробовал это в Chrome, и это не навязывает шаблон
Дэвид Бертон

Есть ли способ, если я добавлю type = "text" вместо "number"?
Капил Верма

1

Если требуется ввод текста , шаблон работает также

<input type="text" pattern="\d+">

1

Я не могу найти идеальное решение, так как некоторые работы для ввода, но не для копирования и вставки, некоторые наоборот. Это решение работает для меня. Это предотвращает от отрицательного числа, набрав «е», скопировать и вставить «е» текст.

создать функцию.

<script language="JavaScript">

  // this prevents from typing non-number text, including "e".
  function isNumber(evt) {
    evt = (evt) ? evt : window.event;
    let charCode = (evt.which) ? evt.which : evt.keyCode;
    if ((charCode > 31 && (charCode < 48 || charCode > 57)) && charCode !== 46) {
      evt.preventDefault();
    } else {
      return true;
    }
  }
</script>

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

<input type="number" oninput="validity.valid||(value='');" onpress="isNumber(event)" />

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


0

добавьте этот код в ваш тип ввода;

onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57"

например:

<input type="text" name="age" onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57" />

1
это действительно сбивает с толку тех, кто не понимает, что происходит.
RozzA

Таким образом, вы все равно можете вставить что-нибудь на ввод, алфавит или даже специальные символы
Lê Gia Lễ

0

Другое решение состоит в том, чтобы использовать Js, чтобы сделать его положительным (опция min может быть отключена и недействительна, когда пользователь вводит что-то). Отрицательное, если не нужно, также можно использовать событие on ('keydown')!

let $numberInput =  $('#whatEverId');
$numberInput.on('change', function(){
    let numberInputText = $numberInput.val();
    if(numberInputText.includes('-')){
        $numberInput.val(Math.abs($numberInput.val()));
    }
});

0

Это зависит от того, хотите ли вы int или float. Вот как эти два будут выглядеть:

<input type="number" name="int-field" id="int-field" placeholder="positive int" min="1" step="1">
<input type="number" name="float-field" id="float-field" placeholder="positive float" min="0">

К полю int прикреплена правильная проверка, поскольку его минимум равен 1. Однако, поле с плавающей запятой принимает 0; Чтобы справиться с этим, вы можете добавить еще один валидатор ограничений :

function checkIsPositive(e) {
  const value = parseFloat(e.target.value);
  if (e.target.value === "" || value > 0) {
    e.target.setCustomValidity("");
  } else {
    e.target.setCustomValidity("Please select a value that is greater than 0.");
  }
}

document.getElementById("float-field").addEventListener("input", checkIsPositive, false);

JSFiddle здесь.

Обратите внимание, что ни одно из этих решений не полностью препятствует тому, чтобы пользователь пытался ввести неверный ввод, но вы можете позвонить checkValidityилиreportValidity узнать, набрал ли пользователь допустимый ввод.

Конечно, вы все равно должны иметь проверку на стороне сервера, потому что пользователь всегда может игнорировать проверку на стороне клиента.


0

Попробуй это:

  • Проверено в Angular 8
  • значения положительные
  • Этот код также обрабатывает nullи negitiveзначения.
              <input
                type="number"
                min="0"
                (input)="funcCall()" -- Optional
                oninput="value == '' ? value = 0 : value < 0 ? value = value * -1 : false"
                formControlName="RateQty"
                [(value)]="some.variable" -- Optional
              />

0

Если вы попытаетесь ввести отрицательное число, событие onkeyup блокирует это, и если вы используете стрелку на входном номере, событие onblur разрешает эту часть.

<input type="number" 
    onkeyup="if(this.value<0)this.value=1"
    onblur="if(this.value<0)this.value=1"
>



-2

С типом ввода текста вы можете использовать это для лучшей проверки,

return (event.keyCode? (event.keyCode == 69 ? false : event.keyCode >= 48 && event.keyCode <= 57) : (event.charCode >= 48 && event.charCode <= 57))? true : event.preventDefault();

-4

Попробуй это:

Yii2 : Validation rule 

    public function rules() {
    return [
['location_id', 'compare', 'compareValue' => 0', 'operator' => '>'],
        ];
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.