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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值