Регулярка для поля ввода числа
Задача:
Поле для ввода метражного товара. [^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: |
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> скрипт никак не работает. Второй вариант так же. Или я что-то не понимаю? |
Bab,
на входе 12345-(возврат) на выходе 12345 12345.9999 => 12345.99 и т.д. 5-10 примеров |
12345- => 1234 (хотелось бы 12345, но как совместить со следующим примером, не добавляя еще переменных, не придумал);
123-45 => 12 (минус вставил в последнюю очередь) 123.4567 => 123.45 (здесь все ок) .12345 => .12 (устраивает) -123.456 => -123.45 (+) Проблема в минусе в середине числа и общей громоздкости функции. |
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")]); |
Прошу прощения за многабукаф, но не могу понять суть проблемы. Вижу, что Ваш рэгексп составлен правильно.
Не понимаю, почему мой код работает: <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 |
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> |
Этот вариант тоже не работает:(
Проблема не в построении функции, а в рэгекспе. Посмотрите, в тех вариантах, что скидывал в предыдущем посте: предпоследний отличается от последнего только регуляркой и 1 рабочий, а второй - нет. |
Цитата:
|
Часовой пояс GMT +3, время: 06:22. |