首页 > 解决方案 > 制作一个计算字符串中数字的函数

问题描述

我是使用 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'));

标签: javascript

解决方案


我不确定你的代码是如何工作的,但我在调试后注意到了一些问题。

第一个问题是您忘记替换操作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()!

推荐阅读