作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
所以,我到处搜索,但找不到这个问题的答案。我已经尝试了大约三次,并通过基本上将输入作为字符串存储在数组中,解析数字,然后打开运算符来计算整数,从而得到了一个基本的,但我有一个真的很难弄清楚链接逻辑。有没有人有什么建议?甚至可能只是伪代码?我真的不想使用eval。非常感谢
最佳答案
对于只有 5 个运算符(^、*、/、+、-)且没有括号的简单计算器,您可以这样做。首先,将字符串转换为数字和运算符的数组很方便。然后,我们遍历数组,按优先顺序查找每个运算符,并将运算符应用于它前后的数字。
function tokenize(s) {
// --- Parse a calculation string into an array of numbers and operators
const r = [];
let token = '';
for (const character of s) {
if ('^*/+-'.includes(character)) {
if (token === '' && character === '-') {
token = '-';
} else {
r.push(parseFloat(token), character);
token = '';
}
} else {
token += character;
}
}
if (token !== '') {
r.push(parseFloat(token));
}
return r;
}
function calculate(tokens) {
// --- Perform a calculation expressed as an array of operators and numbers
const operatorPrecedence = [{'^': (a, b) => Math.pow(a, b)},
{'*': (a, b) => a * b, '/': (a, b) => a / b},
{'+': (a, b) => a + b, '-': (a, b) => a - b}];
let operator;
for (const operators of operatorPrecedence) {
const newTokens = [];
for (const token of tokens) {
if (token in operators) {
operator = operators[token];
} else if (operator) {
newTokens[newTokens.length - 1] =
operator(newTokens[newTokens.length - 1], token);
operator = null;
} else {
newTokens.push(token);
}
}
tokens = newTokens;
}
if (tokens.length > 1) {
console.log('Error: unable to resolve calculation');
return tokens;
} else {
return tokens[0];
}
}
const userInput = document.getElementById('userInput');
userInput.focus();
userInput.addEventListener('input', function() {
document.getElementById('result').innerHTML = "The answer is " + calculate(tokenize(userInput.value));
});
<input type="text" id="userInput" />
<div id="result"></div>
(替代版本 here )。要允许使用括号,您可以告诉 calculate
函数在它开始寻找任何其他运算符之前检查括号,然后在每组括号内的表达式上递归调用自身。解析功能也可以改进,例如删除任何空白并处理错误。
关于javascript - 如何在没有 eval 的情况下用 javascript 编写计算器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32292231/
我是一名优秀的程序员,十分优秀!