文档章节

数学公式计算 结合 JavaBean

杨润康Bla
 杨润康Bla
发布于 2016/05/18 18:04
字数 646
阅读 8
收藏 0
先上测试代码:
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.toString().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;
     }

}

本文转载自:http://blog.csdn.net/yangrunkangbla/article/details/50231973

共有 人打赏支持
杨润康Bla
粉丝 15
博文 75
码字总数 0
作品 0
合肥
后端工程师
理工科常用的学习工具

理科学习中要是有一些工具能够帮助我们,那我们的学习生活将会有如神助!学习效率将会大大提高!有了这些学习工具,数学物理化学这些个老大难的问题,都可以被我们攻克了。下面罗列了一些学习...

学术研究软件
2016/10/12
21
0
JS数学公式表达--jsMath

JsMath 是一种在网页中显示数学公式的方法,通过解析 TeX 代码,结合 JavaScript 和 CSS 以及 unicode 字体 来显示数学公式,支持多浏览器和平台,无需 MathML 支持。...

匿名
2009/07/02
10.8K
2
DSL 创建的深度神经网络--DeepLearning.scala

DeepLearning.scala 是一个 DSL 创建的深度神经网络,Scala 语言编写。利用 DeepLearning.scala,普通程序员能够从简单的代码构建复杂的神经网络。 你可以像往常一样编写代码,唯一的区别是基...

匿名
2016/11/30
492
0
如何实现MathType公式编辑器中不等号的输入

在我们平时使用MathType数学公式编辑器编辑公式时会有很多符号的输入,除了平常的四则运算符号之外还会有很多数学符号,比如不等号就是使用次数相对较多的一种。那么在MathType当中关于不等号...

MathType
2015/10/08
165
1
推荐系统遇上深度学习(八)--AFM模型理论和实践

推荐系统遇上深度学习系列: 推荐系统遇上深度学习(一)--FM模型理论和实践:https://www.jianshu.com/p/152ae633fb00 推荐系统遇上深度学习(二)--FFM模型理论和实践:https://www.jianshu.co...

石晓文
05/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

python生成HTML报告

# -*- coding=utf-8 -*-# author=zyqimport timeclass Template(object): '''html报告''' HTML_TEMP=''' <!DOCTYPE html> <html lang="en"> <head......

小白兔_球球
18分钟前
1
0
模型融合资料汇总

https://blog.csdn.net/u012526003/article/details/79109418https://blog.csdn.net/willduan1/article/details/73618677https://blog.csdn.net/wstcjf/article/details/77989963?utm_so......

KYO4321
20分钟前
1
0
热更步骤

根据官方文档: http://docs.cocos.com/creator/manual/zh/advanced-topics/hot-update.html version_generator.js文件放到项目根目录下 注意步骤的顺序: 1.构建 2.根据构建目录运行下面命令...

Valiancer
21分钟前
2
0
小程序重写CheckBox样式

CheckBox /* 重写 checkbox 样式 *//* 未选中的 背景样式 */checkbox .wx-checkbox-input{ border-radius: 50%; width: 40rpx; height: 40rpx;}/* 选中后的 背景样式...

originDu
25分钟前
1
0
mysql自动安装脚本

[root@localhost_04 ~]# cat mysql.sh #!/bin/bash# "################检查本机安装mysql的基本条件########################"echo "Checking  user :"d=`id -u`if [ $d ......

芬野de博客
38分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部