Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.04.2017, 17:50
Bab Bab вне форума
Интересующийся
Отправить личное сообщение для Bab Посмотреть профиль Найти все сообщения от Bab
 
Регистрация: 07.04.2017
Сообщений: 10

Регулярка для поля ввода числа
Задача:
Поле для ввода метражного товара. [^0-9. и -(возврат)], после запятой не больше 2 знаков.
Пока решение такое: рабочее, но корявое
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. Как в моем варианте гуманно убирать минус в середине числа, не съедая соседние цифры?

Заранее спасибо
Ответить с цитированием
  #2 (permalink)  
Старый 07.04.2017, 19:16
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 30,978

Bab,
варианты что на входе, что на выходе?
Ответить с цитированием
  #3 (permalink)  
Старый 07.04.2017, 20:40
Bab Bab вне форума
Интересующийся
Отправить личное сообщение для Bab Посмотреть профиль Найти все сообщения от Bab
 
Регистрация: 07.04.2017
Сообщений: 10

Сообщение от рони Посмотреть сообщение
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, 07.04.2017 в 20:46.
Ответить с цитированием
  #4 (permalink)  
Старый 07.04.2017, 20:45
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 30,978

Bab,
на входе 12345-(возврат) на выходе 12345
12345.9999 => 12345.99
и т.д. 5-10 примеров
Ответить с цитированием
  #5 (permalink)  
Старый 07.04.2017, 21:04
Bab Bab вне форума
Интересующийся
Отправить личное сообщение для Bab Посмотреть профиль Найти все сообщения от Bab
 
Регистрация: 07.04.2017
Сообщений: 10

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

Проблема в минусе в середине числа и общей громоздкости функции.
Ответить с цитированием
  #6 (permalink)  
Старый 07.04.2017, 21:58
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 30,978

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")]);
Ответить с цитированием
  #7 (permalink)  
Старый 08.04.2017, 11:49
Bab Bab вне форума
Интересующийся
Отправить личное сообщение для Bab Посмотреть профиль Найти все сообщения от Bab
 
Регистрация: 07.04.2017
Сообщений: 10

Прошу прощения за многабукаф, но не могу понять суть проблемы. Вижу, что Ваш рэгексп составлен правильно.
Не понимаю, почему мой код работает:
<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>

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

Последний раз редактировалось Bab, 08.04.2017 в 12:01.
Ответить с цитированием
  #8 (permalink)  
Старый 08.04.2017, 12:18
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 30,978

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>
Ответить с цитированием
  #9 (permalink)  
Старый 08.04.2017, 12:34
Bab Bab вне форума
Интересующийся
Отправить личное сообщение для Bab Посмотреть профиль Найти все сообщения от Bab
 
Регистрация: 07.04.2017
Сообщений: 10

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

Последний раз редактировалось Bab, 08.04.2017 в 12:39.
Ответить с цитированием
  #10 (permalink)  
Старый 08.04.2017, 12:36
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 30,978

Сообщение от Bab
Этот вариант тоже не работает
???
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сделать исключение для !предпоследнего! числа evelas Общие вопросы Javascript 1 28.11.2016 08:43
Поле для ввода телефона. При потери фокуса поля, маска прячется DDim1000 Общие вопросы Javascript 1 23.11.2016 19:02
Вывод поля ввода Мейрим Элементы интерфейса 4 10.07.2014 10:15
есть ли готовая дериктива для валидации числа с плавающей головкой fat Angular.js 10 05.12.2013 22:17
Форма для ввода текста с расширенными функциями 0x22b Элементы интерфейса 0 01.09.2008 09:38