JavaScript实现类Windows计算器CE键clearone函数方法
问题说明
开发仿Windows自带计算器时,其余功能均已实现,仅CE按键逻辑待补充。预期CE效果为清除最后输入的运算段:例如输入表达式78-89*90时,按下CE仅删除末尾的*90部分,保留前序内容78-89。
现有已编写完成的JavaScript代码如下:
var display = document.getElementById("screen"); var buttons = document.getElementsByClassName("button"); Array.prototype.forEach.call(buttons, function(button) { button.addEventListener("click", function() { if (button.textContent != "=" && button.textContent != "C" && button.textContent != "x" && button.textContent != "÷" && button.textContent != "√" && button.textContent != "x ²" && button.textContent != "%" && button.textContent != "⌫" && button.textContent != "1/x" && button.textContent != "CE" && button.textContent != "±") { display.value += button.textContent; } else if (button.textContent === "=") { equals(); } else if (button.textContent === "C") { clear(); } else if (button.textContent === "x") { multiply(); } else if (button.textContent === "÷") { divide(); } else if (button.textContent === "±") { plusMinus(); } else if (button.textContent === "⌫") { backspace(); } else if (button.textContent === "%") { percent(); } else if (button.textContent === "x ²") { square(); } else if (button.textContent === "√") { squareRoot(); } else if (button.textContent === "1/x") { divide1(); } else if (button.textContent === "CE") { clearone(); } }); }); function syntaxError() { if (eval(display.value) == SyntaxError || eval(display.value) == ReferenceError || eval(display.value) == TypeError) { display.value == "Syntax Error"; } } function equals() { if ((display.value).indexOf("^") > -1) { var base = (display.value).slice(0, (display.value).indexOf("^")); var exponent = (display.value).slice((display.value).indexOf("^") + 1); display.value = eval("Math.pow(" + base + "," + exponent + ")"); } else { display.value = eval(display.value) checkLength() syntaxError() } } function clear() { display.value = ""; } function backspace() { display.value = display.value.substring(0, display.value.length - 1); } function multiply() { display.value += "*"; } function divide() { display.value += "/"; } function plusMinus() { if (display.value.charAt(0) === "-") { display.value = display.value.slice(1); } else { display.value = "-" + display.value; } } function square() { display.value = eval(display.value * display.value); } function squareRoot() { display.value = Math.sqrt(display.value); } function percent() { display.value = display.value / 100; } function divide1() { display.value = 1 / display.value; }
需要实现名为clearone的函数,完成上述CE按键功能。
实现方案
核心逻辑:从表达式末尾向前查找最后一个运算符(跳过表达式开头的负号,避免误判),截取该运算符之前的内容即可;如果没有找到符合要求的运算符,说明当前只有一个运算数,直接清空显示内容即可。
将以下clearone函数添加到你的代码中即可:
function clearone() { const currentExpr = display.value.trim(); if (!currentExpr) return; const operators = ['+', '-', '*', '/']; let lastOpIndex = -1; // 从末尾向前遍历,跳过索引0位置,避免把开头的负号识别成分隔运算符 for (let i = currentExpr.length - 1; i >= 1; i--) { if (operators.includes(currentExpr[i])) { lastOpIndex = i; break; } } // 没有找到分隔运算符,直接清空 if (lastOpIndex === -1) { display.value = ""; return; } // 截取到最后一个运算符之前的内容 display.value = currentExpr.slice(0, lastOpIndex); }
效果验证
- 输入
78-89*90按CE:返回78-89,完全符合需求示例 - 输入
100/5+(末尾停在运算符未输入数字)按CE:返回100/5 - 输入
-1234(仅开头带负号的单个数字)按CE:直接清空显示 - 输入单个数字如
99按CE:直接清空显示,和C键逻辑一致
注:你原有代码中的
syntaxError函数存在逻辑问题:直接执行eval如果表达式非法会直接抛出异常中断运行,且函数内的display.value == "Syntax Error"是相等判断而非赋值,后续可以自行加try/catch修复,不影响本次CE功能的运行。
内容的提问来源于stack exchange,提问作者Thanasis Lanaras
相关产品推荐
相关产品推荐

