⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 expression.as

📁 支持分数约分/基本三角函数计算的AS3表达式解析类,可以将字符串中的算式解析为结果值.
💻 AS
字号:
//Class:Expression  Author:Swfdong  Date:2007-7-1package {	import Fraction;	import AdvancedMath;	public class Expression {		private var EXPRESSION_SOURCE:String;		private static  var EXPRESSION_OPERATOR:Array=new Array("arcsin",3,"arccos",3,"arctan",3,"sin",3,"cos",3,"tan",3,"cot",3,"^",3,"*",2,"/",2,"+",1,"-",1);		private static  var EXPRESSION_OPERATORLENGTH:Number;		private static  var EXPRESSION_STEPCACHE:Array;		private static  var EXPRESSION_STEPDATA:Array;		function Expression(str:String) {		}		//无步骤解析		public static function parse(str:String):String {			return mainparse(str,false);		}		//带步骤解析		public static function step(str:String):Array {			EXPRESSION_STEPCACHE=new Array(3);			EXPRESSION_STEPDATA=new Array  ;			EXPRESSION_STEPDATA.push(mainparse(str,true));			return EXPRESSION_STEPDATA;		}		//内部解析,包括字符串		private static function mainparse(str:String,step:Boolean):String {			EXPRESSION_OPERATORLENGTH=EXPRESSION_OPERATOR.length / 2;			var startIndex:Number=0;			while (str.indexOf("(",startIndex) != -1 & str.indexOf(")",startIndex) != -1 && str.split("(").length == str.split(")").length) {				var nowIndex:Number=str.indexOf("(",startIndex) + 1;				var backIndex:Number=str.indexOf(")",nowIndex);				if (backIndex < str.indexOf("(",nowIndex) || str.indexOf("(",nowIndex) == -1) {					if (step) {						EXPRESSION_STEPCACHE[0]=str.substr(0,nowIndex);						EXPRESSION_STEPCACHE[2]=str.substring(backIndex,str.length);					}					str=str.substr(0,nowIndex - 1) + calculate(str.substring(nowIndex,backIndex),step) + str.substring(backIndex + 1,str.length);					startIndex=0;				} else {					startIndex=nowIndex;				}			}			if (step) {				EXPRESSION_STEPCACHE[0]=EXPRESSION_STEPCACHE[2]="";			}			return calculate(str,step);		}		//无括号内容的计算		private static function calculate(str:String,step:Boolean):String {			while (String(parseFloat(str)) != str && new Fraction(str).value != str) {				var topIndex:Number=str.length;				var topOperator:Number=0;				var topLevel:Number=0;				for (var i:Number=0; i < EXPRESSION_OPERATORLENGTH; i++) {					var tIndex:Number=str.indexOf(EXPRESSION_OPERATOR[i * 2],i < 7?0:1);					var tLevel:Number=EXPRESSION_OPERATOR[i * 2 + 1];					if (tIndex != -1 && (tLevel == topLevel && tIndex < topIndex || tLevel > topLevel)) {						topIndex=tIndex;						topLevel=tLevel;						topOperator=i * 2;					}				}				var OperatorLength:Number=EXPRESSION_OPERATOR[topOperator].length;				if (step) {					EXPRESSION_STEPDATA.push((EXPRESSION_STEPCACHE[0] != undefined?EXPRESSION_STEPCACHE[0]:"")+ str + (EXPRESSION_STEPCACHE[2] != undefined?EXPRESSION_STEPCACHE[2]:""));				}				var prevO:Number=prevOperator(str,topIndex - 1);				var nextO:Number=nextOperator(str,topIndex + OperatorLength);				str=str.substring(0,prevO) + operation(str.substring(prevO,topIndex),str.substring(topIndex + OperatorLength,nextO),str.substr(topIndex,OperatorLength)) + str.substring(nextO,str.length);			}			return str;		}		//单步计算		private static function operation(n1:String,n2:String,operator:String):String {			var frc1:Fraction= !isNaN(parseFloat(n1))|| n1.indexOf("|") != -1?new Fraction(n1):new Fraction("0|1");			var frc2:Fraction= !isNaN(parseFloat(n2))|| n2.indexOf("|") != -1?new Fraction(n2):new Fraction("0|1");			operator=n1 == "-"?"+":operator;			switch (operator) {				case "+" :					return AdvancedMath.plus(frc1,frc2);				case "-" :					return AdvancedMath.minus(frc1,frc2);				case "*" :					return AdvancedMath.multiply(frc1,frc2);				case "/" :					return AdvancedMath.divide(frc1,frc2);				case "^" :					return AdvancedMath.pow(frc1,frc2);				case "sin" :					return AdvancedMath.sin(frc2);				case "cos" :					return AdvancedMath.cos(frc2);				case "tan" :					return AdvancedMath.tan(frc2);				case "cot" :					return AdvancedMath.cot(frc2);				case "arcsin" :					return AdvancedMath.arcsin(frc2);				case "arccos" :					return AdvancedMath.arccos(frc2);				case "arctan" :					return AdvancedMath.arctan(frc2);				default :					return frc2.value;			}		}		//上一个运算符		private static function prevOperator(str:String,startIndex:Number):Number {			var OperatorIndexData:Array=new Array;			var tIndex:Number=0;			for (var i:Number=0; i < EXPRESSION_OPERATORLENGTH; i++) {				tIndex=str.lastIndexOf(EXPRESSION_OPERATOR[i * 2],startIndex);				tIndex=EXPRESSION_OPERATOR[i * 2] == "-" && tIndex == 0?-199186:tIndex;				OperatorIndexData.push(tIndex != -1?tIndex:-199186);			}			OperatorIndexData.sort(Array.NUMERIC);			tIndex=(OperatorIndexData[OperatorIndexData.length - 1] != -199186)?(OperatorIndexData[OperatorIndexData.length - 1] + 1):0;			return tIndex;		}		//下一个运算符		private static function nextOperator(str:String,startIndex:Number):Number {			var OperatorIndexData:Array=new Array;			var tIndex:Number=0;			for (var i:Number=0; i < EXPRESSION_OPERATORLENGTH; i++) {				tIndex=str.indexOf(EXPRESSION_OPERATOR[i * 2],startIndex);				tIndex=EXPRESSION_OPERATOR[i * 2] == "-" && tIndex == startIndex?str.indexOf("-",tIndex + 1):tIndex;				OperatorIndexData.push(tIndex != -1?tIndex:199186);			}			OperatorIndexData.sort(Array.NUMERIC);			tIndex=(OperatorIndexData[0] != 199186)?OperatorIndexData[0]:str.length;			return tIndex;		}	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -