尝试使用 JavaScript 制作计算器但不知道如何定义大小写

Trying to make a calculator using JavaScript but don't know how to define cases

如何获取 number1 中的数字和 number2 中的数字以及 symbol1 symbol2 中的符号以及如何设置条件,例如第一个输入不应该是运算符,或者如果有多个运算符则出现 return 错误?我是第一次发帖,所以如果看起来不干净请见谅。

这是我的 js: 这是我指定的点击次数:

function clearCalculator()
  {
   document.querySelector("#result").value = '';
  }

  function printInteger(inputFromCalculator)
  {
    document.querySelector("#result").value += inputFromCalculator;
  }

  function printSymbol(inputFromCalculator)
  {
    document.querySelector("#result").value += inputFromCalculator;
  }

  function printFinalOutput()
  {

    var expression = document.querySelector("#result").value;

    expression+="=";
    //expression 22+32+22=

    if(sanityCheck(expression)==true)
    {
      divideAndConquer(expression);


    }

  }

我在这里尝试将整数放入 var number1 和 number2 中,将运算符放入 var symbol1 和 symbol2 中:

  function divideAndConquer(expression)
  {
    var number1;
    var number2;
    var symbol1;
    var symbol2;
    var miniExpressionLength;
    var partialOutput;
    for(var i=0;i<expression.length;i++)
        {
          if(isNumber(expression[i])==true && number1==null)
          { 
            number1=expression[i];
//logs number1 as single string

          }
          else
          {
            if(isNumber(expression[i])==true && number1!=null && symbol1==null)
            {
              number1 = number1 + expression[i];
            }

          }

          if(symbol1!=null && number1!=null && isNumber(expression[i])==true && number2==null)
          {
            number2 = expression[i];

          }
          else
          {
            if(symbol1!=null && number1!=null && isNumber(expression[i])==true && number2!=null && symbol2==null)
            {
              number2 = number2 + expression[i];
            }
          }


          if(isSymbol(expression[i])==true && symbol1==null)
          {
            symbol1=expression[i];
          }
          else
          {
            if(isSymbol(expression[i])==true && symbol1!=null)
            {
              symbol2=expression[i];
            }
          }if(symbol2!=null)
          {
            miniExpressionLength = i;
            //console.log("length of mini expression ="+i)
            break;
          }
        }

       partialOutput = calculate(number1,number2,symbol1);
       expression =  partialOutput+""+expression.substring(miniExpressionLength,expression.length);

      if(symbol1!=null)
      {
        divideAndConquer(expression);
      }
      else
      {
        console.log("expression ="+expression);
         return expression;
      }



  }

这里我指定了一些案例:


function sanityCheck(expression)
    {
        //case example +2+2
        if(isNumber(expression[0])==false)
        {
            alert("invalid expression");
            return false;
        }

        for(var i=0;i<expression.length;i++)
        {

            //case example 2++2
            if(isSymbol(expression[i])==true && isSymbol(expression[i+1])==true)
            {
                alert("invalid expression");
                return false;
            }

        }
        return true;

    }

解析数学表达式不是一项简单的任务,超出了答案的范围。有几个库提供解析。 如果您想出于学习目的这样做,您应该看看:

  • 逆波兰表示法
  • 抽象语法树
  • Shunting-yard算法

这里有一个很好的博客 post 可以帮助您入门: https://www.freecodecamp.org/news/parsing-math-expressions-with-javascript-7e8f5572276e/

首先,请注意,在“if 语句”中,如果结果已经是布尔值,则无需使用“==”

if(isNumber(expression[0]) == false) {

可以直接使用表达式:

if(!isNumber(expression[0])) {

注意“!” (非门)在句子的开头, 如果结果已经为假,则通过。

我强烈建议您使用 ES6 数组功能。 https://medium.com/poka-techblog/simplify-your-javascript-use-map-reduce-and-filter-bd02c593cc2d

sanityCheck 条件:

  1. 第一个字符必须是数字
  2. 之后它必须遵循顺序 Symbol-Number-Symbol-Number...

所以你可以使用这样的正则表达式:

^\d+([+\-\/\*]\d+)+$

(这里自己测试https://regex101.com/)

注意:这仅适用于整数。

function sanityCheck(expression)
{
    const sanityExpresion = /^\d+([+\-\/\*]\d+)+$/
    return sanityExpresion.test(expression);
}

你可以为 divideAndConquer 函数做这样的事情:

function divideAndConquer(expresion) {
    const symbolSeparation = /[+\-\/\*]/
    const numberSeparation = /\d/

    const numbers = expresion.split(symbolSeparation);

    // filter where symbol !== “”
    const  symbols = expresion.split(numberSeparation).filter(s => s);

    // So I get the first number and removed from the array
    let result = numbers.shift();

    // Here I use an array function
    symbols.forEach(operator => {
        const topNumber = numbers.shift();
        result = eval(result + operator + topNumber);
    })

    return result;
}

只用eval也是一样的:

function divideAndConquer(expresion) {
    return eval(expresion)
}

但我认为您希望在代码中多做一些操作来练习,祝您好运。 XD

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions