文档章节

数学公式计算 结合 JavaBean

非著名程序员Bla
 非著名程序员Bla
发布于 2016/05/18 18:04
字数 646
阅读 9
收藏 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
合肥
后端工程师
私信 提问
JS数学公式表达--jsMath

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

匿名
2009/07/02
10.8K
2
理工科常用的学习工具

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

学术研究软件
2016/10/12
21
0
计算引擎--Jace.NET

Jace.NET 是 .NET 平台上的一个高性能计算引擎。可对包含在字符串中的数学公式进行计算并得出结果。 示例代码: Dictionary<string, double> variables = new Dictionary<string, double>();...

红薯
2013/09/06
1K
0
DSL 创建的深度神经网络--DeepLearning.scala

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

匿名
2016/11/30
492
0
Jace.NET 0.8.3 发布,高性能计算引擎

Jace.NET 0.8.3 发布了,修复了两个 bug,建议所有用户升级。 Jace.NET 是 .NET 平台上的一个高性能计算引擎。可对包含在字符串中的数学公式进行计算并得出结果。 示例代码:...

oschina
2013/09/06
2.3K
1

没有更多内容

加载失败,请刷新页面

加载更多

基于阿里云物联网平台实现的简易出入监控

本文通过一个简单实例,主要介绍了如何使用树莓派快速接入阿里云iot platform,并实现了一个简易的监控人员出入并拍照上送钉钉群的场景 场景 在公司大门入口处布点树莓派和红外感应,实现出入...

阿里云官方博客
6分钟前
0
0
基于阿里云物联网平台,我们这样实现简易出入监控

本文通过一个简单实例,主要介绍了如何使用树莓派快速接入阿里云iot platform,并实现了一个简易的监控人员出入并拍照上送钉钉群的场景 场景 在公司大门入口处布点树莓派和红外感应,实现出入...

阿里云云栖社区
10分钟前
1
0
fedora linux for 龙芯查看实时输出的tomcat日志

软件源带的tomcat版本较低,所以建议从官网下载最新版本。 解压后,执行./startup.sh文件。 查看实时输出的tomcat日志,请使用命令tail -f /usr/share/tomcat/logs/catalina.out。 “/usr/sh...

gugudu
12分钟前
0
0
为什么MySQL数据库要用B+树存储索引?

要回答好这个问题,首先我们要弄懂什么是索引?索引常见的数据结构有哪些?这些数据结构有何优缺点?只有弄懂这些,再去比较,才会知道为啥要用B+树作为MySQL数据库的存储索引了。 一、索引是...

Lienson
13分钟前
0
0
Java重点基础:反射机制

一、什么是反射? Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信...

一个程序员的成长
15分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部