【问题标题】:Is there an alternative way i can make this calculator work without the eval function?有没有另一种方法可以让这个计算器在没有 eval 功能的情况下工作?
【发布时间】:2017-05-23 11:06:04
【问题描述】:

我似乎想不出我怎么能不让它过于复杂。我知道我需要创建一个数组并循环遍历它并找到运算符 (x & /),并且实现 BEDMAS 也很好。

<div class="display"><input type="text" size="36" id="display" readonly></div>
<div class="keys">

    <p>
        <input type="button" class="button" value="CE" onclick='backspace()'>
        <input type="button" class="button" value="x^2" onclick='power()'>
        <input type="button" class="button" value="%"  onclick='percentage("%")'>
        <input type="button" class="button" value="/" onclick='math("/")'>
    </p>

    <p>
        <input type="button" class="button" value="7" onclick='math("7")'>
        <input type="button" class="button" value="8" onclick='math("8")'>
        <input type="button" class="button" value="9" onclick='math("9")'>
        <input type="button" class="button" value="x" onclick='math("*")'>
    </p>

    <p>
        <input type="button" class="button" value="4" onclick='math("4")'>
        <input type="button" class="button" value="5" onclick='math("5")'>
        <input type="button" class="button" value="6" onclick='math("6")'>
        <input type="button" class="button" value="-" onclick='math("-")'>
    </p>
    <p>
        <input type="button" class="button" value="1" onclick='math("1")'>
        <input type="button" class="button" value="2" onclick='math("2")'>
        <input type="button" class="button" value="3" onclick='math("3")'>
        <input type="button" class="button" value="+" onclick='math("+")'>
    </p>

    <p>
        <input type="button" class="button" value="0" onclick='math("0")'>
        <input type="button" class="button" value="." onclick='math(".")'>
        <input type="button" class="button" value="C" onclick='c("")'>
        <input type="button" class="button" value="=" onclick='e()'>
    </p>



function c(val){
document.getElementById("display").value = val;
}
function math(val){
document.getElementById("display").value += val;
}
function e(){
try{
    c(eval(document.getElementById("display").value))
}
catch(e){
c('Error')
}
}
function backspace() {
var value = document.getElementById("display").value    
document.getElementById("display").value = value.substring(0, value.length 
-1);
}
function power() {
var value = document.getElementById("display").value;
var value = document.getElementById("display").value = (value * value);
}
function percentage() {
var value = document.getElementById("display").value;
var value = document.getElementById("display").value = (value / 100);
}

【问题讨论】:

  • eval 不是邪恶的,只是通常这样称呼。您没有括号输入,因此如果您需要 BEDMAS 支持,则需要添加它们。然后使用eval在通过键盘点击构建的输入上,确保无法将任意字符串粘贴到display.value 中进行评估。

标签: javascript html css


【解决方案1】:

是的!不要重新发明这个。使用类似 math.js 的东西,它内置了一个表达式解析器。

math.eval(/* put your concatenated expression here */)

【讨论】:

  • 等等,你是在用“是的!使用 eval 函数”来回答“如何在没有 eval 函数的情况下做到这一点”的问题?如果是这样,恐怕我可能不得不对这个答案投反对票。
  • @MrLister 那么恐怕你完全不知道你在说什么。
  • @MrLister 如果您费心阅读答案,您会发现我们正在使用 Math.js 中内置的表达式解析器,专门为此目的而构建。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多