我正在研究'公式计算器',但有一些问题。我现在可以插入我的等式,但我希望它是数字,但不仅仅是数字:我想要所有'+',' - ','*'和'/'来做对了。
所以这是我的代码,直到现在:
var ligning = prompt("Insert your equation here:");
var newLigning = ligning.split("=");
var sideOne = parseInt(newLigning[0],10);
var sideTwo = parseInt(newLigning[1],10);
var calculator = function() {
};
alert(sideOne);
alert(sideTwo);
这里有一个非常具体的例子:
'1 + 2 = 3'应该警告3然后再警告3(因为底部有两个警报) - 我该怎么做?
答案 0 :(得分:1)
而不是:
var sideOne = parseInt(newLigning[0],10);
你可能想要这样的东西:
var sideOne = performMath(newLining[0],10);
其中:
function performMath(equation) {
//CODE HERE
}
performMath
可以通过几种方式完成。你需要拆分方程并获得数字和2之间的方程式。这可以递归完成!
我认为这可能是一个很好的起点。
如果你开始将操作优先级(PEDMAS)考虑在内,这个问题稍微困难一点。方法是相同的,performMath
需要稍微复杂一些。在这种情况下,我会建议数字的某种数组结构和方程式的另一种数组结构。
Paul S
在开始之前,还要清理字符串。你不能假设有人会输入一个等式。编程Rich Cook说:
“今天的编程是软件工程师努力争取的竞赛 建立更大,更好的白痴项目,宇宙尝试 产生更大更好的白痴。到目前为止,宇宙正在赢得胜利。“
这段代码应该有点帮助......无论如何,这可能不是最有效的代码......
var equation = "1+22-3";
var operators = "+-*\/"
var currentNumber = "";
var numbers = new Array();
var operatorArray = new Array();
for(var i=0; i<equation.length; i++) {
var currentChar = equation.charAt(i);
if(operators.indexOf(currentChar) != -1) {
operatorArray[operatorArray.length] = (currentChar);
numbers[numbers.length] = (currentNumber);
currentNumber = "";
} else {
currentNumber = currentNumber + currentChar;
alert(currentNumber);
}
}
numbers[numbers.length] = currentNumber;
alert("numbers : " + numbers);
alert("operators : " + operatorArray);
现在你所要做的就是完成数组并执行正确的操作。
答案 1 :(得分:1)
eval
真的很糟糕且很容易被滥用,但是如果你知道你只接受数字和特定的操作员那么你也可以做一些字符串消毒并使它更安全
var ligning = prompt("Insert your equation here:"),
newLigning = ligning.split("="),
lhs = newLigning[0],
rhs = newLigning[1];
function calculate(expr) {
var s;
expr = expr.replace(/[^\d*/()+-]/g, ''); // remove everything except permitted
if (expr !== (s = expr.replace(/^[*/]*|[*/+-]*$/g, ''))) {
expr = s; // don't allow * or / at the ends
console.warn('Removing invalid operators');
};
return +eval(expr || 0); // + implicit converts to number
};
console.log(lhs = calculate(lhs), rhs = calculate(rhs), lhs === rhs);
答案 2 :(得分:0)
alert ( eval(newLigning[0]) );
alert ( eval(newLigning[1]) );