freemanjj 2011-07-30
因工作要求,需要验证会计使用的公式,写了一个js类,在此一做记录
/************************************************** * 此类用来验证公式合法性<br> * 公式输入说明:<br> * 1、可以输入数值常量。50、20.3<br> * 2、可以报表单元格列表中选取需要的单元格。R.001.A04<br> * 3、可以使用+,-,*,/运算符和括号(,)。<br> * <br> * 正确公式示例:<br> * //正确公式 (R.001.A04+R.001.A04+R.001.A03)/50-R.001.A06/8.05*166 <br> * //错误公式 (R.0011.A04+R.001.A04+R.001.A03)/50-R.001.A06/8.05*166<br> * <br> * <br> * 使用示例:<br> * 创建公式<br> * var tStr = "(R.001.A04+R.001.A04+R.001.A03)/50-R.001.A06/8.05*166";<br> * 创建验证公式对象<br> * var fromsV = new FromsUtil();<br> * 调用验证方法<br> * fromsV.validateFroms(tStr);<br> * 取得验证结果<br> * alert(fromsV.validateFlag);<br> * <br> *************************************************/ FromsUtil = function() { //加、减、乘、除 this.patt = /[+\-\/\*]/; //验证公式元素:R.001.A04--(R.001.A04--R.001.A04)--22--22.22 //var patt2 = /^\({0,}R\.\d{3}\.[A-Z]\d{2}\){0,}$|^\d{1,}$|^\d{1,}\.\d{1,}$/; //常量前后也可有括号 this.patt2 = /^\({0,}R\.\d{3}\.[A-Z]\d{2}\){0,}$|^\({0,}\d{1,}\){0,}$|^\({0,}\d{1,}\.\d{1,}\){0,}$/; //验证结果 this.validateFlag = true; //括号个数 this.patt3 = /\(/g; this.patt4 = /\)/g; var leftBracket=0; var rigthBracket=0; var count = 0; //递归次数--来确定是否有计算符号 //验证公式的主要方法 this.validateFroms = function (str) { //取得匹配的字符串 var tem1 = str.match(this.patt); //alert(tem1); //假如为空为最后一个元素 if(tem1 == null) { //假如无计算符返回false if(count==0) { if(str.match(this.patt) == null) { this.validateFlag = false; return; } } //验证最后一个元素 if(!(this.patt2.test(str))) { this.validateFlag = this.patt2.test(str); return; } //取得括号的个数 while (this.patt3.exec(str) != null) { leftBracket++; } while (this.patt4.exec(str) != null) { rigthBracket++; } //验证括号个烽 if(leftBracket!=rigthBracket) { this.validateFlag=false; } return; }; //取得位置 var index = str.indexOf(tem1); //取得要验证的字符串 var str1=str.substring(0,index); //alert(str1); //alert(patt2.test(str1)); //验证结果 if(!(this.patt2.test(str1))) { this.validateFlag = this.patt2.test(str1); return; } //取得括号的个数 while (this.patt3.exec(str1) != null) { leftBracket++; } while (this.patt4.exec(str1) != null) { rigthBracket++; } count ++; //使用递归 var str2=str.substring(index+1,str.length); this.validateFroms(str2); } }