You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:30:53