读书人

flex/as 版 eval 字符串 四则混同 

发布时间: 2012-09-14 23:00:49 作者: rapoo

flex/as 版 eval 字符串 四则混合 运算

1.传入一个带四则运算的字符串。(如:var a:String = "2*(4-3.001)+3.5";).

2.返回值为被解析后四则运算出来的结果值。

?

    package com.zzz      {          public class MathExpress          {              public function MathExpress()              {              }              public static function MathExpressByStr(str:String):String{                  str = "(" + str.replace(/[^\d.+-*\/()]+/g,"") + ")";                  while (/\([^()]*\)/.test(str)){                      str = str.replace(/\(([^()]*)\)/g,function(s, b){                          while (/[*\/]/.test(b)){                              b = b.replace(/([\d.]+)([*\/])([\d.]+)/g,function(c, m, l, n){                                  var i:Number = parseFloat(m);                                  var j:Number = parseFloat(n);                                  return l=="*" ? i*j : i/j;                              })                          }                          while (/[+-]/.test(b)){                              b = b.replace(/([\d.]+)([+-])([\d.]+)/g,function(c, m, l, n){                                  var i:Number = parseFloat(m);                                  var j:Number = parseFloat(n);                                  return l=="+" ? i+j : i-j;                              })                          }                          return b;                      })                  }                  return str;              }             }      }  

?3.得最后结果:7.498

?

转至:http://blog.csdn.net/zzz_robinson/article/details/7239829

?

?

?

private function evalString(infix:String):String{                  var opArray:Array = new Array();                                    //栈底标记                  opArray[0] = '@';                  var op:Number = 1;                  var postfix:Array = new Array();                  var post:Number = 0;                                    //保存计算结果                  var res:Number = 0;                                    var i, j;                  var tempString:String = new String();                                    //计算两个数                  function Caculate(opSign:String) {                      if (opSign == '+') {                          res = postfix[post-2]+postfix[post-1];                      } else if (opSign == '-') {                          res = postfix[post-2]-postfix[post-1];                      } else if (opSign == '*') {                          res = postfix[post-2]*postfix[post-1];                      } else if (opSign == '/') {                          if (!postfix[post-1]) {                              trace("Expression Error!");                          } else {                              res = postfix[post-2]/postfix[post-1];                          }                      }                      postfix[post-1] = 0;                      postfix[post-2] = res;                      post--;                  }                                    //扫描中缀表达式                  for (i=0; i<infix.length; i++) {                      switch (infix.charAt(i)) {                          //左括号就直接入栈                          case '(' :                              opArray[op] = infix.charAt(i);                              op++;                              break;                          //右括号则退栈计算,直到遇见一个左括号                          case ')' :                              for (j=op-1; j>0; j--) {                                  if (opArray[j] != '(') {                                      Caculate(opArray[j]);                                      opArray[j] = '#';                                  } else {                                      opArray[j] = '#';                                      break;                                  }                              }                              op = j;                              break;                          case '*' :                          case '/' :                              //如果栈顶的运算符为*或/,则先退栈,再入栈,否则直接入栈                               if (opArray[op-1] == '*') {                                  op--;                                  Caculate(opArray[op]);                                  opArray[op] = '#';                              } else if (opArray[op-1] == '/') {                                  op--;                                  Caculate(opArray[op]);                                  opArray[op] = '#';                              }                              opArray[op] = infix.charAt(i);                              op++;                              break;                          case '+' :                          case '-' :                              //如果栈顶的运算符不是左括号也不是栈底,则先退栈计算,再入栈                               if (opArray[op-1] != '(' && opArray[op-1] != '@') {                                  op--;                                  Caculate(opArray[op]);                                  opArray[op] = '#';                              }                              opArray[op] = infix.charAt(i);                              op++;                              break;                          default :                              //如果是数字字符或者小数点则转化为数字存入数组                              //如果下一个字符是运算符则把当前数字存入数组                              tempString += infix.charAt(i);                              var temp:String = new String();                              temp = infix.charAt(i+1);                              if (temp != '.' && (temp>'9' || temp<'0')) {                                  postfix[post] = parseFloat(tempString);                                  post++;                                  tempString = "";                              }                              //trace(postfix);                         }                  }                                    //扫描完成,全部退栈                  for (j=op-1; j>0; j--) {                      if (opArray[j] != '@') {                          Caculate(opArray[j]);                          opArray[j] = '#';                      } else {                          break;                      }                  }                  //返回结果                  return postfix[0];              }

?转至:http://blog.csdn.net/zzz_robinson/article/details/7311629

?

读书人网 >flex

热点推荐