freeCodeCamp计算器开发:如何将等式字符串转换为数值并计算结果
计算器等式计算功能实现方案
方案1:手动拆分解析(符合你最初的实现思路)
你不需要把每个字符单独存入数组再判断,直接遍历等式字符串拼接数字即可,天然支持多位数场景:
- 遍历字符串时设置标识符区分当前拼接的是第一个运算数、运算符、还是第二个运算数
- 遇到数字字符就拼接到对应运算数的字符串中,遇到非数字字符就标记为运算符
- 两个运算数拼接完成后统一转数值类型再做计算
核心实现代码(直接替换你的result函数即可)
function result(){ const exp = document.querySelector('input').value; let num1Str = '', num2Str = '', operator = ''; let findOperator = false; // 遍历等式字符串 for (const char of exp) { // 判断是否为数字字符 if (!isNaN(Number(char))) { if (!findOperator) { num1Str += char; } else { num2Str += char; } } else { // 非数字就是运算符 operator = char; findOperator = true; } } // 转成整数 const num1 = parseInt(num1Str); const num2 = parseInt(num2Str); // 计算结果 let resultVal; switch(operator) { case '+': resultVal = num1 + num2; break; case '-': resultVal = num1 - num2; break; case '*': resultVal = num1 * num2; break; case '/': resultVal = num1 / num2; break; default: resultVal = 0; } // 结果写回输入框,同步全局状态方便后续连续计算 document.querySelector('input').value = resultVal; x = resultVal; trigger = 1; }
现有代码优化提示
你当前的number函数存在多位数输入的问题:每次按数字都会直接覆盖x的值,连续按两次1只会把x赋值为1而非11,可以修改为如下逻辑:
function number(variable){ if(trigger==0){ x = variable; document.getElementById("display").value = "" + x; trigger = 1; }else if(trigger==1){ // 多位数拼接:原数左移一位(乘10)加新输入的数字 x = x * 10 + variable; document.getElementById("display").value += "" + variable; } }
方案2:简化实现(仅适用于合法输入场景)
如果你的输入框只会生成合法的四则运算表达式,可以直接用eval函数执行表达式,代码量极少:
function result(){ const val = document.querySelector('input').value; const calcResult = eval(val); document.querySelector('input').value = calcResult; x = calcResult; trigger = 1; }
注:如果需要兼容负数、小数、多运算符的场景,可以扩展方案1的逻辑,或者直接使用正则匹配拆分所有运算数和运算符即可。
内容的提问来源于stack exchange,提问作者user16726047
相关产品推荐
相关产品推荐

