Почему мой JavaScript переключатель возвращает "NaN"? - PullRequest
0 голосов
/ 20 марта 2020

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

Мой переключатель для цены билета работает, но один для ставки доплаты возвращается как NaN после того, как я ввел случай в подсказке.

Я преобразовал значение, которое функция surchargeRate (cardType) возвращает в число, но по какой-то причине оно все еще дает мне NaN.

Я пытался выяснить, в чем проблема но не смог понять.

Вот мой код:

function surchargeRate(cardType) {

  var surchargeRate;

  switch (cardType) {
    case "1":
      surchargeRate = 0.02;
      break;
    case "2":
      surchargeRate = 0.01;
      break;
  } // end switch
  return surchargeRate;
}

// This function calculates the surcharge amount.

function surchargeAmount(ticketCost, surchargeRate) {

  return ticketCost * surchargeRate;
}

function determineTicketPrice(seatingAreaCategory) {

  var ticketPrice;
  switch (seatingAreaCategory) {

    case "S":
    case "s":
      ticketPrice = 180;
      break;
    case "C":
    case "c":
      ticketPrice = 150;
      break;
    case "B":
    case "b":
      ticketPrice = 100;
      break;
    case "R":
    case "r":
      ticketPrice = 70;
      break;
    default:
      ticketPrice = 0;
      break;
  } // end switch
  return ticketPrice;
}

function totalAmount(ticketPrice, ticketQty) {

  return ticketPrice * ticketQty;
}

function validateQty(ticketQty) {

  if (ticketQty >= 1 && ticketQty <= 20) {
    return true;
  } else {
    alert("Ticket number must be between 1 and 20");
    return false;
  }
}

function init() {

  surchargeRate = surchargeRate(cardType);
  surchargeRate = Number(surchargeRate);

  var surcharge;
  var finalCost;

  if (surchargeRate == -1) {
    surchargeRate = new Error("Invalid input");
  } else {
    surcharge = surchargeAmount(ticketCost, surchargeRate);
  }

  finalCost = surcharge + ticketCost;

  var seatingAreaCategory;
  seatingAreaCategory = prompt("Please enter seating area category: ");

  var ticketPrice = determineTicketPrice(seatingAreaCategory);
  ticketPrice = Number(ticketPrice);

  var ticketQty;
  ticketQty = prompt("Please enter ticket quantity: ");
  ticketQty = Number(ticketQty);

  var ticketCost;
  ticketCost = totalAmount(ticketPrice, ticketQty);

  var cardType;
  cardType = prompt("Enter your Card type. Enter 1 for American Express and 2 for Visa/Mastercard ");

  var validQty = validateQty(ticketQty);

  console.log(cardType);
  console.log(surchargeRate);




  var seatOut = document.getElementById("seatingArea").innerHTML = "Your seating area is: " + seatingAreaCategory;
  var priceOut = document.getElementById("pricePerTicket").innerHTML = "Price per ticket: " + ticketPrice;
  var validQtyOut = document.getElementById("ticketQty").innerHTML = "Number of tickets ordered: " + ticketQty.toFixed(2);
  var beforeSurchargeOut = document.getElementById("beforeSurcharge").innerHTML = "Gross amount: " + ticketCost;
  var surchargeOut = document.getElementById("surcharge").innerHTML = "Card fee: " + surcharge;
  var costOut = document.getElementById("amountDue").innerHTML = "Amount due: " + finalCost;

}

window.onload = init;

1 Ответ

0 голосов
/ 20 марта 2020
  1. Значения по умолчанию var surchargeRate = 0; или default: surchargeRate = 0; и var ticketPrice = 0;
  2. Подъем переменных без var - функция windows.surchargeRate перезаписывается на surchargeRate = surchargeRate(cardType);
  3. Init много вычисляет без какого-либо ввода - сначала получите ввод, затем используйте его

function surchargeRate(cardType) {

  var surchargeRate;

  switch (cardType) {
    case "1":
      surchargeRate = 0.02;
      break;
    case "2":
      surchargeRate = 0.01;
      break;
  } // end switch
  return surchargeRate;
}

// This function calculates the surcharge amount.

function surchargeAmount(ticketCost, surchargeRate) {

  return ticketCost * surchargeRate;
}

function determineTicketPrice(seatingAreaCategory) {

  var ticketPrice = 0;
  switch (seatingAreaCategory) {

    case "S":
    case "s":
      ticketPrice = 180;
      break;
    case "C":
    case "c":
      ticketPrice = 150;
      break;
    case "B":
    case "b":
      ticketPrice = 100;
      break;
    case "R":
    case "r":
      ticketPrice = 70;
      break;
    default:
      ticketPrice = 0;
      break;
  } // end switch
  return ticketPrice;
}

function totalAmount(ticketPrice, ticketQty) {

  return ticketPrice * ticketQty;
}

function validateQty(ticketQty) {

  if (ticketQty >= 1 && ticketQty <= 20) {
    return true;
  } else {
    alert("Ticket number must be between 1 and 20");
    return false;
  }
}

function init() {

  var beforeSurchargeOut = document.getElementById("beforeSurcharge");
  var costOut = document.getElementById("amountDue");
  var priceOut = document.getElementById("pricePerTicket");
  var seatOut = document.getElementById("seatingArea");
  var surchargeOut = document.getElementById("surcharge");
  var validQtyOut = document.getElementById("ticketQty");


  var surcharge;
  var finalCost;
  var seatingAreaCategory;
  seatingAreaCategory = prompt("Please enter seating area category: ");

  var ticketPrice = determineTicketPrice(seatingAreaCategory);
  ticketPrice = Number(ticketPrice);

  var ticketQty;
  ticketQty = prompt("Please enter ticket quantity: ");
  ticketQty = Number(ticketQty);

  var ticketCost;
  ticketCost = totalAmount(ticketPrice, ticketQty);

  var cardType;
  cardType = prompt("Enter your Card type. Enter 1 for American Express and 2 for Visa/Mastercard ");

  var validQty = validateQty(ticketQty);

  if (surcharge == -1) {
    surcharge = new Error("Invalid input");
  } else {
    surcharge = surchargeAmount(ticketCost, surchargeRate(cardType));
  }

  finalCost = surcharge + ticketCost;


  console.log(cardType);
  console.log(surcharge);

  beforeSurchargeOut.innerHTML = "Gross amount: " + ticketCost.toFixed(2);
  costOut.innerHTML = "Amount due: " + finalCost.toFixed(2);
  priceOut.innerHTML = "Price per ticket: " + ticketPrice.toFixed(2);
  seatOut.innerHTML = "Your seating area is: " + seatingAreaCategory;
  surchargeOut.innerHTML = "Card fee: " + surcharge.toFixed(2);
  validQtyOut.innerHTML = "Number of tickets ordered: " + ticketQty;
}

window.onload = init;
<span id="beforeSurcharge"></span><br/>
<span id="amountDue"></span><br/>
<span id="pricePerTicket"></span><br/>
<span id="seatingArea"></span><br/>
<span id="surcharge"></span><br/>
<span id="ticketQty"></span><br/>
...