17.01.2015, 01:26
|
Новичок на форуме
|
|
Регистрация: 16.01.2015
Сообщений: 5
|
|
Расчет стоимости услуг
Здравствуйте, я только начал с 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 куски кода собирал))
|
|
17.01.2015, 03:09
|
Интересующийся
|
|
Регистрация: 16.01.2015
Сообщений: 23
|
|
<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
) вроде работает
Последний раз редактировалось Noobloid, 17.01.2015 в 03:16.
|
|
17.01.2015, 14:19
|
Новичок на форуме
|
|
Регистрация: 16.01.2015
Сообщений: 5
|
|
<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 ничему не равно))
|
|
17.01.2015, 15:04
|
Интересующийся
|
|
Регистрация: 16.01.2015
Сообщений: 23
|
|
в <script> на 4-й строчке задай значения для v1=0, v2=0, total_price=0. Ошибка на 31-й строчке- ты берёш минмальное значение с mass[0], а должен с mass[0]. Пока значения в них одинаковые- проблемм нет, но когда поменяеш на рабочие цифры- огребёш по полной от менеджеров которые должны будут объяснять клиентам куда делась их скидка
|
|
17.01.2015, 15:17
|
Новичок на форуме
|
|
Регистрация: 16.01.2015
Сообщений: 5
|
|
сделал как Вы сказали сработало) сменил для 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;
}
|
|
17.01.2015, 15:27
|
Интересующийся
|
|
Регистрация: 16.01.2015
Сообщений: 23
|
|
Уже нигде, а до этого брал минимальную стоимость для серверов с компов
|
|
17.01.2015, 15:38
|
Новичок на форуме
|
|
Регистрация: 16.01.2015
Сообщений: 5
|
|
Спасибо большое Вам за помощь)) даже понял кучу всего пока разбирал Ваш код)) Тема закрыта))
PS Хотел спросить вот первое условие я понял, если шаг (числовое значение 0_val) больше или равно максимальному значению из обьекта col в массиве, то v1 присваиваем минимальное значение в обьекте price умноженную на шаг. А второе я не могу понять для чего) если не сложно обьясните)
|
|
17.01.2015, 15:54
|
Интересующийся
|
|
Регистрация: 16.01.2015
Сообщений: 23
|
|
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;
}
}
Как смог так пояснил
|
|
17.01.2015, 15:58
|
Новичок на форуме
|
|
Регистрация: 16.01.2015
Сообщений: 5
|
|
Спасибо большое)) Адекватное пояснение)
|
|
17.01.2015, 16:02
|
Интересующийся
|
|
Регистрация: 16.01.2015
Сообщений: 23
|
|
Сообщение от adoafw
|
если шаг (числовое значение 0_val)
|
посмотри на это с другой стороны, есть количество товаров, и есть цена которая зависит от количества
|
|
|
|