Задать вопрос

Как разрешить вводить только указанные числа?

Здравствуйте)
Подскажите пожалуйста, как можно разрешить вводить в input только цифры такого вида:
10
100
1000
10000
...
и
0,1
0,01
0,001
0,00001
...
  • Вопрос задан
  • 377 просмотров
Подписаться 2 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
  • Академия Эдюсон
    Fullstack-разработчик на JavaScript + ИИ
    11 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Инженер по тестированию + ИИ
    6 месяцев
    Далее
Решения вопроса 3
profesor08
@profesor08 Куратор тега JavaScript
Советую, пока не поздно, убедить заказчика сделать выпадающим списком, иначе пользователи будут плеваться, и называть нехорошими словами всех причастных к этой глупой идее.
Ответ написан
Stalker_RED
@Stalker_RED
Можно сделать что-то вроде такого: https://jsfiddle.net/xkfyzan9/
Только нужно решить что делать с очень мелкими значениями, там где у float уже точности недостаточно.

Частичное решение https://jsfiddle.net/xkfyzan9/1/
Ответ написан
Комментировать
0xD34F
@0xD34F Куратор тега JavaScript
Вариант раз - следим за тем, что вводит пользователь. Если значение некорректное - показываем соответствующее сообщение:

<div class="power-of-10">
  <input value="1">
  <div>значение должно быть степенью 10: 1, 10, 100,... или 0.1, 0.01, 0.001...</div>
</div>

.power-of-10 > div {
  display: none;
}

.power-of-10.error > div {
  display: block;
}

.power-of-10.error > input {
  background: #faa;
}

const reg = /^(10*|0[.,]0*1)$/;

document.querySelector('.power-of-10 > input').addEventListener('input', e => {
  e.target.parentNode.classList.toggle(
    'error',
    !reg.test(e.target.value)
  );
});

Вариант два - лишаем пользователя возможности ввести некорректное значение. Блокируем поле ввода, изменяем значение посредством кнопок и колеса прокрутки:

<button data-step="+1">+</button>
<button data-step="-1">-</button>
<input readonly>

const input = document.querySelector('input');
let pow = 0;

const updateValue = step =>
  input.value = (pow += step) < 0
    ? '0.' + '0'.repeat(~pow) + '1'
    : '1' + '0'.repeat(pow);

document.querySelectorAll('[data-step]').forEach(function(n) {
  n.addEventListener('click', this);
}, e => updateValue(+e.target.dataset.step));

input.addEventListener('wheel', e => {
  e.preventDefault();
  updateValue(-Math.sign(e.deltaY));
});

updateValue(0);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
dummyman
@dummyman
диссидент-схизматик
Если нужны только разряды, зачем что-то вводить? Пусть и вводят вместо чисел разряд 3,2,1,0,-1,-2,-3 - не ошибутся!
Ответ написан
@kulaeff
Front-end developer
А вообще делается это просто:

$('.input').on('keypress', function(e) {
  if (e.which !== 48 && e.which !== 49 && e.which !== 46) {
    e.preventDefault()
  }
})


Это, конечно, не исчерпывающее решение, ибо не позволяет отсечь числа вроде 11, 101 и т.д., оно лишь разрешает нажимать 1, 0 и точку. Но если вместо keypress использовать input и валидировать строку на соответствие (вместо проверки нажатых клавиш), то все получится.
Ответ написан
teknik2008
@teknik2008
Расскажите про GOLANG. Мне интересно
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы