as 技巧总结

目录表

字符串操作

  1. 字符串替换

数学运算

  1. 带括号的四则运算

内容

字符串操作

  1. 字符串替换:使用新的字符串替换掉原字符串中的指定子字符串 AS Code
    // @param sourceStr: 字符串源
    // @param oldStr: 要替换掉的字符串
    // @param newStr: 新的字符串
    // @return 替换完毕的字符串
    function replace (sourceStr:String, oldStr:String, newStr:String):String
    {
    	return sourceStr.split (oldStr).join (newStr);
    }
    trace("sourceStr : " + abcadfwefabsdf)
    trace ("destStr : " + replace ("abcadfwefabsdf""ab""e"));
    // output:
    // sourceStr : abcadfwefabsdf
    // destStr : ecadfwefesdf
    

数学运算

  1. 带括号的四则运算:对于任意给定的算式,计算其结果 AS Code
    var calcStr:String = "";
    var opSign:Array;
    var opNum:Array;
    var privi:Array = [['('')'], ['+''-'], ['×''*''÷''/']];
    // 比较优先级
    function checkPrivi(s1:String, s2:String):Boolean
    {
    	if ((s1 == '(' && s2 == '(') || (s1 == ')' && s2 == ')'))
    	{
    		// 同样是括号,当优先级有差别
    		return true;
    	}
    	if (s2 == '(')
    	{
    		return true;
    	}
    	if (s2 == '#')
    	{
    		// # 优先级最低
    		return false;
    	}
    	var p1:Number = -1;
    	var p2:Number = -1;
    	var len:Number = 0;
    	for (var i = 0; i < 3; i++)
    	{
    		len = privi[i].length;
    		for (var j = 0; j < len; j++)
    		{
    			if (privi[i][j] == s1)
    			{
    				p1 = i;
    			}
    			if (privi[i][j] == s2)
    			{
    				p2 = i;
    			}
    			if (p1 > -1 && p2 > -1)
    			{
    				break;
    			}
    		}
    	}
    	// trace("p2");
    	// trace("p1");
    	return p2 > p1;
    }
    // 单步计算
    function calcS(num1:Number, num2:Number, opS:String):Number
    {
    	// trace("calc :" + num1 + opS + num2);
    	switch (opS)
    	{
    	case '+' :
    		return num1 + num2;
    		break;
    	case '-' :
    		return num1 - num2;
    		break;
    	case '×' :
    	case '*' :
    		return num1 * num2;
    		break;
    	case '÷' :
    	case '/' :
    		return num2 == 0 ? 0 : num1 / num2;
    	}
    }
    // 计算字符串
    function calc(str:String):Number
    {
    	if (str.indexOf('#') == -1)
    	{
    		str += '#';
    	}
    	// trace("calc Str: " + str);
    	opSign = [];
    	opNum = [];
    	var tempNum:Number;
    	var i:Number = 0;
    	var sStr:String;
    	var tempNum:Number = 0;
    	// trace("初始");
    	// trace("num : " + opNum);
    	// trace("sign :" + opSign);
    	// trace("计算开始");
    	while (opSign[0] != '#')
    	{
    		// 运算符栈和操作数栈情况
    		// trace("num : " + opNum);
    		// trace("sign :" + opSign);
    		sStr = str.charAt(i);
    		// trace("待处理字符:" + sStr);
    		if (isNaN(sStr) && sStr != '.')
    		{
    			// trace("处理为运算符");
    			// 运算符操作
    			if (opSign.length == 0 || checkPrivi(opSign[opSign.length - 1], sStr))
    			{
    				// trace("符号入栈:" + sStr);
    				opSign.push(sStr);
    			}
    			else
    			{
    				// trace("计算");
    				var tempSign:String = String(opSign.pop());
    				if (tempSign == '(' && sStr == ')')
    				{
    					// trace("消除括号");
    					i++;
    					continue;
    				}
    				var temp1:Number = Number(opNum.pop());
    				var temp2:Number = Number(opNum.pop());
    				// trace("计算结果入栈");
    				opNum.push(calcS(temp2, temp1, tempSign));
    				continue;
    			}
    		}
    		else
    		{
    			// trace("处理为数字");
    			// 取运算数
    			tempNum = 0;
    			var _s = i
    			var tmpStr:String = "";
    			do
    			{
    				tmpStr += sStr
    				//tempNum = tempNum * 10 + Number(sStr);
    				i++;
    				sStr = str.charAt(i);
    			} while (isNaN( tmpStr + sStr) == false);
    			opNum.push(Number(tmpStr));
    			continue;
    		}
    		i++;
    	}
    	return opNum[0];
    }
    trace(calc("10.5+3.2"))
    // output: 13.7