PDA

Просмотр полной версии : Ограничение знаков после точки в текст инпут.


glukaviy
29.11.2009, 16:12
Как сделать ограничение после ввода в текст инпут числа ограничение такого типа 1.00 т.е. если вводиться целое число то знаком скока угодно но после точки всего два знака может быть?

mooncar
29.11.2009, 18:18
Готовых методов, насколько мне известно, нет. Нужно писать функцию на событие текстового поля onChanged, которая бы проверяла, введена или нет точка. Если точка введена, то свойство maxChars для текстового поля оперативно устанавливается в количество уже введенных символов (длина введенной строки) + 2. Остается только вопрос, как быть, если юзер захочет изменить целую часть.

Другой вариант - на onChanged брать введенную строку, приводить к Number, усекать до двух знаков после точки и тут же выводить в поле усеченное значение.
Да, этот способ лучше, но он предполагает, что юзер в какой-то момент все-таки сможет ввести больше двух знаков после точки.

UPD:
Вот возможное решение придумалось (с onChanged, как оказалось, решение не очень получается).
Пример для 3-х полей ввода, можно повесить проверку на любое количество полей ввода по аналогии:
///// ОГРАНИЧЕНИЕ КОЛИЧЕСТВА РАЗРЯДОВ ПОСЛЕ ТОЧКИ В ПОЛЕ ВВОДА ////////////
var restrictLength:Number = 2; //разрешенная длина дробной части

input1_tf.onSetFocus = startCheck;
input2_tf.onSetFocus = startCheck;
input3_tf.onSetFocus = startCheck;
//... и т.д.

function startCheck () {
id = setInterval (checkSymbols, 10, this); //this - передаем в функцию для постоянной проверки имя текстового поля
this.onKillFocus = stopCheck; //при потере полем фокуса отключаем проверку поля
}

function stopCheck () {
clearInterval (id);
}

function checkSymbols (tf:TextField) { //функция проверки
var pointIndex:Number = tf.text.indexOf('.'); //положение точки в поле
var cursorIndex:Number = Selection.getCaretIndex(); //положение курсора в поле
var tfLength:Number = tf.text.length ; //длина введенной строки

if (pointIndex >= 0 ) { //если точка в поле введена
tf.restrict = '0-9'; //исключаем точку из возможных к вводу символов, оставляем только цифры
if (cursorIndex > pointIndex) { //если курсор справа от точки
//вычисляем длину имеющейся дробной части:
var fractLength:Number = tfLength - pointIndex - 1;
//ставим ограничение на длину вводимой строки,
//тем самым фактически ограничиваем число символов после точки:
tf.maxChars = tfLength + (restrictLength - fractLength);
}
else { //если курсор слева от точки (в целой части введенного числа)
tf.maxChars = undefined ;//снимаем ограничение на длину вводимой строки
}
}
else { //если точка не введена
tf.restrict = '0-9.'; //разрешаем вводить и цифры, и точку
tf.maxChars = undefined ; //снимаем ограничение на длину вводимой строки
}

//предотвращаем разбиение уже введенной строки точкой в произвольном месте
if (cursorIndex < tfLength) { //если курсор не находится в конце введенной стороки, то также
tf.restrict = '0-9'; //исключаем точку из возможных к вводу символов, оставляем только цифры
}
}

Конечно, еще нужно:
- ввести триггеры установки того или иного состояния, чтобы не производить постоянные лишние действия с разрешением-запрещением ввода, если они уже были произведены,
- ограничение на ввод нулей перед значимой частью числа,
но уже лень самому, так работает и принцип ясен. :)

Интересно, может быть есть какое-то более простое решение?

glukaviy
30.11.2009, 03:43
Спасибо буду пробовать)

udaaff
30.11.2009, 06:09
Можно поискать библиотеку regexp для AS2, уверен, что такая найдется.

mooncar
30.11.2009, 06:16
Можно поискать библиотеку regexp для AS2, уверен, что такая найдется.
То есть использовать регулярное выражение, означающее "не более двух цифровых символов после точки" и также постоянно делать проверку в интервальной функции?

udaaff
30.11.2009, 07:17
Если речь идет о форме, я бы не стал вешать проверку на интервал, а проверял бы правильность введенных данных через некоторое время после остановки ввода:
var timeoutID:Number;
txt.onChanged = onChangedHandler;

function onChangedHandler(target:TextField):Void
{
if (timeoutID)
clearTimeout(timeoutID);

timeoutID = setTimeout(timeoutHandler, 2000);
}

function timeoutHandler():Void
{
delete timeoutID;

trace("проверка на соответствие заданному шаблону");
}

mooncar
30.11.2009, 12:28
udaff, если только речь идет не о проверке, а именно о вводе новых правил ограничения. Тут вроде автору нужно не проверка пост-фактум, а именно недопущение.
Но еще одна засада с onChanged. ИМХО, не получится. Если юзер сделал ввод в дробной части и курсор остался там, то ограничения на ввод работать должны. Но если он просто мышкой перещелкнул в целую часть (события onChanged при этом не было!), то ограничения должны сняться, то есть должны заработать другие правила - ведь целую часть можно добавлять, в отличии от дробной.
Поэтому я остановился на непрерывной проверке через интервальную функцию, пока поле имеет фокус ввода.
У автора, насколько я знаю, форма.