Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Расчет стоимости услуг (https://javascript.ru/forum/project/53007-raschet-stoimosti-uslug.html)

adoafw 17.01.2015 01:26

Расчет стоимости услуг
 
Здравствуйте, я только начал с 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">&times;</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 куски кода собирал))

Noobloid 17.01.2015 03:09

<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
) вроде работает

adoafw 17.01.2015 14:19

<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 ничему не равно))

Noobloid 17.01.2015 15:04

в <script> на 4-й строчке задай значения для v1=0, v2=0, total_price=0. Ошибка на 31-й строчке- ты берёш минмальное значение с mass[0], а должен с mass[0]. Пока значения в них одинаковые- проблемм нет, но когда поменяеш на рабочие цифры- огребёш по полной от менеджеров которые должны будут объяснять клиентам куда делась их скидка :)

adoafw 17.01.2015 15:17

сделал как Вы сказали сработало) сменил для 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;


}

Noobloid 17.01.2015 15:27

Уже нигде, а до этого брал минимальную стоимость для серверов с компов

adoafw 17.01.2015 15:38

Спасибо большое Вам за помощь)) даже понял кучу всего пока разбирал Ваш код)) Тема закрыта))

PS Хотел спросить вот первое условие я понял, если шаг (числовое значение 0_val) больше или равно максимальному значению из обьекта col в массиве, то v1 присваиваем минимальное значение в обьекте price умноженную на шаг. А второе я не могу понять для чего) если не сложно обьясните)

Noobloid 17.01.2015 15:54

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;
        }
    }

Как смог так пояснил

adoafw 17.01.2015 15:58

Спасибо большое)) Адекватное пояснение)

Noobloid 17.01.2015 16:02

Цитата:

Сообщение от adoafw (Сообщение 351847)
если шаг (числовое значение 0_val)

посмотри на это с другой стороны, есть количество товаров, и есть цена которая зависит от количества


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