Расчет стоимости услуг
Здравствуйте, я только начал с js работать и есть задача калькулятор услуг. Обычный калькулятор дался легко и с ним проблем небыло, но когда встала задача о том что нужно изменять сумму в зависимости от шага у меня появилась проблема вроде все верно)) но в итоге по нулям))
//calc.php <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> <h4 class="modal-title" id="myModalLabel">Расчет стоимости</h4> </div> <div class="modal-body"> <label for="0_val">Количество компьютеров</label> <input type="number" size="4" value="0" min="0" onchange="calc()" id="0_val" autofocus><br/> <p>Итог: <span id="result">0</span> руб.</p> <hr> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> </div> </div> </div> </div> //calc.php-end //calc.js function calc() { var summa = 0; var col_minus = 0; var mass = [ {"id":0,"col":[0,6,11,16,21,31],"price":[100,95,90,85,100,75]}, {"id":1,"col":[0],"price":[200]} ]; var mass_id = document.getElementById(mass[i]["id"] + '_val');// я так понял с id="0_val" for (var i = 0; i < mass.length; i++) { var kol = 0; var kol = parseInt(mass_id.value, 10); if ( (kol<0) || isNaN(kol) ) { kol = 0; mass_id.value = 0; } for ( col_minus = mass[i]["col"].length-1; mass[i]["col"][col_minus]> kol && col_minus>0; col_minus-- ); cena = mass[i]["price"][col_minus]; summa += cena*kol; if (mass[i].id == 0) { price_comp = kol; } } var price_comp; result.innerHTML = summa; //calc.js-end ps куски кода собирал)) |
<div class="modal-body"> <label for="0_val">Количество компьютеров</label> <input type="number" size="4" value="0" min="0" onchange="calc()" id="0_val" autofocus><br/> <p>Итог: <span id="result">0</span> руб.</p> <hr> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> </div> <script> function calc() { var ammount = document.getElementById("0_val").value;// var mass = [ {"id":0, "col":[0,6,11,16,21,31], "price":[100,95,90,85,80,75]}, {"id":1, "col":[0], "price":[200]} ]; for (var i in mass[0].col) { i=parseInt(i); if(ammount >= Math.max.apply(Math, mass[0].col)){ document.getElementById("result").innerText = Math.min.apply(Math, mass[0].price)*ammount; break; }else if(ammount>mass[0].col[i] && ammount<=mass[0].col[i+1]){ document.getElementById("result").innerText = mass[0].price[i]*ammount; break; } } } </script> От как-то так получилось, не очень понял зачем 2 объекта в mass, использовал только первый но вроде считает. Переправил ряд с 100,95,90,85,100,75 на 100,95,90,85,80,75 ) вроде работает |
<div class="modal-body"> <label for="0_val">Количество компьютеров</label> <input type="number" size="4" value="0" min="0" onchange="calc()" id="0_val" autofocus><br/> <label for="1_val">Количество Серверов</label> <input type="number" size="4" value="0" min="0" onchange="calc()" id="1_val" autofocus><br/> <p>Итог: <span id="result">0</span> руб.</p> <hr> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> </div> function calc() { var ammount = document.getElementById("0_val").value; // var ammount1 = document.getElementById("1_val").value; var v1, v2, total_price; var mass = [{ "id": 0, "col": [0, 6, 11, 16, 21, 31], "price": [100, 95, 90, 85, 80, 75] }, { "id": 1, "col": [0, 6, 11, 16, 21, 31], "price": [100, 95, 90, 85, 80, 75] }]; for (var i in mass[0].col) { i = parseInt(i); if (ammount >= Math.max.apply(Math, mass[0].col)) { v1 = Math.min.apply(Math, mass[0].price) * ammount; break; } else if (ammount > mass[0].col[i] && ammount <= mass[0].col[i + 1]) { v1 = mass[0].price[i] * ammount; break; } } for (var i in mass[1].col) { i = parseInt(i); if (ammount1 >= Math.max.apply(Math, mass[1].col)) { v2 = Math.min.apply(Math, mass[0].price) * ammount1; break; } else if (ammount1 > mass[1].col[i] && ammount1 <= mass[1].col[i + 1]) { v2 = mass[1].price[i] * ammount1; break; } } var total_price = ( v1 + v2); result.innerHTML = total_price; } Добавил еще одну услугу и тут такая проблемка. Если выбирать тольку одну услугу пишет NaN рублей, но я не могу понять почему total_price ничему не равно)) |
в <script> на 4-й строчке задай значения для v1=0, v2=0, total_price=0. Ошибка на 31-й строчке- ты берёш минмальное значение с mass[0], а должен с mass[0]. Пока значения в них одинаковые- проблемм нет, но когда поменяеш на рабочие цифры- огребёш по полной от менеджеров которые должны будут объяснять клиентам куда делась их скидка :)
|
сделал как Вы сказали сработало) сменил для 2 услуги другие значения
то вроде работает)) Сменил на рабочие цифры где я могу тут огрести))?? function calc() { var ammount = document.getElementById("0_val").value; // var ammount1 = document.getElementById("1_val").value; var v1=0, v2=0, total_price=0; var mass = [{ "id": 0, "col": [0, 5, 10, 15, 20, 30], "price": [5000, 4000, 3000, 2000, 1500, 1000] }, { "id": 1, "col": [0, 5, 10, 15, 20, 30], "price": [10000, 5000, 4000, 3000, 2000, 1000] }]; for (var i in mass[0].col) { i = parseInt(i); if (ammount >= Math.max.apply(Math, mass[0].col)) { v1 = Math.min.apply(Math, mass[0].price) * ammount; break; } else if (ammount > mass[0].col[i] && ammount <= mass[0].col[i + 1]) { v1 = mass[0].price[i] * ammount; break; } } for (var i in mass[1].col) { i = parseInt(i); if (ammount1 >= Math.max.apply(Math, mass[1].col)) { v2 = Math.min.apply(Math, mass[1].price) * ammount1; break; } else if (ammount1 > mass[1].col[i] && ammount1 <= mass[1].col[i + 1]) { v2 = mass[1].price[i] * ammount1; break; } } var total_price = ( v1 + v2); result.innerHTML = total_price; } |
Уже нигде, а до этого брал минимальную стоимость для серверов с компов
|
Спасибо большое Вам за помощь)) даже понял кучу всего пока разбирал Ваш код)) Тема закрыта))
PS Хотел спросить вот первое условие я понял, если шаг (числовое значение 0_val) больше или равно максимальному значению из обьекта col в массиве, то v1 присваиваем минимальное значение в обьекте price умноженную на шаг. А второе я не могу понять для чего) если не сложно обьясните) |
for (var i in mass[0].col) {//прогоняем через все значения количеств в массиве i = parseInt(i); if (ammount >= Math.max.apply(Math, mass[0].col)) {//это должно срабатывать в самом конце если вообще дойдёт сюда v1 = Math.min.apply(Math, mass[0].price) * ammount; break; } else if (ammount > mass[0].col[i] && ammount <= mass[0].col[i + 1]) {//если количесво введёное юзером больше чем "mass[0].col[i]" и меньше чем "mass[0].col[i+1]" (т.е. находится между соседних значений в массиве) то высчитываем значение и обрываем for loop. Но тут есть проблемма- если i дойдёт до последнего значения в массиве то mass[0].col[i + 1] выдаст ошибку поскольку в массиве нет индекса [i + 1], чтобы этого избежать сделан первый if statement- если количесво введёное пользователем больше или равно максимальному значению в массиве- то вычисляем сумму по минимальному значению в массиве цен и обрываем for loop чтобы не получить ошибки с mass[0].col[i + 1] v1 = mass[0].price[i] * ammount; break; } } Как смог так пояснил |
Спасибо большое)) Адекватное пояснение)
|
Цитата:
|
Часовой пояс GMT +3, время: 16:07. |