Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Регулярка для поля ввода числа (https://javascript.ru/forum/misc/68298-regulyarka-dlya-polya-vvoda-chisla.html)

Bab 07.04.2017 17:50

Регулярка для поля ввода числа
 
Задача:
Поле для ввода метражного товара. [^0-9. и -(возврат)], после запятой не больше 2 знаков.
Пока решение такое: рабочее, но корявое:write:
function check(input) {
var num = input.value.replace(/[^0-9.-]/g, '');//разрешенные знаки
var num_minus = num.replace(/.[-].*$/g, '');//минус в середине числа
num = num_minus;
var num_dec = num.match(/.*\.../g);//есть ли два знака
if(num_dec!=null){
	input.value = num_dec;
} else {
	input.value = num;
}
}

Вопросы:
1. Как записать регулярку в одну строку? В ответах находил варианты: /^(0|([1-9]\\d*?))(\\.\\d{1,2})?$/ ; /^\d+(?:,\d{1,2})?$/, но заставить их работать не смог.
2. Как в моем варианте гуманно убирать минус в середине числа, не съедая соседние цифры?

Заранее спасибо:thanks:

рони 07.04.2017 19:16

Bab,
варианты что на входе, что на выходе?

Bab 07.04.2017 20:40

Цитата:

Сообщение от рони (Сообщение 449537)
Bab,
варианты что на входе, что на выходе?

Скрипт редактирует это поле:
<input type='text' name='balance' value='' size='11' onkeyup=\"check(this);\" onchange=\"check(this);\">


Если про те варианты, что нашел в других темах, то в таком виде:
function check(input) {
input.value = input.value.replace(/^\d+(?:,\d{1,2})?$/g, '');
};
</script>

скрипт никак не работает. Второй вариант так же. Или я что-то не понимаю?

рони 07.04.2017 20:45

Bab,
на входе 12345-(возврат) на выходе 12345
12345.9999 => 12345.99
и т.д. 5-10 примеров

Bab 07.04.2017 21:04

12345- => 1234 (хотелось бы 12345, но как совместить со следующим примером, не добавляя еще переменных, не придумал);
123-45 => 12 (минус вставил в последнюю очередь)
123.4567 => 123.45 (здесь все ок)
.12345 => .12 (устраивает)
-123.456 => -123.45 (+)

Проблема в минусе в середине числа и общей громоздкости функции.

рони 07.04.2017 21:58

Bab,
function fn(str)
{  var reg =  /^[-]?\d*(\.\d{1,2})?/;

   return str.match(reg)? str.match(reg)[0] : ""
}

alert([fn("12345"), fn("123-45"), fn("123.4567"), fn(".12345"), fn("-123.456")]);

Bab 08.04.2017 11:49

Прошу прощения за многабукаф, но не могу понять суть проблемы. Вижу, что Ваш рэгексп составлен правильно.
Не понимаю, почему мой код работает:
<script>
function check(input) {
var num = input.value.replace(/[^0-9.-]/g, '');//разрешенные знаки
var num_minus = num.replace(/.[-].*$/g, '');//минус в середине числа
num = num_minus;
var num_dot = num.replace(/\.\.*$/g, '.');//несколько точек подряд
num = num_dot;
var num_dec = num.match(/.*\.../g);//есть ли два знака
if(num_dec!=null){
	input.value = num_dec;
} else {
	input.value = num;
}
}
</script>
<form method='post' name='forma'>
<input type='text' name='balance' value='' size='11' onkeyup="check(this);" onchange="check(this);">
</form>


Его урезанная версия тоже работает:
<script>
function check(input) {
input.value = input.value.replace(/[^0-9.-]/g, '');
}
</script>
<form method='post' name='forma'>
<input type='text' name='balance' value='' size='11' onkeyup="check(this);" onchange="check(this);">
</form>


Но когда подставляю в урезанную версию Ваш рэгексп (что и хочу получить в итоге), это не работает как ожидается:
<script>
function check(input) {
input.value = input.value.replace(/^[-]?\d*(\.\d{1,2})?/g, '');
}
</script>
<form method='post' name='forma'>
<input type='text' name='balance' value='' size='11' onkeyup="check(this);" onchange="check(this);">
</form>

В чем здесь ошибка?:-E

рони 08.04.2017 12:18

Bab,
<script>
function fn(str)
{  var reg =  /^[-]?\d*(\.\d{1,2})?/;

  return str.match(reg)? str.match(reg)[0] : ""
}

function check(input) {
input.value = fn(input.value)  ;
}
</script>
<form method='post' name='forma'>
<input type='text' name='balance' value='' size='11'  onchange="check(this);">
</form>

Bab 08.04.2017 12:34

Этот вариант тоже не работает:(
Проблема не в построении функции, а в рэгекспе. Посмотрите, в тех вариантах, что скидывал в предыдущем посте: предпоследний отличается от последнего только регуляркой и 1 рабочий, а второй - нет.

рони 08.04.2017 12:36

Цитата:

Сообщение от Bab
Этот вариант тоже не работает

???


Часовой пояс GMT +3, время: 23:16.