我正在尝试创建一个遵循 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)
}
最佳答案
displayValue 没有在每个循环中更新,因为我将它分配为常量变量。这是正确的代码:
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)
}
}
如果有人有更好的方法来实现同样的事情,请告诉我。
关于javascript - BODMAS 计算器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53467743/