javascript - 制作一个计算字符串中数字的函数
问题描述
我是使用 javascript 的新手,我正在尝试创建一个函数来计算字符串中的数字。
但是我在让它计算字符串中的一些数字时遇到了问题。
也许希望有人可以帮助我或告诉我哪里出错了,我真的很感激。
const toCalculate = (string) => {
let calculate = "=" + string.toLowerCase();
if (
isFinite(
calculate.replace(
/\=|\+|\-|\*|\/|\÷|\%|\(|\)|\,|\ |math.|pow|sqrt|round|floor|ceiling|ceil|pi|π|euler|absolute|abs|exp|logarithm|log|random|rand|rng/g,
""
)
)
) {
calculate = calculate
.replace(/ /g, "")
.replace(/÷/g, "/")
.replace(/power|pow/g, "Math.pow")
.replace(/sqrt|squareroot/g, "Math.sqrt")
.replace(/round/g, "Math.round")
.replace(/floor/g, "Math.floor")
.replace(/ceiling|ceil/g, "Math.ceil")
.replace(/pi|π/g, "Math.PI")
.replace(/euler/g, "Math.E")
.replace(/absolute|abs/g, "Math.abs")
.replace(/exp/g, "Math.exp")
.replace(/logarithm|log/g, "Math.log")
.replace(/random|rand|rng/g, "Math.random()");
if (calculate.replace(/[^%]/g, "").length > 0) {
for (let i = 0; i < calculate.replace(/[^%]/g, "").length; i++) {
while (
(calculate[getSubstringIndex(calculate, "%", i + 1) + 1] == "+" ||
calculate[getSubstringIndex(calculate, "%", i + 1) + 1] == "-" ||
calculate[getSubstringIndex(calculate, "%", i + 1) + 1] == "*" ||
calculate[getSubstringIndex(calculate, "%", i + 1) + 1] == "/" ||
calculate[getSubstringIndex(calculate, "%", i + 1) + 1] == "(" ||
calculate[getSubstringIndex(calculate, "%", i + 1) + 1] == ")" ||
calculate[getSubstringIndex(calculate, "%", i + 1) + 1] == "," ||
calculate[getSubstringIndex(calculate, "%", i + 1) + 1] == "^" ||
calculate[getSubstringIndex(calculate, "%", i + 1) + 1] == "x" ||
getSubstringIndex(calculate, "%", i + 1) + 1 == calculate.length) &&
calculate.replace(/[^%]/g, "").length > 0
) {
for (let j = getSubstringIndex(calculate, "%", i + 1); j > -1; j--) {
if (
calculate[j] == "=" ||
calculate[j] == "+" ||
calculate[j] == "-" ||
calculate[j] == "*" ||
calculate[j] == "/" ||
calculate[j] == "(" ||
calculate[j] == ")" ||
calculate[j] == "," ||
calculate[j] == "^" ||
calculate[j] == "x"
) {
calculate =
calculate.substring(0, j + 1) +
calculate.substring(j + 1, getSubstringIndex(calculate, "%", i + 1)) / 100 +
calculate.substring(getSubstringIndex(calculate, "%", i + 1) + 1, calculate.length);
break;
}
}
}
}
}
calculate = calculate.replace(/=/g, "");
if (isFinite(eval(calculate))) return string + ' = ' + eval(calculate);
}
};
console.log('math 0:', toCalculate('2 ÷ 2 + 1 - 2 + 22'));
console.log('math 1:', toCalculate('2 + 2 - 1'));
console.log('math 2:', toCalculate('4 ÷ 2 + 9'));
console.log('math 3:', toCalculate('888 + 88 + 8 + 8 + 8'));
console.log('math 4:', toCalculate('(7+7) * (7 + (1/7))'));
console.log('math 5:', toCalculate('2 + 2 - 1 = 3 + 2'));
console.log('math 6:', toCalculate('6 - 1 x 0 + 2 ÷ 2'));
console.log('math 7:', toCalculate('6^2 ÷ 2(3) + 4'));
console.log('math 8:', toCalculate('6 - 1 x 0 + 2 ÷ 2'));
console.log('math 9:', toCalculate('6 x 2'));
解决方案
我不确定你的代码是如何工作的,但我在调试后注意到了一些问题。
第一个问题是您忘记替换操作x
并^
在 javascript 中使用等效项,所以我在开头添加了这两行:
calculate = calculate.replace(/x/g, "*");
calculate = calculate.replace(/\^/g, "**");
第二个问题2(3)
对我们来说意味着 2x3,但对于 javascript 来说意味着它2
是一个函数,并且3
在传递给它的参数中,为了解决您需要*
在它们之间添加的问题,我为此创建了一个函数:
function fixMultiplication(exp ,ch){
for(i=0;i<exp.length;i++){
if(exp.substring(i,i+1) === ch){
if (ch === '(' || ch === 'M' ){//before the character
switch(exp.substring(i-1,i)){
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case 'x':
case ')':
case 'π':
exp=exp.substring(0,i)+"*"+exp.substring(i,exp.length);
}
} else {//after the character
switch(exp.substring(i+1,i+2)){
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case 'x':
case '(':
case 'π':
case 'M':
exp=exp.substring(0,i+1)+"*"+exp.substring(i+1,exp.length);
}
}
}
}
return exp;
}
let string = '6(2)4((3))9';
console.log("before : "+string);
string = fixMultiplication(string,"(");
string = fixMultiplication(string,")");
console.log("after : "+string);
现在代码如下所示:
const toCalculate = (string) => {
function fixMultiplication(exp ,ch){
for(i=0;i<exp.length;i++){
if(exp.substring(i,i+1) === ch){
if (ch === '(' || ch === 'M' ){//before the character
switch(exp.substring(i-1,i)){
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case 'x':
case ')':
case 'π':
exp=exp.substring(0,i)+"*"+exp.substring(i,exp.length);
}
} else {//after the character
switch(exp.substring(i+1,i+2)){
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case 'x':
case '(':
case 'π':
case 'M':
exp=exp.substring(0,i+1)+"*"+exp.substring(i+1,exp.length);
}
}
}
}
return exp;
}
let calculate = "=" + string.toLowerCase();
calculate = calculate.replace(/x/g, "*");
calculate = calculate.replace(/\^/g, "**");
if (
isFinite(
calculate.replace(
/\=|\+|\-|\*|\/|\÷|\%|\(|\)|\,|\ |math.|pow|sqrt|round|floor|ceiling|ceil|pi|π|euler|absolute|abs|exp|logarithm|log|random|rand|rng/g,
""
)
)
) {
calculate = calculate
.replace(/ /g, "")
.replace(/÷/g, "/")
.replace(/power|pow/g, "Math.pow")
.replace(/sqrt|squareroot/g, "Math.sqrt")
.replace(/round/g, "Math.round")
.replace(/floor/g, "Math.floor")
.replace(/ceiling|ceil/g, "Math.ceil")
.replace(/pi|π/g, "Math.PI")
.replace(/euler/g, "Math.E")
.replace(/absolute|abs/g, "Math.abs")
.replace(/exp/g, "Math.exp")
.replace(/logarithm|log/g, "Math.log")
.replace(/random|rand|rng/g, "Math.random()");
if (calculate.replace(/[^%]/g, "").length > 0) {
for (let i = 0; i < calculate.replace(/[^%]/g, "").length; i++) {
while (
(calculate[getSubstringIndex(calculate, "%", i + 1) + 1] == "+" ||
calculate[getSubstringIndex(calculate, "%", i + 1) + 1] == "-" ||
calculate[getSubstringIndex(calculate, "%", i + 1) + 1] == "*" ||
calculate[getSubstringIndex(calculate, "%", i + 1) + 1] == "/" ||
calculate[getSubstringIndex(calculate, "%", i + 1) + 1] == "(" ||
calculate[getSubstringIndex(calculate, "%", i + 1) + 1] == ")" ||
calculate[getSubstringIndex(calculate, "%", i + 1) + 1] == "," ||
calculate[getSubstringIndex(calculate, "%", i + 1) + 1] == "^" ||
calculate[getSubstringIndex(calculate, "%", i + 1) + 1] == "x" ||
getSubstringIndex(calculate, "%", i + 1) + 1 == calculate.length) &&
calculate.replace(/[^%]/g, "").length > 0
) {
for (let j = getSubstringIndex(calculate, "%", i + 1); j > -1; j--) {
if (
calculate[j] == "=" ||
calculate[j] == "+" ||
calculate[j] == "-" ||
calculate[j] == "*" ||
calculate[j] == "/" ||
calculate[j] == "(" ||
calculate[j] == ")" ||
calculate[j] == "," ||
calculate[j] == "^" ||
calculate[j] == "x"
) {
calculate =
calculate.substring(0, j + 1) +
calculate.substring(j + 1, getSubstringIndex(calculate, "%", i + 1)) / 100 +
calculate.substring(getSubstringIndex(calculate, "%", i + 1) + 1, calculate.length);
break;
}
}
}
}
}
calculate = calculate.replace(/=/g, "");
calculate = fixMultiplication(calculate,"(");
calculate = fixMultiplication(calculate,")");
if (isFinite(eval(calculate))) return string + ' = ' + eval(calculate);
}
};
console.log('math 0:', toCalculate('2 ÷ 2 + 1 - 2 + 22'));
console.log('math 1:', toCalculate('2 + 2 - 1'));
console.log('math 2:', toCalculate('4 ÷ 2 + 9'));
console.log('math 3:', toCalculate('888 + 88 + 8 + 8 + 8'));
console.log('math 4:', toCalculate('(7+7) * (7 + (1/7))'));
console.log('math 5:', toCalculate('2 + 2 - 1 = 3 + 2'));
console.log('math 6:', toCalculate('6 - 1 x 0 + 2 ÷ 2'));
console.log('math 7:', toCalculate('6^2 ÷ 2(3) + 4'));
console.log('math 8:', toCalculate('6 - 1 x 0 + 2 ÷ 2'));
console.log('math 9:', toCalculate('6 x 2'));
请注意,我fixMultiplication
同时要求(
和)
calculate = fixMultiplication(calculate,"(");
calculate = fixMultiplication(calculate,")");
备注:
使用eval() 时要小心,这是一个具有严重安全问题的危险函数。请参阅从不使用 eval()!
推荐阅读
- python - 即使我之前在 Ubuntu 18.04 中使用 python 单独安装了它们,Anaconda 是否会重新安装所有软件包,例如(numpy、pandas、pycuda 等)?
- javascript - 需要 div 被下推
- java - Gradle 5 和 IntelliJ 2018.3。无法识别的选项:--add-opens 或 java.base.java.lang=ALL-UNNAMED
- javascript - 如何使用 JavaScript 检查哪个是活动用户的麦克风(音频输入设备)?
- .net - F# 代码不够通用(使用静态成员约束)
- sql-server - Azure 网站上的 Azure VM SQL Server 集成安全性
- php - 正则表达式在 Regexr 工具中工作,但不在 PHP 中
- python - 网页抓取 vaadin python
- sql-server - SQL Server - 始终根据条件向上或向下舍入
- android - 数据绑定 NoSuchMethodError 与 buildtools 3.4.0