Cash Register code help!

Hi everyone,

So I’ve been trying to complete the Cash Register project. I honestly think i’ve done it in such a round about way that it might look disgusting to most of you.
But the logic works… almost

Right now they way the code is it is calculating the change required perfectly, except when I enter 100 when the price is 3.26 it only uses $5 twice when it can use it more
I set up an IF statement to only stop using the currency if we have less “stock” than the change value we are using.

Honestly would really appreicate any help, Its kind of long but if you paste the code in yourself you can see what I mean:

Left is what my code gives, the middle is what it is supposed to give
Its blowing my mind (How is 45 less than 5!!!)

html:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Cash Register</title>
    </head>

    <body>
        <h1>Cash Register</h1>
        <input id = "cash">
        <div id = "change-due">change due</div>
        <button id = "purchase-btn" onclick = "press()">purchase</button>

        <div id = "register">Register</div>

        <script src = "script.js"></script>

    </body>

</html>

javascript:


let price = 3.26;
let cid = [
  ["PENNY", 1.01],
  ["NICKEL", 2.05],
  ["DIME", 3.1],
  ["QUARTER", 4.25],
  ["ONE", 90],
  ["FIVE", 55],
  ["TEN", 20],
  ["TWENTY", 60],
  ["ONE HUNDRED", 100]
];

let register = document.getElementById("register");

register.innerHTML += "<br>" + "Price: " + price
register.innerHTML += "<br>" + "<br>" + (cid[0][0] + ": $" + cid[0][1]);
register.innerHTML += "<br>" + (cid[1][0] + ": $" + cid[1][1]);
register.innerHTML += "<br>" + (cid[2][0] + ": $" + cid[2][1]);
register.innerHTML += "<br>" + (cid[3][0] + ": $" + cid[3][1]);
register.innerHTML += "<br>" + (cid[4][0] + ": $" + cid[4][1]);
register.innerHTML += "<br>" + (cid[5][0] + ": $" + cid[5][1]);
register.innerHTML += "<br>" + (cid[6][0] + ": $" + cid[6][1]);
register.innerHTML += "<br>" + (cid[7][0] + ": $" + cid[7][1]);
register.innerHTML += "<br>" + (cid[8][0] + ": $" + cid[8][1]);


let cash = document.getElementById("cash");
let changeDue = document.getElementById("change-due");


function press() {

    let cashValue = parseFloat(cash.value);
    // console.log("cash value: " + cashValue)
    // console.log("price: " + price)
    

    if (cashValue < price || cash.value.trim() === "" ) {
        alert("Customer does not have enough money to purchase the item");
    } else if (cashValue === price) {
        changeDue.innerHTML = ("No change due - customer paid with exact cash");
    } else {
        calc();
    }
}

let reg = {
    0.01: 1.01,
    0.05: 2.05,
    0.1: 3.1,
    0.25: 4.25,
    1: 90,
    5: 55,
    10: 20,
    20: 60,
    100: 100,        
}


