All of the code is self-explanatory and pretty much complete.
What the code does:
- Calculates using onscreen numerics and operators
- Validates any erroneous operations, such as 4 ** 8 or *9
Good features of the code:
- The code has separate functions handling the validation, evaluation, etc.
- It's much more modular
Recommended further improvements on the following basis:
- Understandability
- Modularity
- Efficiency
- Repetition
(function() {
// private variable accessible by all the functions below
var keys, input = "",
result;
function equate() {
console.log('the equal button was pressed')
result = eval(input);
$('.screen').text(result);
}
function clear() {
input = "";
$('.screen').text(input);
result = "";
console.log('the clear button was pressed')
}
function isOperator(_input) {
return (['+', '-', '*', '%', '/', '.'].indexOf(_input) >= 0)
}
function lastInputIsOperator() {
return isOperator(input.charAt(input.length - 1))
};
// created a new module validate input and moved it out of expressInMath
function validateInput(_input) {
// prevents any operations like ++, -- etc
if (isOperator(_input)) {
// check the last character input
if (lastInputIsOperator(input)) {
if (input.length < 1) {
input = '';
} else if (_input === '.' && input.indexOf('.') >= 0) {
console.log('invalid');
} else {
input = input.slice(0, input.length - 1) + _input;
}
// avoids any operation of the kind 0.6.7.5
} else if (_input === '.' && input.indexOf('.') >= 0) {
console.log('invalid');
} else {
if (input.length < 1) {
input = '';
} else {
input += _input;
}
}
console.log('Operation prohibited')
} else {
input += _input;
}
}
function expressInMath(_input) {
validateInput(_input);
result = '';
$('.screen').text(input);
}
// analyzes the keys pressed by the user
function analyze() {
//private vars
let $this = $(this),
_input = $this.text();
// if clear button is pressed
if (_input == "C") {
clear();
}
// if equals to button is pressed
else if (_input == "=") {
equate();
}
// if key or operator button is pressed
else {
expressInMath(_input);
}
}
// self invoking initializing function
(function initialize() {
$('#calculator span').on('click', analyze);
}());
}())
/* Basic reset */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font: bold 14px Arial, sans-serif;
}
html {
height: 100%;
background: radial-gradient()circle, #fff, #ccc;
background-size: cover;
}
#calculator {
width: 375px;
height: 340px;
margin: 100px auto;
padding: 20px 20px 9px;
background: yellowgreen;
border-radius: 3px;
box-shadow: 0px 4px #009de4, 10px 15px 0px rgba(0, 0, 0, 0.2);
}
/* top portion */
.top span.clear {
float: left;
}
.top .screen {
height: 40px;
width: 212px;
float: right;
background: rgba(0, 0, 0, 0.2);
box-shadow: inset 0px 4px #009de4;
padding: 0px 10px;
/* typography */
font-size: 17px;
line-height: 40px;
color: white;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2);
text-align: right
}
/* Clear floats */
/*.keys, .top {overflow: hidden};*/
.keys span,
.top span.clear {
float: left;
position: relative;
top: 0;
cursor: pointer;
width: 66px;
height: 40px;
background: white;
border-radius: 2px;
box-shadow: 0px 4px rgba(0, 0, 0, 0.2);
margin: 0 7px 11px 0;
line-height: 40px;
text-align: center;
user-select: none;
}
.keys span.operator {
background: #FFF0F5;
margin-right: 0px;
}
.keys span.eval {
background: #f1ff92;
box-shadow: 0px 4px #9da853;
color: #888e5f;
}
.top span.clear {
background: #ff9fa8;
box-shadow: 0px 4px #ff7c87;
color: white;
}
/* hover effect */
.keys span:hover {
background: #9c89f6;
box-shadow: 0px 4px #6b54d3;
color: white;
}
.keys span.eval:hover {
background: #f1ff92;
box-shadow: 0px 4px #9da853;
color: #888e5f;
}
.top span.clear:hover {
background: #ff9fa8;
box-shadow: 0px 4px #ff7c87;
color: white;
}
/* active state */
.keys span:active {
box-shadow: 0px 4px #6b54d3;
top: 4px;
}
.keys span.eval:active {
box-shadow: 0px 4px #9da853;
top: 4px;
}
.top span.clear:active {
top: 4px;
box-shadow: 0px 0px #d3545d;
}
<html>
<head>
<link rel="stylesheet" href="/style.css">
</head>
<body>
<div id="calculator">
<div class="top">
<span class="clear">C</span>
<div class="screen">0</div>
</div>
<div class="keys">
<span>7</span>
<span>8</span>
<span>9</span>
<span>+</span>
<span>4</span>
<span>5</span>
<span>6</span>
<span>-</span>
<span>1</span>
<span>2</span>
<span>3</span>
<span>/</span>
<span class="num">0</span>
<span class="decimal">.</span>
<span class="eval">=</span>
<span>*</span>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
<script src="new.js"></script>
<!-- <script src="script.js"></script> -->
</body>
</html>