FormulaParser公式解析类
使用新的计算函数,新的算法.速度更快,使用更方便.
算法简介:
format函数:
根据格式化的原则,用一系列的if判断,过滤掉不符合的字符,并分割成数组.再利用括号的一一对应,补全
不匹配的括号.
calculate函数:
根据运算法则,给不同运算符赋予不同权值,再通过权值比较便可以确定运算顺序.
类代码:
/*
* FormulaPareser 公式解析类
* Version 1.0
* 2006.8.11
* Copyright CYJB
*/
//
/*
* 公式解析类,可以计算包含加号(+),减号(-),乘号(*),除号(/),乘方(^),取模(%)以及括号的公式.
* format()格式化公式.格式化遵循以下原则:
* 1."+","-"号前是非数字时,将被认为是正、负号.
* 2.当两个运算符连用(例如"^*"),将使用后面的运算符("+""-"除外).若前面的运算符是"+","-",将被
认为是+1,-1.
* 3.括号前后直接加数字,将被认为是乘以该数字.
* 4.当"("与")"不匹配时,将认为是缺少最外层括号.
* 5.自动去除公式的非法字符(除了".0123456789+-/*%^()").
* 6.自动去除"(数字)"中的括号
* calculate()计算公式.可以传入字符串(会自动调用format函数格式化字符串),也可以直接传入数组
* (不会调用format函数).直接传入数组需要注意格式,但是计算会更快速.
* 注意:请注意输入数据的大小,否则可能会计算错误(超过flash计算能力).
*/
//
class FormulaParser {
public static function format(s:String):Array {
//格式化公式
var data:Array = [];
var backets:Array = [];
//括号个数记录
var n = 0;
var s1 = s.charAt(n);
while (s1.length == 1) {
var k = s1.charCodeAt(0);
var l = data.length-1;
var s2 = data[l];
var k2 = (s2.charCodeAt(s2.length-1) == undefined) ? 0 :
s2.charCodeAt(s2.length-1);
if (k>=48 && k=48 && k2=48 && k2=48 && k2=48 && k2=48 && k2=48 && k2=n && m[m.length-1][3]) {
var arr = m.pop();
num = evals(arr[0], arr[1], num);
}
i += 3;
if (i>=l) {
for (var j in m) {
num = evals(m[j][0], m[j][1], num);
}
}
} else {
var n2 = getPriority(sign2);
if (n>=n2) {
num = evals(num, sign, data);
while (m[m.length-1][2]>=n2 && m[m.length-
1][3]) {
var arr = m.pop();
num = evals(arr[0], arr[1], num);
}
} else {
m.push([num, sign, n, true]);
num = data;
}
sign = sign2;
n = n2;
i += 2;
}
}
}
return Number(num);
}
private static function getPriority(s:String):Number {
//计算权值
if (s == "+" || s == "-") {
return 1;
} else if (s == "*" || s == "/" || s == "%") {
return 2;
} else if (s == "^") {
return 3;
} else {
return 0;
}
}
private static function evals(n1:String, s:String, n2:String):String {
//计算数据
switch (s) {
case "+" :
return String(Number(n1)+Number(n2));
case "-" :
return String(Number(n1)-Number(n2));
case "*" :
return String(Number(n1)*Number(n2));
case "/" :
return String(Number(n1)/Number(n2));
case "%" :
return String(Number(n1)%Number(n2));
case "^" :
return String(Math.pow(Number(n1), Number(n2)));
}
}
}
swf:
源文件:
FormulaParse.rar
本文转自:http://www.5uflash.com/flashjiaocheng/Flashaschengxu/278.html