- 确定元素
- 解析公式
- 完整公式:个人得分*((中心总人数*100)/中心总得分)
- 分析
- 公式中的元素除了自定义元素外,就是括号和运算符
- 解析括号是否合法,通过js便利公式字符串,找出里面所有的左括号和右括号,如果数量不对等,肯定不合法.
- 验证括号合法后,将括号从公式字符串中去掉,使用js的replace方法, str.replace(/[\(\)]/g,'')
- 验证运算符和元素是否合法,使用正则替换所有运算符为','逗号,然后以逗号分组,判断是否有元素为空,如果有空则肯定不合法.如果没有空的,则以正则的方式去验证每一个元素是否是规定的元素,如果不是,则肯定不合法.
//解析公式 function analyze(str){ var flag =false; var reg = /^(\d+(\.\d+)?)$|^(基础分值)$|^(日常任务得分)$|^(巡检任务得分)$|^(指派得分)$|^(加扣分项得分)$|^(个人得分)$|^(中心总人数)$|^(中心总得分)$/; if(str.length!=0){ //最后一个位置不能是运算符 if(/[\+\-\*\/]/g.test(str.charAt(str.length-1))){ $.messager.alert('提示','公式不合法,不能以运算符结尾!','info'); return false; } //只要括号是成对的就没有问题 //左括号 var leftArr = findNum(str,'('); //右括号 var rightArr = findNum(str,')'); if(leftArr.length!=rightArr.length){ $.messager.alert('提示','公式不合法,括号不对应!','info'); return false; } //再验证括号出现的位置是否合法 if(leftArr.length>0 && rightArr.length>0){ //左括号不会出现在最后位置 if(leftArr[leftArr.length-1]==(str.length-1)){ $.messager.alert('提示','公式不合法,请检查!','info'); return false; } //左括号合法性 for(var i=0;i<leftArr.length;i++){ //判断前后字符是否合法 if(leftArr[i]==0){ continue; } var temp = str.substr(0,leftArr[i]); var tempReg = /[\(\+\-\*\/]/; //前字符只能是: ( 或 运算符,如果下标是0,则不去查询 if(!tempReg.test(temp.substr(temp.length-2))){ $.messager.alert('提示','公式不合法,请检查!','info'); return false; } //后字符只能是: ( 或 元素 temp = str.substr(leftArr[i]+1); var tempStr = temp.replace(/[\+\-\*\/]/g,','); tempStr = tempStr.split(','); if(!(temp.substr(0,1)=='(' || reg.test(tempStr[0]))){ $.messager.alert('提示','公式不合法,请检查!','info'); return false; } } //右括号不会出现在第一个位置 if(rightArr[0]==0){ $.messager.alert('提示','公式不合法,请检查!','info'); return false; } //前面只能是元素 for(var i=0;i<rightArr.length;i++){ //判断前后字符是否合法 if(rightArr[i]==(str.length-1)){ continue; } var temp = str.substr(0,rightArr[i]); //前字符: ) 或 元素 var tempStr = temp.replace(/[\+\-\*\/]/g,','); tempStr = tempStr.split(','); if(!(temp.substr(temp.length-2,1)==')' || reg.test(tempStr[tempStr.length-1]))){ $.messager.alert('提示','公式不合法,请检查!','info'); return false; } //后字符: ) 或 运算符,如果下标是最后一位,则不去查询 var temp = str.substr(rightArr[i]+1); var tempReg = /[\)\+\-\*\/]/; if(!tempReg.test(temp.substr(0,1))){ $.messager.alert('提示','公式不合法,请检查!','info'); return false; } } } //匹配 str = str.replace(/[\(\)]/g,''); str = str.replace(/[\+\-\*\/]/g,','); var arr = str.split(','); for(var i=0;i<arr.length;i++){ if(arr[i]==''||!reg.test(arr[i])){ $.messager.alert('提示','公式不合法,请检查!','info'); return false; } } flag = true; } return flag; } //查询一个字符在字符串中出现的位置 function findNum(src,char){ var locationArr = new Array(); for(var i=0;i<src.length;i++){ if(char == src.charAt(i)){ locationArr.push(i); } } return locationArr; }
1 0