Форум 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=119591)

Anoxia 24.12.2008 17:49

Подсчет заполненных текстовых полей
 
Подскажите как сосчитать поля с числами
тоесть есть к примеру 4 поля (x1, x2, x3, x4)
иногда заполняются все, а иногда нет.

К примеру я хочу посчитать формулу (суммировать все поля) и умножить на количество полей, игнорируя незаполненные
что то вроде такого:

заполнил 3 поля
x1+x2+x3*(количество заполненых полей)

заранее благодарен:)

Kuruki 24.12.2008 18:26

Код AS1/AS2:

var textFieldsNum:Number = 4;// кол-во полей
var total:Number = countTotal(); // сумма полей * на их кол-во
 
function countTotal():Number {
        var inputedNums:Array = [];// контейнер для заполненных
        for (var i:Number = 1; i<=textFieldsNum; i++) {
                var inputedText:String = this['textField'+i].text;
                if (inputedText != "") {//если не пустое
                        inputedNums.push(parseInt(inputedText));// запоминаем и заодно приводим в число
                }
        }
        // подсчитываем
        var totalSum:Number = 0;
        for (var j:Number = 0; j<inputedNums.length; j++) {
                totalSum += inputedNums[j];
        }
        return totalSum*inputedNums.length;
}


Mnilionic 24.12.2008 20:22

Kuruki, почему бы вместо "запоминания" сразу не складывать? :)
но с другой стороны сам люблю, когда мухи отдельно...

Kuruki 24.12.2008 20:32

Код AS1/AS2:

var textFieldsNum:Number = 4;// кол-во полей
var total:Number = countTotal(); // сумма полей * на их кол-во
 
function countTotal():Number {
        var totalSum:Number = 0;
        var filledFieldsCounter:Number = 0;
        for (var i:Number = 1; i<=textFieldsNum; i++) {
                var inputedNum:String = this['textField'+i].text;
                if (inputedNum != "") {//если не пустое
                        totalSum += parseInt(inputedNum);
                        filledFieldsCounter++;
                }
        }
 
        return totalSum*filledFieldsCounter;
}


Mnilionic 24.12.2008 20:50

Код AS1/AS2:

        ...
        var num = parseInt(inputedNum);
        if ( !isNaN(num) ) {
                totalSum += num;
                ...


Kuruki 24.12.2008 20:57

Я учитывал, что в поле можно ввести только числа и точку
UPD: а, нет, всеравно проверка нужна.

Mnilionic 24.12.2008 21:12

Цитата:

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

Anoxia 25.12.2008 08:10

сегодня буду пробовать
спасибо заранее всем огромное)

Добавлено через 4 часа 30 минут
еще бы понять как такое заставить обрабатывать мои поля
которые изначально уже есть с присвоеными именами x1, x2, x3...
тоесть я их не создаю через createTextField

не могу понять как результат вывести в мое отдельное поле "itog"

Mnilionic 25.12.2008 18:36

строку
Код:

var inputedNum:String = this['textField'+i].text;
замените на
Код:

var inputedNum:String = this['x'+i].text;

Anoxia 26.12.2008 10:13

Вложений: 1
спасибо. уже что то

хоть и пока не работает)
выложу на всякий исходник чтобы понятно было что я хочу сделать

осталось разобратся как присвоить результат переменной itog

KiL33 26.12.2008 11:39

Вложений: 1
И заметьте что поле "Итог" должно начинать с первого кадра, а не 35)))

Anoxia 27.12.2008 09:11

Спасибо ребята

оно у меня уже практически работает))))
правда пришлось подглядеть в ролик KiL33

Подглядывалка немного попортила код, но хотябы почти работает)
Заодно убедился что я все неправильно делал

Она не хочет считать дробные числа (например 0,5 + 0,5 + 0,5 + 0,5 * 4 = 0)
А вот так 0,5 + 0,5 + 2 + 2 * 4 = 16 это значит что дробные числа он игнорирует
Причем ей без разницы точки или зяпятые
Код AS1/AS2:

var textFieldsNum:Number = 4;// кол-во полей
var total:Number = countTotal();// сумма полей * на их кол-во
 
function countTotal():Number{
        var inputedNums:Array = [];// контейнер для заполненных
        var i:Number = 1;
        while (i <= textFieldsNum) {
                var inputedNum:String = this[("x" + i)].text;
                if (inputedNum != "") {//если не пустое
                        inputedNums.push(parseInt(inputedNum));
                }
                i++;
        }
        var totalSum = 0;
        var j = 0;
        while (j < inputedNums.length) {
                var totalSum = (totalSum + inputedNums[j]);
                total_mc.text = totalSum * inputedNums.length;
                j++;
        }
        return totalSum * inputedNums.length;
}
stop();

Добавлено через 31 минуту
и теперь когда полям присвоены имена, а не так как я делал переменные
не работает кнопа "очистить"
там у меня было:
Код AS1/AS2:

on (release) {
        x1="";
        x2="";
        x3="";
        x4="";
}

теперь вот тоже ума не приложу как их очищать

KiL33 27.12.2008 10:11

Цитата:

Сообщение от Anoxia (Сообщение 786745)
теперь вот тоже ума не приложу как их очищать

Приложите руки к клавиатуре и исправьте))
Код:

on (release) {
        x1.text="";
        x2.text="";
        x3.text="";
        x4.text="";
}


