# [help] FCC beta Challenge Cash register

[help] FCC beta Challenge Cash register
0

#1

Hello, i need help with this exercice:
https://beta.freecodecamp.org/en/challenges/javascript-algorithms-and-data-structures-projects/cash-register

I have a specific question:
I calcul the range like this:
let change = (cash - price).toFixed(2);

I want to play with my numbers after ‘,’ numbers. Here, if i do this:
let aDecimal = parseInt( change.toString().split(".")[1] ); //50
I have 50. Now,i do this:
So i have this 0.5
But if i have 0.5.toString()[2] != 0 && 0.5.toString()[3] == undefined, i want this to have an extra “0” but i want at the end a number type like this 0.50 (number type, not a string).

If some one could help me on this. I’m having seisur.
I tried to do the exercice with full number as decimal like this “50” for 50 cents. But it should be easier to calcul some thing else the other way.

#2

Could you please share your code? If you use repl.it, you can paste the link here and it will run right here in the forum.

#4

Hi, ok i’m doing to past a part of my code.

edit:

If you can teach me a way to basicaly have this:
50 => 0.5 => 0.50
5 => 0.05

#5

Hello everybody, everybody hello

#6

0.50 and 0.5 are equal in value. If I have the following code:

``````var cents = 0.50;
console.log(cents); // displays 0.5
``````

The only way to display 0.50 that I am aware of is to use something like toFixed as:

``````var cents = 0.50;
var converted = cents.toFixed(2)
console.log(converted); // displays 0.50
``````

Of course in the above, converted is a string and not a number.

If you are just wanting it to display the extra 0 at the end, why do you care if it is a string or a number?

#7

Hi,
because i’m doing operation one it later on.
Now, i’m doing calcul with the cent like this:
i have 0.50 but i use 50.
Then for 0.25, i use 25, for 0.10 i use 10…

#8

Why not just multiply/divide it by 100 then?

#9

If i 50/100 i have 0.5 float. But it is not a problem to do calcul if it doesn’t show 0.50 ?

#10

If I remember correctly, this challenge expects numbers rather than strings. `0.5` is a number. If I am wrong and you need a string with `"0.50"` then you can still use the number `0.5` throughout your code and then do a `parseInt()` at the end to convert it to `"0.50"`.

#11

Hi back.
Ok, i finished the exercice:

It’s maybe not the right way, it’s maybe too long and could be optimized but at least i used what i thought and make it happen:)

How:
-Retrieve Integer/fractional change and Cash register integer/factional values
-Check for fractional and integer value with the cash registers values if you have enough funds
-if yes, work on the integer and fractional. If no, leave it no fund
-If at the end, your array is empty => closed / not empty => you still have money in the cash machin

``````/*
*/

function checkCashRegister(price, cash, cid) {
//find the change (use toFixed)
let change = (cash - price).toFixed(2); //0.50 centimes
//find the number before ',' (Integer part) (convert it to String to find it, then Integer)
let bDecimal = parseInt( change.toString().split(".")[0] );
//find the number after ',' (Fractional part) (convert it to String to find it, then Integer)
let aDecimal = parseInt( change.toString().split(".")[1] ) / 100;
//How many my cash register have in the range of values 100, 20, 10, 5 and 1
let unitArray = [ cid[8][1], cid[7][1], cid[6][1], cid[5][1], cid[4][1] ];
//How many my cash register have in the range of 0.25, 0.10, 0.02 and 0.01
let unitArray2 = [ cid[3][1], cid[2][1], cid[1][1], cid[0][1] ];
//The change of how many of each i have to give (only concern 100, 20, 10, 5, and 1)
let unitArrayChange = [ ["ONE HUNDRED", 0], ["TWENTY", 0], ["TEN", 0], ["FIVE", 0], ["ONE", 0] ];
//The change of how many of each i have to give (only concern 0.25, 0.10, 0.05 and 0.01)
let unitArrayChange2 = [ ["QUARTER", 0], ["DIME", 0], ["NICKEL", 0], ["PENNY", 0] ];

//Copies to do maths
let unitArrayChangeNew1 = [ ["ONE HUNDRED", 0], ["TWENTY", 0], ["TEN", 0], ["FIVE", 0], ["ONE", 0] ];
let unitArrayChangeNew2 = [ ["QUARTER", 0], ["DIME", 0], ["NICKEL", 0], ["PENNY", 0] ];

let changeFactor = 0;
let unitIndex = 0;

let calc1 = 0;
let calc2 = 0;

//In the cash register, i check how many "Integer money" i have
for( let k = 0; k < unitArray.length; k++ ) {
calc1 += unitArray[k];

//In the cash register, i check how many "Fractional money" i have
for( let k = 0; k < unitArray2.length; k++ ) {
calc2 += unitArray2[k];
}
}

//To start with, if i don't have enough Integer money OR Fractional Money
if( ( bDecimal > calc1 )  || ( aDecimal > calc2 ) ) {
return {status: "INSUFFICIENT_FUNDS", change: []};
}

/*
WORK ON INTEGER VALUES
While my change is not ZERO and my cash register machin is not EMPTY
I continue to check for every values possibles
I update my cash register and my change
*/
while( bDecimal > 0 ) {
if( ( bDecimal >= 100 ) && ( unitArray[0] >= 100 ) ){
changeFactor = 100;
unitIndex = 0;
} else if( ( bDecimal >= 20 ) && ( unitArray[1] >= 20 ) ) {
changeFactor = 20;
unitIndex = 1;
} else if( ( bDecimal >= 10 )  && ( unitArray[2] >= 10 ) ){
changeFactor = 10;
unitIndex = 2;
} else if( ( bDecimal >= 5 ) && ( unitArray[3] >= 5 ) ){
changeFactor = 5;
unitIndex = 3;
} else if( ( bDecimal >= 1 ) && ( unitArray[4] >= 1 ) ){
changeFactor = 1;
unitIndex = 4;
} else {
// break;
}

// update my bDecimal (Integer change)
bDecimal = bDecimal - changeFactor;
// update my cash register machine
unitArray[unitIndex] = unitArray[unitIndex] - changeFactor;
// update how MANY of this money i used
unitArrayChange[unitIndex][1] = unitArrayChange[unitIndex][1] + 1;
//use the precedent value to calcul how MUCH of this money i used
unitArrayChangeNew1[unitIndex][1] = unitArrayChange[unitIndex][1] * changeFactor;
}

//reset
changeFactor = 0;
unitIndex = 0;

/*
WORK ON FRACTIONAL VALUES
While my change is not ZERO and my cash register machin is not EMPTY
I continue to check for every values possibles
I update my cash register and my change
*/
while( aDecimal > 0 ) {
if( ( aDecimal >= 0.25 ) && ( unitArray2[0] >= 0.25 ) ){
changeFactor = 0.25;
unitIndex = 0;
} else if( ( aDecimal >= 0.10 ) && ( unitArray2[1] >= 0.10 )  ) {
changeFactor = 0.10;
unitIndex = 1;
} else if( ( aDecimal >= 0.05 ) && ( unitArray2[2] >= 0.05 )  ){
changeFactor = 0.05;
unitIndex = 2;
} else if( ( aDecimal >= 0.01 ) && ( unitArray2[3] >= 0.01 )  ){
changeFactor = 0.01;
unitIndex = 3;
} else {
//break;
}

//update my bDecimal (Fractional change)

//update my cash register machine (use parseFloat and toFixed to manage float Calcul)
let valueFixed = parseFloat( unitArray2[unitIndex] - changeFactor ).toFixed( 2 );
unitArray2[unitIndex] = parseFloat( valueFixed );

// update how MANY of this money i used
unitArrayChange2[unitIndex][1] = unitArrayChange2[unitIndex][1] + 1;

//Find how MUCH of this money i used (use parseFloat and toFixed to manage float Calcul)
let valueFixed2 = (unitArrayChange2[ unitIndex][1] * changeFactor ).toFixed( 2 );
unitArrayChangeNew2[unitIndex][1] = parseFloat( valueFixed2 );

}

//concat my Integer and Fractional value from my cash register
var unitArray3 = unitArray.concat( unitArray2 );

//delet empty value to check if cash register machin is empty or not later on
unitArray3 = unitArray3.filter( function( x ){
return ( x !== 0 );
} );

//Concat my two array into one
var unitArrayChangeNew3 = unitArrayChangeNew1.concat( unitArrayChangeNew2 );

//Then EMPTY "0" values
for( let k = 0; k < unitArrayChangeNew3.length; k++ ) {
if( unitArrayChangeNew3[k][1] == 0 ) {
unitArrayChangeNew3[k].splice( 0, 1 );
delete unitArrayChangeNew3[k];
}
}
//Then REMOVE "empty" values
unitArrayChangeNew3 = unitArrayChangeNew3.filter( function( x ){
return ( x !== ( undefined || null || '' ) );
} );

//Handle if my register machin is empty or not
if( unitArray3.length == 0 ) {
return {status: "CLOSED", change: cid};
}else {
return {status: "OPEN", change: unitArrayChangeNew3};
}
};

console.log( checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]));
console.log( checkCashRegister(3.26, 100, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]) );
console.log( checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) );
console.log( checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 1], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) );
console.log( checkCashRegister(19.5, 20, [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) );
``````

ps: thanks to “@Sweet Coding :)” for the tips