Просмотр полной версии : Подсчет заполненных текстовых полей
Подскажите как сосчитать поля с числами
тоесть есть к примеру 4 поля (x1, x2, x3, x4)
иногда заполняются все, а иногда нет.
К примеру я хочу посчитать формулу (суммировать все поля) и умножить на количество полей, игнорируя незаполненные
что то вроде такого:
заполнил 3 поля
x1+x2+x3*(количество заполненых полей)
заранее благодарен:)
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, почему бы вместо "запоминания" сразу не складывать? :)
но с другой стороны сам люблю, когда мухи отдельно...
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
...
var num = parseInt(inputedNum);
if ( !isNaN(num) ) {
totalSum += num;
...
Я учитывал, что в поле можно ввести только числа и точку
UPD: а, нет, всеравно проверка нужна.
Mnilionic
24.12.2008, 21:12
Как говорят у нас в Братстве: лучше перебдеть, чем недобдеть. :)
там как раз из-за точки и можно намутить NaN-ов )))
сегодня буду пробовать
спасибо заранее всем огромное)
Добавлено через 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;
спасибо. уже что то
хоть и пока не работает)
выложу на всякий исходник чтобы понятно было что я хочу сделать
осталось разобратся как присвоить результат переменной itog
И заметьте что поле "Итог" должно начинать с первого кадра, а не 35)))
Спасибо ребята
оно у меня уже практически работает))))
правда пришлось подглядеть в ролик KiL33
Подглядывалка немного попортила код, но хотябы почти работает)
Заодно убедился что я все неправильно делал
Она не хочет считать дробные числа (например 0,5 + 0,5 + 0,5 + 0,5 * 4 = 0)
А вот так 0,5 + 0,5 + 2 + 2 * 4 = 16 это значит что дробные числа он игнорирует
Причем ей без разницы точки или зяпятые
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 минуту
и теперь когда полям присвоены имена, а не так как я делал переменные
не работает кнопа "очистить"
там у меня было:
on (release) {
x1="";
x2="";
x3="";
x4="";
}
теперь вот тоже ума не приложу как их очищать
теперь вот тоже ума не приложу как их очищать
Приложите руки к клавиатуре и исправьте))
on (release) {
x1.text="";
x2.text="";
x3.text="";
x4.text="";
}
точно) очистка заработала.
спасибо
осталось разобратся с дробями
кстати заметил что он не игнорирует все число.
видит целое число а на дробные ему пофик
2,5 + 2 + 2 + 2 * 4 = 32
Mnilionic
27.12.2008, 23:03
parseInt() заменить на Number()
ps дроби пишутся через точку
Уж можно было догадаться почитав посты №6 и №7
Ой, только сейчас заметил, что забыл исходник в архив засунуть)))_ну думаю Anoxia вы и так разобрались)
спасибо работает)
а возможно ли заставить флеш заменять знак "," на "." ??
тоесть чтобы если ошиблись при вводе и наставили запятых, то флеш сам перевел
покапал класс string и впринципе нашел примеры, но там везде поиск и замена по определенной строке.
тоесть было бы неплохо если бы он искал по всем полям и заменял, до того как провел расчеты. наверно лучший вариант сразу после проверки на пустые поля
Добавлено через 12 минут
Вот нашел подобную функцию
тока незнаю как заставить работать)))
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
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 );
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
ну теперь примените её к тем переменным, где она необходима.
а возможно ли заставить флеш заменять знак "," на "." ??
function str_replace(str, from, to):String
Вы что, издеваетесь? =)
trace('1,223,123,123.asd'.split(',').join('.'));
А еще можно к текстовому полю применить TextField.restrict
Просто я вообще AS не знаю
Хотя вроде бы уже начал понимать что такое переменная)))
никогда этим не занимался
немного изменил и возникла еще куча нанов
я добавил еще 4 поля sx1, sx2, sx3, sx4
они работают по принципу sx1= x1 минус результат первого вычисления
оно работает но в остальные "пустые" поля выводит наны
далее нужно каждый sx возвести в квадрат и сложить
вобщем то sx выводятся в динамические поля и мне нада сделать повторную проверку на пустые поля
и считать в зависимости от количества заполненых
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(), второе предпочтительнее.
Math.sqrt(parseFloat(sxN.text));
спасибо parseInt() помог
теперь остались главные проблемы.
если поля Хn не все заполнены то считать ничего не будет.
но как сделать чтобы количество отниманий результата и количество сложений квадратов, были равны изначальному количеству заполненых полей?
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.