首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

FormulaParser公式解析种

2012-11-07 
FormulaParser公式解析类FormulaParser公式解析类 使用新的计算函数,新的算法.速度更快,使用更方便. 算法

FormulaParser公式解析类

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

热点排行