文档章节

数学公式计算 结合 JavaBean

非著名程序员Bla
 非著名程序员Bla
发布于 2016/05/18 18:04
字数 646
阅读 103
收藏 0

精选30+云产品,助力企业轻松上云!>>>

先上测试代码:
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;
     }

}
非著名程序员Bla
粉丝 15
博文 75
码字总数 0
作品 0
合肥
后端工程师
私信 提问
加载中
请先登录后再评论。
公式解析器开源项目整理

前段日子师兄让我整理开源的公式解析器项目,我到网上查了两天,对大部分有人维护的开源项目进行了整理和总结:现在记在此处。 开源项目名称 描述 缺点 Jeval 在运行时解析计算静态和动态表达...

浩然一点
2014/03/07
970
0
BitmapMesh变形特效

一、效果图 二、核心代码 三、总结 drawBitmapMesh方法做特效的核心思想是对Bitmap作无限切割,形成无限个小方格,然后依据我们想要的效果结合一定的数学公式重 新计算各个切割顶点的布局,d...

西贝雪
2016/06/30
5
0
ECMAScript的操作符之《赋值操作符》

ECMAScript 赋值运算符,简单的赋值运算符由等号(=)实现,只是把等号右边的值赋予等号左边的变量。 算术运算以及复合赋值运算符: 1、乘法/赋值(=) 2、除法/赋值(/=) 3、取模/赋值(%...

专注的阿熊
2019/09/20
10
0
Jupyter Notebook(推荐使用Anaconda安装)

一、Jupyter Notebook介绍 1、简介 Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。 简而言之,Jupyter Notebook是以网...

osc_otkk1ufm
2019/02/15
14
0
Lucas定理 、斯特灵公式

斯特灵公式是一条用来取n阶乘的近似值的数学公式。 公式为: 用该公式我们可以用来估算n阶乘的值;估算n阶乘的在任意进制下的位数。 如何计算在R进制下的位数:我们可以结合对数来计算,比如...

osc_e4gzv47r
2018/02/09
2
0

没有更多内容

加载失败,请刷新页面

加载更多

App Builder 2020中文版

教程: 1、断开网络连接,下载解压,运行对应操作系统App Builder 2020安装包; 2、在弹出的窗口中勾选同意条款协议,点击【Next】; 3、创建桌面快捷方式,点击【Next】; 4、一切准备就绪,...

osc_62a7f5bj
6分钟前
19
0
蚂蚁金服轻量级类隔离框架 Maven 打包插件解析 | SOFAArk 源码解析

SOFAStack(Scalable Open Financial Architecture Stack)是蚂蚁金服自主研发的金融级云原生架构,包含了构建金融级云原生架构所需的各个组件,是在金融场景里锤炼出来的最佳实践。 本文为《...

SOFAStack
03/19
0
0
Java 高级 面试题 及 参考答案

一、面试题基础总结 1、 JVM结构原理、GC工作机制详解 答:具体参照:JVM结构、GC工作机制详解 ,说到GC,记住两点:1、GC是负责回收所有无任何引用对象的内存空间。 注意:垃圾回收回收的是无...

osc_np3y0rbq
7分钟前
10
0
面试准备季——MyBatis 面试专题(含答案)

写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下! GitHub地址:https://github.com/abel-max/Java-Study-...

osc_1ipdqsf2
9分钟前
8
0
Redis 高频面试题:10w+QPS 的 Redis 真的只是因为单线程和基于内存?

你以为 Redis 这么快仅仅因为单线程和基于内存? 那么你想得太少了,我个人认为 Redis 的快是基于多方面的:不但是单线程和内存,还有底层的数据结构设计,网络通信的设计,主从、哨兵和集群...

osc_qgfjs4a5
9分钟前
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部