首页 > 解决方案 > 博德玛斯计算器

问题描述

我正在尝试创建一个遵循 bodmas 规则并首先尝试乘法的计算器。当点击等号按钮时,诸如“4*5+6*7”之类的字符串将存储在 displayValue 中。作为第一次尝试,我使用 reg ex 在字符串中搜索乘号及其位置。当它找到 lhs 和 rhs 的值并存储它时,它会校准。然后它使用 firstValue 和 secValue 将值相乘,并将 cal 替换为 displayValue 中的结果。这适用于 4*5,但我必须再次按等于才能执行 6*7。我尝试使用 while 循环,但无法让它工作。如何让它一次完成字符串中的所有乘法部分?

  equals() {
      const displayValue = this.state.displayValue.slice(0);
      let counter = displayValue.match(/[\d\.]+(?=\*)\*[\d\.]+/g).length;
      console.log("counter: " +counter);
      while (counter > 0) {
          let cal = displayValue.match(/[\d\.]+(?=\*)\*[\d\.]+/).toString().split("*").join(",");
           console.log("cal: " +cal)
           let operPos = cal.search(/\*/);
           let firstValue = parseFloat(cal.slice(0, operPos));
           let secValue = parseFloat(cal.slice(operPos + 1));
           let finalCal = firstValue * secValue;
           let result = displayValue.replace(/[\d\.]+(?=\*)\*[\d\.]+/, finalCal);
           this.setState({displayValue: result});
           counter = counter -1;
           console.log("counterII: " +counter)
       }
     console.log("new display: " +this.state.displayValue)
}

标签: javascriptreactjsalgorithmcalculator

解决方案


displayValue 在每个循环中都没有更新,因为我将它分配为 const 变量。这是正确的代码:

equals() {
    let displayValue = this.state.displayValue.slice(0);
    let counter = displayValue.match(/[\d\.]+(?=\*)\*[\d\.]+/g).length;
    console.log("counter: " +counter);
    while (counter > 0) {
        let cal = displayValue.match(/[\d\.]+(?=\*)\*[\d\.]+/).toString().split("*").join(",");
        console.log("cal: " +cal)
        let operPos = cal.search(/\*/);
        let firstValue = parseFloat(cal.slice(0, operPos));
        let secValue = parseFloat(cal.slice(operPos + 1));
        let finalCal = firstValue * secValue;
        displayValue = displayValue.replace(/[\d\.]+(?=\*)\*[\d\.]+/, finalCal);
        this.setState({displayValue: displayValue})
        console.log("result: " +displayValue)
        counter = counter -1;
        console.log("counterII: " +counter)
    }
}

如果有人有更好的方法来实现同样的目标,请告诉我。


推荐阅读