Anoxia 27.12.2008 11:06

точно) очистка заработала.
спасибо

осталось разобратся с дробями
кстати заметил что он не игнорирует все число.
видит целое число а на дробные ему пофик
2,5 + 2 + 2 + 2 * 4 = 32

Mnilionic 27.12.2008 23:03

parseInt() заменить на Number()

ps дроби пишутся через точку
Уж можно было догадаться почитав посты №6 и №7

KiL33 28.12.2008 08:30

Ой, только сейчас заметил, что забыл исходник в архив засунуть)))_ну думаю Anoxia вы и так разобрались)

Anoxia 28.12.2008 10:43

спасибо работает)

а возможно ли заставить флеш заменять знак "," на "." ??
тоесть чтобы если ошиблись при вводе и наставили запятых, то флеш сам перевел

покапал класс string и впринципе нашел примеры, но там везде поиск и замена по определенной строке.


тоесть было бы неплохо если бы он искал по всем полям и заменял, до того как провел расчеты. наверно лучший вариант сразу после проверки на пустые поля

Добавлено через 12 минут
Вот нашел подобную функцию
тока незнаю как заставить работать)))

Код AS1/AS2:

function _replace(str, toReplace, letters):String {
        var _pos = [];
        for (var i = 0; i<str.length; i++) {
                if (str.charAt(i) == toReplace) {
                        _pos.push(i);
                }
        }
        for (var j = 0; j<letters.length; j++) {
                str = str.substring(0, _pos[j])+letters[j]+str.substring(_pos[j]+1);
        }
        trace(str);
        return str;
}
 
_replace(",", ["."]);


Mnilionic 28.12.2008 18:23

Код AS1/AS2:

function str_replace(str, from, to):String {
        var parts = str.split( from );
        var result = parts.join( to );
        return result;
}
 
str = '1,4';
new_str = str_replace( str, ',', '.');
trace( new_str );


Anoxia 29.12.2008 12:10

Вложений: 1
Цитата:

Сообщение от Mnilionic (Сообщение 786982)
Код AS1/AS2:

function str_replace(str, from, to):String {
        var parts = str.split( from );
        var result = parts.join( to );
        return result;
}
 
str = '1,4';
new_str = str_replace( str, ',', '.');
trace( new_str );


втавил функцию в новый слой
но чето не работает

Mnilionic 29.12.2008 16:59

ну теперь примените её к тем переменным, где она необходима.

dimarik 29.12.2008 19:07

Цитата:

а возможно ли заставить флеш заменять знак "," на "." ??
Цитата:

function str_replace(str, from, to):String
Вы что, издеваетесь? =)

Код AS1/AS2:

trace('1,223,123,123.asd'.split(',').join('.'));

А еще можно к текстовому полю применить TextField.restrict

Anoxia 30.12.2008 06:51

Просто я вообще AS не знаю
Хотя вроде бы уже начал понимать что такое переменная)))
никогда этим не занимался

Anoxia 25.01.2009 14:02

Вложений: 1
немного изменил и возникла еще куча нанов

я добавил еще 4 поля sx1, sx2, sx3, sx4
они работают по принципу sx1= x1 минус результат первого вычисления

оно работает но в остальные "пустые" поля выводит наны
далее нужно каждый sx возвести в квадрат и сложить

вобщем то sx выводятся в динамические поля и мне нада сделать повторную проверку на пустые поля
и считать в зависимости от количества заполненых

Код AS1/AS2:

var textFieldsNum:Number = 4;// кол-во полей
var total:Number = countTotal();// сумма полей * на их кол-во
 
function countTotal():Number{
        var inputedNums:Array = [];// контейнер для заполненных
        var i:Number = 1;
        while (i <= textFieldsNum) {
                var inputedNum:String = this[("x" + i)].text;
                if (inputedNum != "") {//если не пустое
                        inputedNums.push(Number(inputedNum));
                }
                i++;
        }
        var totalSum = 0;
        var j = 0;
        while (j < inputedNums.length) {
                var totalSum = (totalSum + inputedNums[j]);
                total_mc.text = totalSum / inputedNums.length;
 
// тут я от каждого х отнимаю результат
 
                sx1.text = x1.text -  total_mc.text
                sx2.text = x2.text -  total_mc.text
                sx3.text = x3.text -  total_mc.text
                sx4.text = x4.text -  total_mc.text
 
// тут пытаюсь сложить квадраты
 
                sxkvadrat.text = Math.sqrt(sx1.text) + Math.sqrt(sx2.text) + Math.sqrt(sx3.text) + Math.sqrt(sx4.text)
                j++;
        }
        return totalSum * inputedNums.length;
 
}
stop();

вот исходник с роликом

Fatality 25.01.2009 14:39

Метод sqrt класса Math работает с числами, а вы даете ему строку(sxN.text) и поэтому возвращается NaN, для преобразования строки в число используйте parseInt() или parseFloat(), второе предпочтительнее.
Код AS1/AS2:

Math.sqrt(parseFloat(sxN.text));


Anoxia 26.01.2009 09:59

спасибо parseInt() помог

теперь остались главные проблемы.
если поля Хn не все заполнены то считать ничего не будет.

но как сделать чтобы количество отниманий результата и количество сложений квадратов, были равны изначальному количеству заполненых полей?


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

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