Advertisement
Btwonu

calculator-out-of-control

Oct 7th, 2020 (edited)
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function solve() {
  2.   const inputScreen = document.getElementById('expressionOutput');
  3.   const resultOutput = document.getElementById('resultOutput');
  4.   const clearBtn = document.querySelector('.clear');
  5.   const keysField = document.querySelector('.keys');
  6.   let screen = [];
  7.  
  8.   const mapper = {
  9.     '*': (params) => params.reduce((acc, cur) => acc * cur, 1),
  10.     '/': (params) => params.reduce((acc, cur) => acc / cur),
  11.     '+': (params) => params.reduce((acc, cur) => acc + cur, 0),
  12.     '-': (params) => params.reduce((acc, cur) => acc - cur),
  13.   };
  14.  
  15.   // add event listener to keys
  16.   // keysField.addEventListener('click', updateScreen);
  17.   Array.from(keysField.children).forEach((button) => {
  18.     button.addEventListener('click', addSymbol);
  19.   });
  20.  
  21.   clearBtn.addEventListener('click', clearScreen);
  22.  
  23.   // Declarations
  24.   function addSymbol(e) {
  25.     if (screen.includes('NaN')) {
  26.       clearScreen();
  27.     }
  28.  
  29.     // get value of the pressed key
  30.     let keyPressed = e.target.value;
  31.  
  32.     // if value is equals
  33.     if (keyPressed === '=') {
  34.       if (screen.length === 2) {
  35.         screen = ['NaN'];
  36.         updateScreen();
  37.         return;
  38.       }
  39.  
  40.       if (screen.length === 1) {
  41.         return;
  42.       }
  43.  
  44.       // extract operator and numbers
  45.       let [operator, ...nums] = removeOperators();
  46.  
  47.       // calculate
  48.       screen = mapper[operator](nums);
  49.  
  50.       updateScreen();
  51.       return;
  52.     }
  53.  
  54.     // concatenate number
  55.     let lastIndex = screen.length - 1;
  56.     let lastElement = screen[lastIndex];
  57.  
  58.     // if the last element is a number && keyPressed is a number
  59.     let isLongerNumber =
  60.       !isNaN(Number(lastElement)) && !isNaN(Number(keyPressed));
  61.  
  62.     if (isLongerNumber) {
  63.       keyPressed = lastElement + keyPressed;
  64.  
  65.       screen.splice(lastIndex, 1, keyPressed);
  66.     } else {
  67.       screen.push(keyPressed);
  68.     }
  69.  
  70.     updateScreen();
  71.   }
  72.  
  73.   function updateScreen() {
  74.     // render result
  75.     if (typeof screen === 'number') {
  76.       resultOutput.innerHTML = screen;
  77.       return;
  78.     }
  79.  
  80.     inputScreen.innerHTML = screen.join(' ');
  81.   }
  82.  
  83.   function clearScreen() {
  84.     screen = [];
  85.     resultOutput.innerHTML = '';
  86.     updateScreen();
  87.   }
  88.  
  89.   function removeOperators() {
  90.     const operatorPattern = /[\*\/\+\-]/g;
  91.     let operator = '';
  92.  
  93.     screen.forEach((ele) => {
  94.       let matches = ele.match(operatorPattern);
  95.  
  96.       if (matches !== null) {
  97.         // if operator differs
  98.         if (operator && operator !== matches[0]) {
  99.           alert("You can't use different operators in the same expression.");
  100.  
  101.           throw new Error(
  102.             "You can't use different operators in the same expression."
  103.           );
  104.         }
  105.  
  106.         operator = matches[0];
  107.       }
  108.     });
  109.  
  110.     let expressionArr = screen.join(' ').split(operatorPattern).map(Number);
  111.     expressionArr.unshift(operator);
  112.  
  113.     return expressionArr;
  114.   }
  115. }
  116.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement