console
new Vue({
el: '#app',
data: {
equation: '0',
isDecimalAdded: false,
isOperatorAdded: false,
isStarted: false
},
methods: {
isOperator(character) {
return ['+', '-', '*', '/'].indexOf(character) >= 0
},
isNumber(character) {
return (character >= '0' && character <= '9')
},
append (character) {
if (this.isStarted) {
if (this.isNumber(character)) {
this.equation += character
} else if (character === '.') {
if (this.isDecimalAdded) {
reutrn;
} else {
this.equation += character
this.isDecimalAdded = true
}
} else if (this.isOperator(character)) {
this.isDecimalAdded = false
this.isStarted = false
if (this.isOperatorAdded) {
this.equation = substr(this.equation, 0, this.equation.length - 1) + character
} else {
this.equation += character
this.isOperatorAdded = true
}
}
} else {
if (character === 0) {
if (this.equation.substr(this.equation.length -1) === '0') {
if (this.isDecimalAdded) {
this.equation += '' + character
}
return
} else {
this.equation += '' + character
}
} else if (character === '.') {
if (this.isDecimalAdded) {
return
} else {
this.equation += character
this.isDecimalAdded = true
}
} else if (this.isNumber(character)) {
if (this.isDecimalAdded) {
this.equation += '' + character
} else {
if (this.equation.substr(this.equation.length - 1) === '0') {
this.equation = this.equation.substr(0, this.equation.length - 1) + character
} else {
this.equation += character
}
}
this.isStarted = true
this.isOperatorAdded = false
} else {
return
}
}
return
},
calculate() {
this.equation = eval(this.equation)
},
calculateToggle() {
this.equation = eval(this.equation) * -1
},
calculatePercentage() {
this.equation = eval(this.equation) / 100
},
clear() {
this.equation = '0'
this.isDecimalAdded = false
this.isOperatorAdded = false
this.isStarted = false
}
}
});
<div id="app">
<div class="calculator">
<div class="result" style="grid-area: result">
{{equation}}
</div>
<button style="grid-area: ac" @click="clear">AC</button>
<button style="grid-area: plus-minus" @click="calculateToggle">±</button>
<button style="grid-area: percent" @click="calculatePercentage">%</button>
<button style="grid-area: add" @click="append('+')">+</button>
<button style="grid-area: subtract" @click="append('-')">-</button>
<button style="grid-area: multiply" @click="append('*')">*</button>
<button style="grid-area: divide" @click="append('/')">/</button>
<button style="grid-area: equal" @click="calculate">=</button>
<button style="grid-area: number-1" @click="append(1)">1</button>
<button style="grid-area: number-2" @click="append(2)">2</button>
<button style="grid-area: number-3" @click="append(3)">3</button>
<button style="grid-area: number-4" @click="append(4)">4</button>
<button style="grid-area: number-5" @click="append(5)">5</button>
<button style="grid-area: number-6" @click="append(6)">6</button>
<button style="grid-area: number-7" @click="append(7)">7</button>
<button style="grid-area: number-8" @click="append(8)">8</button>
<button style="grid-area: number-9" @click="append(9)">9</button>
<button style="grid-area: number-0" @click="append(0)">0</button>
<button style="grid-area: dot" @click="append('.')">.</button>
</div>
</div>
body {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
background-color: #eee;
}
.calculator {
--button-width: 70px;
--button-height: 70px;
display: grid;
grid-template-areas:
"result result result result"
"ac plus-minus percent divide"
"number-7 number-8 number-9 multiply"
"number-4 number-5 number-6 subtract"
"number-1 number-2 number-3 add"
"number-0 number-0 dot equal";
grid-template-columns: repeat(4, var(--button-width));
grid-template-rows: repeat(6, var(--button-height));
box-shadow: -8px -8px 16px -10px rgba(255, 255, 255, 1)
, 8px 8px 16px -10px rgba(0, 0, 0, 1)
;
padding: 24px;
border-radius: 20px;
}
.calculator button {
margin: 8px;
padding: 0;
border: 0;
display: block;
outline: none;
border-radius: calc(var(--button-height) / 2);
font-size: 24px;
font-family: monospace;
font-weight: normal;
color: #888;
background: linear-gradient( 135deg
, rgba(230, 230, 230, 1) 0%
, rgba(246, 246, 246, 1) 100%
)
;
box-shadow: -4px -4px 10px -8px rgba(255, 255, 255, 1)
, 4px 4px 10px -8px rgba(0, 0, 0, .3)
;
}
.calculator button:active {
box-shadow: -4px -4px 10px -8px rgba(255, 255, 255, 1) inset
, 4px 4px 10px -8px rgba(0, 0, 0, .3) inset
;
}
.result {
text-align: right;
line-height: var(--button-height);
font-size: 48px;
font-family: 'Times New Roman', Times, serif;
padding: 0 20px;
color: #888;
}