function calc() {
    let cashValue = parseFloat(cash.value);
    console.log("calc activated")
    let changeFinal = cashValue - price;
    let change = changeFinal;
    

    register.innerHTML = ("Register");
    register.innerHTML += "<br>" + ("Change: " + changeFinal.toFixed(2));



    const stock = Object.keys(reg).sort(function(a, b) {
        return a - b;
    });
    
    console.log(stock.reverse())

    stock.forEach(key => {
        console.log("currency: " + key + " stock: $" + reg[key].toFixed(2) + " change: " + change.toFixed(2))  
  
        

        while (change.toFixed(3) >= parseInt(key)) {
            let hug = reg[key] -= key;
            hug.toFixed(2);
            change -= key;
            console.log("stock: " + reg[key])
            

            if ((reg[key]).toFixed(2) <= key){
                console.log(reg[key] + " < " + key)
                console.log("PROBLEM NO MONEY")
                break
            }
            

        }

        
        
 
    }); 


    let a = cid[0][1] - reg[0.01];
    let b = cid[1][1] - reg[0.05];
    let c = cid[2][1] - reg[0.1];    
    let d = cid[3][1] - reg[0.25];
    let e = cid[4][1] - reg[1];
    let f = cid[5][1] - reg[5];
    let g = cid[6][1] - reg[10];
    let h = cid[7][1] - reg[20];
    let i = cid[8][1] - reg[100];

    let gimme = [
        ["PENNY", a.toFixed(2)],
        ["NICKEL", b.toFixed(2)],
        ["DIME", c.toFixed(2)],
        ["QUARTER", d.toFixed(2)],
        ["ONE", e.toFixed(2)],
        ["FIVE", f.toFixed(2)],
        ["TEN", g.toFixed(2)],
        ["TWENTY", h.toFixed(2)],
        ["ONE HUNDRED", i.toFixed(2)]
      ];
    
    console.log(gimme)

    changeDue.innerHTML = "Status: OPEN";

    if (i > 0) {
        changeDue.innerHTML += "<br>" + (gimme[8][0]) + ": " + "$" + (gimme[8][1]);
    }

    if (h > 0) {
        changeDue.innerHTML += "<br>" + (gimme[7][0]) + ": " + "$" + (gimme[7][1]);
    }
    
    if (g > 0) {
        changeDue.innerHTML += "<br>" + (gimme[6][0]) + ": " + "$" + (gimme[6][1]);
    }

    if (f > 0) {
        changeDue.innerHTML += "<br>" + (gimme[5][0]) + ": " + "$" + (gimme[5][1]);
    }

    if (e > 0) {
        changeDue.innerHTML += "<br>" + (gimme[4][0]) + ": " + "$" + (gimme[4][1]);
    }

    if (d > 0) {
        changeDue.innerHTML += "<br>" + (gimme[3][0]) + ": " + "$" + (gimme[3][1]);
    }

    if (c > 0) {
        changeDue.innerHTML += "<br>" + (gimme[2][0]) + ": " + "$" + (gimme[2][1]);
    }

    if (b > 0) {
        changeDue.innerHTML += "<br>" + (gimme[1][0]) + ": " + "$" + (gimme[1][1]);
    }

    if (a > 0){
        changeDue.innerHTML += "<br>" + (gimme[0][0]) + ": " + "$" + (gimme[0][1]);
    }

    register.innerHTML += "<br>" + ("Price: " + price);
    register.innerHTML += "<br>" + "<br>" + (cid[0][0] + ": $" + reg[0.01].toFixed(2));
    register.innerHTML += "<br>" + (cid[1][0] + ": $" + reg[0.05].toFixed(2));
    register.innerHTML += "<br>" + (cid[2][0] + ": $" + reg[0.1].toFixed(2));
    register.innerHTML += "<br>" + (cid[3][0] + ": $" + reg[0.25].toFixed(2));
    register.innerHTML += "<br>" + (cid[4][0] + ": $" + reg[1].toFixed(2));
    register.innerHTML += "<br>" + (cid[5][0] + ": $" + reg[5].toFixed(2));
    register.innerHTML += "<br>" + (cid[6][0] + ": $" + reg[10].toFixed(2));
    register.innerHTML += "<br>" + (cid[7][0] + ": $" + reg[20].toFixed(2));
    register.innerHTML += "<br>" + (cid[8][0] + ": $" + reg[100].toFixed(2));
    
}

That’s because these are not numbers, but strings. toFixed specifically returns string, similarly to values returned by Object.keys(). This means characters from each string are compared one-by-one from the left.

'45' < '5'  // true

Oh my god, you know I thought that, and I tried converting to a float, but I was always only doing one of them, not both

if (parseFloat(reg[key].toFixed(2)) < parseFloat(key)){

This is giving me the correct change now
Thank you!

However I feel like its looking so messy right now.
What do you think of how I’ve written this?

Actually!!!
Im sorry, but for some reason FreeCodeCamp still thinks the test is coming back wrong with the price being 136 and the cash being 100

The code gives the answer perfectly
image

Not sure why though:

Javascript:

let price = 3.26;
let cid = [
  ["PENNY", 1.01],
  ["NICKEL", 2.05],
  ["DIME", 3.1],
  ["QUARTER", 4.25],
  ["ONE", 90],
  ["FIVE", 55],
  ["TEN", 20],
  ["TWENTY", 60],
  ["ONE HUNDRED", 100]
];

let register = document.getElementById("register");

register.innerHTML += "<br>" + "Price: " + price
register.innerHTML += "<br>" + "<br>" + (cid[0][0] + ": $" + cid[0][1]);
register.innerHTML += "<br>" + (cid[1][0] + ": $" + cid[1][1]);
register.innerHTML += "<br>" + (cid[2][0] + ": $" + cid[2][1]);
register.innerHTML += "<br>" + (cid[3][0] + ": $" + cid[3][1]);
register.innerHTML += "<br>" + (cid[4][0] + ": $" + cid[4][1]);
register.innerHTML += "<br>" + (cid[5][0] + ": $" + cid[5][1]);
register.innerHTML += "<br>" + (cid[6][0] + ": $" + cid[6][1]);
register.innerHTML += "<br>" + (cid[7][0] + ": $" + cid[7][1]);
register.innerHTML += "<br>" + (cid[8][0] + ": $" + cid[8][1]);


let cash = document.getElementById("cash");
let changeDue = document.getElementById("change-due");


function press() {

    let cashValue = parseFloat(cash.value);
    // console.log("cash value: " + cashValue)
    // console.log("price: " + price)
    

    if (cashValue < price || cash.value.trim() === "" ) {
        alert("Customer does not have enough money to purchase the item");
    } else if (cashValue === price) {
        changeDue.innerHTML = ("No change due - customer paid with exact cash");
    } else {
        calc();
    }
}

let reg = {
    0.01: cid[0][1],
    0.05: cid[1][1],
    0.1: cid[2][1],
    0.25: cid[3][1],
    1: cid[4][1],
    5: cid[5][1],
    10: cid[6][1],
    20: cid[7][1],
    100: cid[8][1],        
}


function calc() {
    let cashValue = parseFloat(cash.value);
    console.log("calc activated")
    let changeFinal = cashValue - price;
    let change = changeFinal;
    

    register.innerHTML = ("Register");
    register.innerHTML += "<br>" + ("Change: " + changeFinal.toFixed(2));



    const stock = Object.keys(reg).sort(function(a, b) {
        return a - b;
    });
    
    console.log(stock.reverse())

    stock.forEach(key => {
        console.log("currency: " + key + " stock: $" + reg[key].toFixed(2) + " change: " + change.toFixed(2))  
  
        

        while (change.toFixed(3) >= parseFloat(key)) {
            let hug = reg[key] -= key;
            hug.toFixed(2);
            change -= key;
            console.log("Stock: " + reg[key].toFixed(2))

            if (parseFloat(reg[key].toFixed(2)) < parseFloat(key)){
                console.log(reg[key] + " < " + key)
                console.log("PROBLEM NO MONEY")
                break;
            }
            

        }

    }); 

   

    let a = cid[0][1] - reg[0.01];
    let b = cid[1][1] - reg[0.05];
    let c = cid[2][1] - reg[0.1];    
    let d = cid[3][1] - reg[0.25];
    let e = cid[4][1] - reg[1];
    let f = cid[5][1] - reg[5];
    let g = cid[6][1] - reg[10];
    let h = cid[7][1] - reg[20];
    let i = cid[8][1] - reg[100];

    let gimme = [
        ["PENNY", a.toFixed(2)],
        ["NICKEL", b.toFixed(2)],
        ["DIME", c.toFixed(2)],
        ["QUARTER", d.toFixed(2)],
        ["ONE", e.toFixed(0)],
        ["FIVE", f.toFixed(0)],
        ["TEN", g.toFixed(0)],
        ["TWENTY", h.toFixed(0)],
        ["ONE HUNDRED", i.toFixed(0)]
      ];
    
    console.log(gimme)

    changeDue.innerHTML = "Status: OPEN";

    if (i > 0) {
        changeDue.innerHTML += "<br>" + (gimme[8][0]) + ": " + "$" + (gimme[8][1]);
    }

    if (h > 0) {
        changeDue.innerHTML += "<br>" + (gimme[7][0]) + ": " + "$" + (gimme[7][1]);
    }
    
    if (g > 0) {
        changeDue.innerHTML += "<br>" + (gimme[6][0]) + ": " + "$" + (gimme[6][1]);
    }

    if (f > 0) {
        changeDue.innerHTML += "<br>" + (gimme[5][0]) + ": " + "$" + (gimme[5][1]);
    }

    if (e > 0) {
        changeDue.innerHTML += "<br>" + (gimme[4][0]) + ": " + "$" + (gimme[4][1]);
    }

    if (d > 0) {
        changeDue.innerHTML += "<br>" + (gimme[3][0]) + ": " + "$" + (gimme[3][1]);
    }

    if (c > 0) {
        changeDue.innerHTML += "<br>" + (gimme[2][0]) + ": " + "$" + (gimme[2][1]);
    }

    if (b > 0) {
        changeDue.innerHTML += "<br>" + (gimme[1][0]) + ": " + "$" + (gimme[1][1]);
    }

    if (a > 0){
        changeDue.innerHTML += "<br>" + (gimme[0][0]) + ": " + "$" + (gimme[0][1]);
    }



    register.innerHTML += "<br>" + ("Price: " + price);
    register.innerHTML += "<br>" + "<br>" + (cid[0][0] + ": $" + reg[0.01].toFixed(2));
    register.innerHTML += "<br>" + (cid[1][0] + ": $" + reg[0.05].toFixed(2));
    register.innerHTML += "<br>" + (cid[2][0] + ": $" + reg[0.1].toFixed(2));
    register.innerHTML += "<br>" + (cid[3][0] + ": $" + reg[0.25].toFixed(2));
    register.innerHTML += "<br>" + (cid[4][0] + ": $" + reg[1].toFixed(2));
    register.innerHTML += "<br>" + (cid[5][0] + ": $" + reg[5].toFixed(2));
    register.innerHTML += "<br>" + (cid[6][0] + ": $" + reg[10].toFixed(2));
    register.innerHTML += "<br>" + (cid[7][0] + ": $" + reg[20].toFixed(2));
    register.innerHTML += "<br>" + (cid[8][0] + ": $" + reg[100].toFixed(2));
    
}

I’m not sure I understand. Which test?

The free code camp tests

image

I’m looking at what’s printed in console during tests, at some point the printed gimme array starts to have negative values. For that first failing test amount of QUARTER seem to be 1.00 instead of 0.5.

This topic was automatically closed 182 days after the last reply. New replies are no longer allowed.