【发布时间】:2021-04-29 23:13:09
【问题描述】:
我正在为我的一个站点项目制作一个计算器,您可以在其中输入整个表达式,然后再解析,例如:2+3*4 将返回 14 , 22-4 将返回 18,20+5! 将返回 140,依此类推。 这适用于像我展示的那些简单的表达式,但是当我添加括号时,代码会中断。 所以像 (2+3)! 这样应该返回 120 的简单表达式实际上返回 10 或 2+3! >.
我最初的想法是让基本的 2+3! 工作是分离数学符号中的字符串和其余部分。所以它会在这种情况下将其分为 2、+ 和 3!;它会在哪里找到符号并仅解决该部分。这就是为什么它解决了 10 而不是不起作用。 但是在尝试解决之后,我无法使代码工作,除非在非常特殊的情况下,所以我决定重做代码并将其发布在这里以防有人可以帮助我。
这是我目前用来准备我的字符串以进行评估的函数:
function sepOperFat(){
//2+3! it's working
//1+(2-(2+2)+3)! want that to work in the end
var value = document.calculator.ans.value;
var operandoPos = ['0'];
var operandoInPos = [''];
var paraResolver = [];
for(i = 0; i <= value.length; i++){
//check if value[i] is equal to +, -, ×, ÷, * & /
if(value[i] == '+' || value[i] == '-' || value[i] == '×' || value[i] == '÷' || value[i] == '*' || value[i] == '/'){
operandoPos.push(i);
operandoInPos.push(value[i]);
}
}
paraResolver.push(value.slice(operandoPos[0], operandoPos[1]));
for(var total = 1; total <= operandoPos.length; total++){
paraResolver.push(value.slice(operandoPos[total] + 1, operandoPos[total + 1]));
}
document.calculator.ans.value = '';
for(var total = 0; total <= paraResolver.length - 2; total++){
if(paraResolver[total].includes('!')){
document.calculator.ans.value += "factorial(" + paraResolver[total] + ")";
}else{
document.calculator.ans.value += paraResolver[total];
}
document.calculator.ans.value += operandoInPos[total + 1];
}
}
document.calculator.ans.value 是我有表达式的字符串的名称。operandoPos 是字符串上符号所在的位置。operandoInPos 是 > 符号(我也许也可以使用 value.charAt(operandoPos))。paraResolver 是我将要解决的数字(例如 3 )。factorial( 是我的函数的名称,负责使数字阶乘。
该函数没有返回值,因为我仍然想在 document.calculator.ans.value 内部解决。
解决我正在使用的方程式document.calculator.ans.value = Function('"use strict"; return '+ document.calculator.ans.value)();,当我按下按钮时会激活。
是的,就是这样。我只想要一个能够知道 (2+3)! 和 2+(3)! 之间区别的函数,这样它就可以返回 factorial(2+3 ) 而不是 (2+factorial(3))。
感谢您的帮助。
【问题讨论】:
标签: javascript string calculator