Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Ограничение знаков после точки в текст инпут. (http://www.flasher.ru/forum/showthread.php?t=133188)

glukaviy 29.11.2009 16:12

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

mooncar 29.11.2009 18:18

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

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

UPD:
Вот возможное решение придумалось (с onChanged, как оказалось, решение не очень получается).
Пример для 3-х полей ввода, можно повесить проверку на любое количество полей ввода по аналогии:
Код AS1/AS2:

/////   ОГРАНИЧЕНИЕ КОЛИЧЕСТВА РАЗРЯДОВ ПОСЛЕ ТОЧКИ В ПОЛЕ ВВОДА ////////////
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

Цитата:

Сообщение от udaaff (Сообщение 869208)
Можно поискать библиотеку regexp для AS2, уверен, что такая найдется.

То есть использовать регулярное выражение, означающее "не более двух цифровых символов после точки" и также постоянно делать проверку в интервальной функции?

udaaff 30.11.2009 07:17

Если речь идет о форме, я бы не стал вешать проверку на интервал, а проверял бы правильность введенных данных через некоторое время после остановки ввода:
Код AS1/AS2:

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


Часовой пояс GMT +4, время: 02:43.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.