jeval 公式 |
您所在的位置:网站首页 › java公式解析 › jeval 公式 |
最近由于公司需要做一个可以解析字符串为表达式进行公式计算的功能,所以上网找了一下,结果不是很满足需要,但是对其进行了一部分参考,用了两天时间写了一个公式解析类,如下: jdk:1.5 /** * package cn.yunhe.tools; /** * Title: 公式解析类 * Description: 实现对字符串表达式进行简单的包括函数的运算。 * Copyright: Copyright (c) 2008 * Company: HXYJ * @author 幻想雨季(原创) * @version 1.0 */ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Gsjx { public static Listlc = new ArrayList();//定义运算符 static{ lc.add("+"); lc.add("`"); lc.add("*"); lc.add("/"); } public static Listlj = new ArrayList();//定义逻辑运算符 static{ lj.add(">"); lj.add(" } public static MapfunMap = new HashMap(); // int数组注释,第一个标识:0自带函数 1自定义函数;第二个标识:参数个数 static{ //自带函数,可利用反射机制 funMap.put("abs", new int[]{0,1}); funMap.put("acos", new int[]{0,1}); funMap.put("asin", new int[]{0,1}); funMap.put("atan", new int[]{0,1}); funMap.put("cbrt", new int[]{0,1}); funMap.put("ceil", new int[]{0,1}); funMap.put("cos", new int[]{0,1}); funMap.put("cosh", new int[]{0,1}); funMap.put("exp", new int[]{0,1}); funMap.put("expm1", new int[]{0,1}); funMap.put("floor", new int[]{0,1}); funMap.put("log", new int[]{0,1}); funMap.put("log10", new int[]{0,1}); funMap.put("log1p", new int[]{0,1}); funMap.put("random", new int[]{0,1}); funMap.put("rint", new int[]{0,1}); funMap.put("round", new int[]{0,1}); funMap.put("signum", new int[]{0,1}); funMap.put("sin", new int[]{0,1}); funMap.put("sinh", new int[]{0,1}); funMap.put("sqrt", new int[]{0,1}); funMap.put("tan", new int[]{0,1}); funMap.put("tanh", new int[]{0,1}); funMap.put("max", new int[]{0,2}); funMap.put("min", new int[]{0,2}); //自定义函数 funMap.put("if", new int[]{1,3}); funMap.put("mod", new int[]{1,2}); funMap.put("int", new int[]{1,1}); } /** * 公式初始化转换 * @param str * @return */ public static String strCast(String str) { str = str.toLowerCase();//去除空格,变小写 if(str==null?true:str.length()==0) return "0"; if(!checkFormula(str))return "0"; str = str.replaceAll("\\*-", "**"); str = str.replaceAll("-\\*", "**"); str = str.replaceAll("/-", "//"); str = str.replaceAll("-/", "//"); str = str.replaceAll("\\+-", "-"); str = str.replaceAll("-\\+", "-"); str = str.replaceAll("-", "`"); str = str.replaceAll("\\*\\*", "*-"); str = str.replaceAll("//", "/-"); str = str.replaceAll(" ", ""); return str; } /** * 检查公式中括号出现次数是否正确 * @param formulaStr * @return */ public static boolean checkFormula(String formulaStr) { boolean flag = true; int count = 0; for (int i = 0; i < formulaStr.length(); i++) { String s = String.valueOf(formulaStr.charAt(i)); if("(".equals(s)) count++; else if(")".equals(s)) count--; } flag = count==0; return flag; } /** * 分割函数 * @param str * @param bs * @return */ public static String[] spliteFun(String str, String bs) { Listlist = new ArrayList(); String bds = ""; int bracket = 0; int len = str.length(); for (int i = 0; i < len; i++) { String s = String.valueOf(str.charAt(i)); if("(".equals(s)) { bracket++; }else if(")".equals(s)) { bracket--; } if(bracket==0 && bs.equals(s)) { list.add(bds); bds = ""; continue; } bds+=s; } list.add(bds); String[] ss = new String[list.size()]; for (int i = 0; i < list.size(); i++) { ss[i] = list.get(i); } return ss; } /** * 用户自定义函数 * @param str * @param funStr * @return */ public static String customFun(String str, String funStr) { String reval = "0"; String[] gss = spliteFun(str, ","); if("if".equals(funStr)) { if(compare(gss[0])) { reval = calculate(gss[1]); }else{ reval = calculate(gss[2]); } }else if("mod".equals(funStr)) { double d2 = new Double(calculate(gss[1])); if(d2==0)return reval; double d1 = new Double(calculate(gss[0])); reval = (d1 % d2)+""; }else if("int".equals(funStr)) { reval = Math.floor(new Double(calculate(gss[0])))+""; } return reval; } //逻辑表达式判断 public static boolean compare(String str) { boolean flag = false; boolean bs = false; int len = str.length(); int bracket = 0; String ljbds = ""; double d_left = 0; double d_right = 0; for (int i = 0; i < len; i++) { String s = String.valueOf(str.charAt(i)); if("(".equals(s)) { bracket++; }else if(")".equals(s)) { bracket--; } if(bracket==0 && lj.contains(s)) { for (int j = i; j < len; j++) { String ts = String.valueOf(str.charAt(j)); if(lj.contains(ts)) { ljbds+=ts; }else{ bs=true; break; } } } if(bs)break; } String[] s = str.split(ljbds); d_left = new Double(calculate(s[0])); d_right = new Double(calculate(s[1])); if(" if(d_left}else if(">".equals(ljbds)) { if(d_left>d_right)return true; }else if("=".equals(ljbds)) { if(d_left==d_right)return true; }else if(">=".equals(ljbds)) { if(d_left>=d_right)return true; }else if(" |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |