Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Concatenating two nums to a display in a JS/HTML calc, only one num shows

So I’m a beginner to JS and HTML. I’m making a simple calculator that is stack based and has 4 operations [*, +, -, /] To use the calculator, you push the buttons like so: 7 push 8 push * and when the * is clicked, the final answer 56 is shown. So my calculator works fine for single digit numbers and operations but when I try to enter a number like 56 i start by hitting the button ‘5’ and then i hit ‘6’ but it doesn’t show up in the display field where the number/answer is supposed to be outputted. I’m assuming this is an issue with concatenating but I also have no idea what more I could try fixing so that the second number shows up in the display and I can operate with a two digit number. Can someone please provide some solutions on how I can fix this? Below is my JS and HTML code:

//declare stack:
let stack = [];
//initialize displayval to 0
let displayVal = '0';
let decimalFlag = false;
//flag for starting number

// //"The JavaScript input text property is used to set or return the value of a text input field":

const input = document.getElementById('result');

//function to display num in display element:
// function displayNum(val) {
//     if (input.value === "0") {
//         input.value = val;
//     } else {
//         input.value += val;
//     }

// }

function displayNum(val) {
  if (input.value === '') {
    input.value = val;
  } else {
    input.value += val;
  }
}

// //function to display num in display element:
// function displayNum(val) {
//     //let display = document.getElementById("result");
//     if (input.innerHTML === "0") {
//         input.innerHTML = val;
//     } else {
//         input.innerHTML += val;
//     }

// }

//Clears the display and sets to 0:
function clearScreen() {
  document.getElementById('result').value = '0';
  //clears stack:
  stack = [];
  displayVal = '0';
  //set start num to true  for all operations
}

// displays results after operations:
function display(val) {
  //setting display to 0 :
  if (val === 'Push') {
    stack.push(displayVal);
    //displayVal = "0";
    decimalFlag = false;
  }
  //else operations:
  else if (val === '+' || val === '-' || val === '*' || val === '/') {
    //popping nums off stack:
    let num2 = stack.pop();
    let num1 = stack.pop();

    //answer:
    let result;
    //converts strings to numbers to operate on them:

    //addition:
    if (val === '+') {
      result = Number(num1) + Number(num2);
      //console.log(result);
    }

    //subtraction:
    else if (val === '-') {
      result = Number(num1) - Number(num2);
    }

    //mult:
    else if (val === '*') {
      result = Number(num1) * Number(num2);
    }

    //division:
    else if (val === '/') {
      result = Number(num1) / Number(num2);
    } else {
      if (displayVal === '0') {
        displayVal = val;
      } else {
        displayVal += val;
      }
    }

    //push result to stack and display
    stack.push(result);
    //testing output:
    console.log(result);
    displayVal = result;
    decimalFlag = false;
  }

  //negates a number:
  else if (val === '+/-') {
    displayVal = displayVal[0] === '-' ? displayVal.slice(1) : '-' + displayVal;
  }

  //else, val is shown on the display
  else {
    displayVal = val;
  }

  document.getElementById('result').value = displayVal;
}
<!DOCTYPE html>
<html lang="en">

<head>
  <title>Calculator</title>
  <link rel="stylesheet" href="styles.css">
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>

<body>
  

  <!--create a table element to organize calc-->
  <table>
<!-- Create a row for the display -->
    <tr>
      <!--settining initial display value to 0-->
      <td colspan="4"><input class="display" type="number" id="result" disabled value = "0"/></td>
      <!--clear button will clear everything on display-->
      <!-- <td><input type="button" value="C" onclick="clr()" /> </td> -->
    </tr>
    <!-- Create the first row of buttons -->
    <tr>
      <td><input type="button" value="1" onclick="display('1')" class="btn" /></td>
      <td><input type="button" value="2" onclick="display('2')" class="btn" /></td>
      <td><input type="button" value="3" onclick="display('3')" class="btn" /></td>
      <td><input type="button" value="+" onclick="display('+')"/></td>
    </tr>
    <!-- Create the second row of buttons -->
    <tr>
      <td><input type="button" value="4" onclick="display('4')" class="btn"/></td>
      <td><input type="button" value="5" onclick="display('5')" class="btn"/></td>
      <td><input type="button" value="6" onclick="display('6')" class="btn"/></td>
      <td><input type="button" value="-" onclick="display('-')"/></td>
    </tr>
    <!-- Create the third row of buttons -->
    <tr>
      <td><input type="button" value="7" onclick="display('7')" class="btn" /></td>
      <td><input type="button" value="8" onclick="display('8')" class="btn" /></td>
      <td><input type="button" value="9" onclick="display('9')" class="btn" /></td>
      <td><input type="button" value="*" onclick="display('*')"/></td>
    </tr>
    <!-- Create the fourth row of buttons -->
    <tr>
      <td><input type="button" value="0" onclick="display('0')" class="btn" /></td>
      <!--Clears screen and sets display val to 0-->
      <td><input type="button" value="C" onclick="clearScreen('C')" id="C"/> </td>
      <td><input type="button" value="." onclick="display('.')"/></td> <!--have to implement still-->
      <td><input type="button" value="/" onclick="display('/')"/></td>
    </tr>
    <!-- Create the fifth row of buttons -->
    <tr>
      <td><input type="button" value="+/-" onclick="display('+/-')"/></td>
      <td colspan="2"></td>
      <td><input type="button" value="Push" onclick="display('Push')"/></td>
    </tr>
  </table> <!--end of table-->

<!-- script links to JS code-->
<script src="script.js"></script> 
</body>

</html>

I tried a bunch of modifications to the displayNum function because i’m pretty sure that’s where the issue is coming from. As u can see, I commented out my different approaches and there where plenty more but those are just 2

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

Inside the display function, you can update the following code:

  //else, val is shown on the display
  else {
    // displayVal = val; // <= BEFORE
    displayVal = input.value === "0" ? val : input.value + val; // <= AFTER
  }

There’s some more refactoring that you must do, in order for the arithmetic operations to work, but that’s the next step I guess. 🙂

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading