数学公式计算 结合 JavaBean
2016-05-18 00:00
507 查看
先上测试代码:
public static void main(String[] args) throws Exception { //实际操作对象 money, count, people, cat Think think = new Think(); think.setMoney("2640"); think.setCount("50"); think.setPeople("25"); think.setCat("1"); //用户输入的公式 String exp = "((money+count)*people/100)+50-88+cat*10"; //644.5 //调用方法 Object result = MathFormulaUtil.getResultAdvanced(think, exp); //打印结果 System.out.println(result); }
Think实体类:
public class Think { private String money; private String count; private String people; private String cat; public String getMoney() { return money; } public void setMoney(String money) { this.money = money; } public String getCount() { return count; } public void setCount(String count) { this.count = count; } public String getPeople() { return people; } public void setPeople(String people) { this.people = people; } public Think(String money, String count, String people, String cat) { super(); this.money = money; this.count = count; this.people = people; this.cat = cat; } public Think() { super(); } public String getCat() { return cat; } public void setCat(String cat) { this.cat = cat; } }
程序源码:
/* 说明: 源码中需要jep-java-3.4-trial.jar包,该包从官网 http://www.singularsys.com/jep/ 下载 */
public class MathFormulaUtil { /** * GET 新技能 * @param obj 目标对象 里面封装了数据 * @param exp 表达式 * @return 计算结果 * @throws Exception 异常 */ @SuppressWarnings({"rawtypes"}) public static Object getResultAdvanced(Object obj,String exp) throws Exception{ Object result = null; //算术结果 try { //核心对象 Jep jep = new Jep(); //获取目标对象的 属性名 和 属性值组成的Map对象,然后Map对象组成List List fieldsLists = getFiledsInfo(obj); //循环一次取出 List 中的 Map 中的 key - value for (Object listObj : fieldsLists) { //获取属性名称 String fieldName = String.valueOf(((Map) listObj).get("name")); //获取属性的值 Object fieldValue = getFieldValueByName(fieldName, obj); if(fieldValue != null && !fieldValue.toStrin 3ff0 g().isEmpty()){ //保证非空 //添加变量 动态赋值 jep.addVariable(fieldName, Double.parseDouble(String.valueOf(fieldValue))); } } //解析 jep.parse(exp); //计算结果 result = jep.evaluate(); } catch (Exception e) { System.err.println("表达式中所含的字段 在实体类中没有赋予相应的值"); } //返回结果 return result; } /** * 根据属性名获取属性值 * @param fieldName 变量名 * @param o 对象 * @throws Exception 异常 * * @author 杨润康 * */ private static Object getFieldValueByName(String fieldName, Object o) throws Exception { //构造get方法名 String getter = "get" + firstAlpUpCase(fieldName); //获取方法 Method method = o.getClass().getMethod(getter, new Class[] {}); //取值 Object value = method.invoke(o, new Object[] {}); return value; } /** * 获取 属性名(name),属性值(value)的map组成的list * @param 目标对象 * @return 封装了 属性-值 的Map 组成的 List 集合 * @throws Exception 异常 * * @author 杨润康 * */ @SuppressWarnings({ "unused", "rawtypes", "unchecked" }) private static List getFiledsInfo(Object o) throws Exception{ //获取定义的变量 Field[] fields=o.getClass().getDeclaredFields(); //变量名数组 String[] fieldNames=new String[fields.length]; List list = new ArrayList(); Map infoMap=null; for(int i=0;i<fields.length;i++){ infoMap = new HashMap(); //获取变量名 infoMap.put("name", fields[i].getName()); //变量名对应的值 infoMap.put("value", getFieldValueByName(fields[i].getName(), o)); //存入集合 list.add(infoMap); } return list; } /** * 字符串首字母大写 * @param nodeName 节点名称 * @return 首字母大写的字符串 * * @author 杨润康 */ public static String firstAlpUpCase(String nodeName) { String s = nodeName.substring(0,1); Pattern p = Pattern.compile("[a-z]"); Matcher m = p.matcher(s); if(m.matches()){ char[] cs=nodeName.toCharArray(); cs[0]-=32; return String.valueOf(cs); } return nodeName; } }
相关文章推荐
- 使用Java为图片添加水印
- Java处理数学公式得出结果
- 【java】Date、String、Calendar类型之间的转化
- Java ClassLoader原理
- dao设计模式
- javaBean
- 内置对象
- springmvc-json小案例
- java创建线程的三种方式(学习笔记)
- 使用POI分割纯文本Excel文件 支持XLSX\XLS
- java服务端模拟form传送文件
- spring捡漏
- Js编码和Java后台解码
- eclipse搭建springMVC项目发现的问题
- 最全面的使用idea和gradle把java项目打包成jar的方法
- java 文件zip打包
- JAVA HashSet简单代码示例
- JAVA Map简单代码示例
- java 电话归属地
- java,过滤html标签