JS 将字符串类型的算式运算出一个结果

最近学习的时候自己写了两个函数,可以将字符串类型的算式算出来,记录一下。支持四则运算和小括号。

开发环境是微信开发者工具,亲测可用,有需要的可以自取,需要优化的地方可以自便。

第一个函数stringToNum()接收一个字符串形式的算式,但不支持小括号,返回值类型number。

第二个函数strToNumWithBrk()也接收一个字符串形式的算式,支持小括号,返回值类型number,这个函数需要调用第一个函数。

function stringToNum(str){
    var par = [ 
      {num:0, left:'', right:''},  {num:0, left:'', right:''}, 
      {num:0, left:'', right:''},  {num:0, left:'', right:''}, 
      {num:0, left:'', right:''},  {num:0, left:'', right:''}, 
      {num:0, left:'', right:''},  {num:0, left:'', right:''}, 
      {num:0, left:'', right:''},  {num:0, left:'', right:''}, 
      {num:0, left:'', right:''},  {num:0, left:'', right:''}, 
    ];//储存所有数字及运算符
    var start = 0;
    var index = 0;

    var calin = str.replace(/\s*/g,""); //删除所有空白符
    //console.log(str);
    for(let i=0; i<calin.length+1; i++)//此循环取出所有运算符和数字
    {
      let temp = calin.charAt(i);
      if( temp == '+' || temp == '-' || temp == '*' || 
          temp == '/' || temp == '×' || temp == '÷' || temp == ''){
          par[index].num =  Number(calin.slice(start,i));
          par[index].left = calin.charAt(start-1);
          par[index].right = calin.charAt(i);
          index++;
          start = ++i;
          if(temp == ''){//删除par中剩余未使用的对象
            par.splice(index);
          }
      }
    }
    //console.log(par);
    for(let j=0; j<par.length; )//此循环做乘除法
    {
      let temp = par[j].right
      if(temp == '×' || temp == '÷' || temp == '*'|| temp == '/'){
        if(temp == '×' || temp == '*'){
          par[j+1].num = par[j].num * par[j+1].num;
          par[j+1].left = par[j].left;
          par.splice(j,1);
          j = 0;
        }
        else{
          par[j+1].num = par[j].num / par[j+1].num;
          par[j+1].left = par[j].left;
          par.splice(j,1);
          j = 0;
        }
      }
      else{
        j++;
      }
    }//console.log(par)
    for(let j=0; par[j].right != '';)//做加减法
    {
      if(par[j].right == '+'){
        par[j+1].num = par[j].num + par[j+1].num;
        par.splice(j,1);
        j = 0;
      }
      else if(par[j].right == '-'){
        par[j+1].num = par[j].num - par[j+1].num;
        par.splice(j,1);
        j = 0;
      }
    }//console.log(par[0]);
    return par[0].num;
}
function strToNumWithBrk(str){ 
  var calin = str.replace(/\s*/g,""); //删除所有空白符
  var withBrackets = '';              //储存只有一对括号的字符串
  var withoutBrackets = '';           //去除括号,只保留算式
  var result = '';                    //储存运算结果
  while(calin.match(/[\(][^()]+[\)]/))//循环直到去除所有括号
  {
    withBrackets = calin.match(/[\(][^()]+[\)]/);//匹配字符串中只有一对括号的算式
    //console.log(withBrackets);

    withoutBrackets = withBrackets.join().replace(/\(|\)/g,"");//将匹配结果的括号去除
    //console.log(withoutBrackets);

    result = stringToNum(withoutBrackets);//将去除括号的算式算出一个值
    //console.log(result);

    calin = calin.replace(withBrackets,result);//用算出的值替换包含一对括号的算式
    //console.log(calin);
  }
  result = stringToNum(calin);//返回最终结果
  //console.log(result);
  return result;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋至日丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值