Регулярка для поля ввода числа
Задача:
Поле для ввода метражного товара. [^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, время: 22:25. |