# Q Calculadora
# Recursos
# Código
<template>
<q-page padding>
<div class="row justify-center">
<div class="col-md-8">
<q-card>
<q-card-section class="bg-primary text-white">
<div class="text-h6">Calc</div>
</q-card-section>
<q-card-section class="">
<div class="text-h5 text-grey-5 text-right">
{{ acumulador + actual }}
</div>
<div class="text-h3 text-right">{{ resultado }}</div>
</q-card-section>
<q-card-section class="bg-grey-4">
<div class="row q-col-gutter-sm">
<div v-for="(btn, index) in botones" :key="index" class="col-3">
<q-btn
class="full-width text-h6"
:text-color="!isNumber(btn) ? 'white' : 'grey-8'"
:color="!isNumber(btn) ? 'indigo' : 'grey-2'"
@click="btnAccion(btn)"
>
{{ btn }}
</q-btn>
</div>
<div class="col-6">
<q-btn
class="full-width text-h6"
color="indigo"
@click="btnReiniciar"
>
reset
</q-btn>
</div>
<div class="col-6">
<q-btn
class="full-width text-h6"
color="orange"
@click="btnResultado"
>
=
</q-btn>
</div>
</div>
</q-card-section>
</q-card>
</div>
<pre>{{ arrayCalculos }}</pre>
</div>
</q-page>
</template>
<script>
// https://codepen.io/behnam-sn/pen/zYOPjzZ?editors=1010
// https://www.npmjs.com/package/mathjs
import { evaluate, round } from "mathjs";
const botones = [7, 8, 9, "%", 4, 5, 6, "+", 1, 2, 3, "-", ".", 0, "/", "*"];
import { ref } from "vue";
export default {
setup() {
const arrayCalculos = ref([]);
const operadorClick = ref(true);
const actual = ref("");
const resultado = ref("");
const acumulador = ref("");
const isNumber = (btn) => !isNaN(btn);
const btnAccion = (valor) => {
if (!isNaN(valor)) {
if (operadorClick.value) {
actual.value = "";
operadorClick.value = false;
}
actual.value = `${actual.value}${valor}`;
} else {
ejecutarOperacion(valor);
}
};
const ejecutarOperacion = (valor) => {
if (valor === "%") {
if (actual.value !== "") {
actual.value = `${parseFloat(actual.value) / 100}`;
}
return;
}
if (valor === ".") {
console.log(actual.value);
if (actual.value.indexOf(".") === -1) {
if (operadorClick.value) {
actual.value = "";
operadorClick.value = false;
}
actual.value = `${actual.value}${valor}`;
}
return;
}
agregarOperador(valor);
};
const agregarOperador = (operador) => {
// console.log(operador);
if (!operadorClick.value) {
acumulador.value += `${actual.value} ${operador} `;
actual.value = "";
operadorClick.value = true;
}
};
const btnReiniciar = () => {
actual.value = "";
resultado.value = "";
acumulador.value = "";
operadorClick.value = false;
};
// https://dev.to/spukas/everything-wrong-with-javascript-eval-35on
const parse = (str) => {
return Function(`'use strict'; return (${str})`)();
};
const btnResultado = () => {
if (!operadorClick.value) {
resultado.value = evaluate(acumulador.value + actual.value);
resultado.value = round(resultado.value, 3);
arrayCalculos.value.push(
`${acumulador.value} ${actual.value} = ${resultado.value}`
);
} else {
resultado.value = "Error!";
}
};
return {
botones,
btnAccion,
btnReiniciar,
btnResultado,
arrayCalculos,
resultado,
actual,
isNumber,
acumulador,
};
},
};
</script>
<style scoped>
.text-h3 {
height: 50px;
}
.text-h5 {
height: 32px;
}
</style>