文档章节

数学公式计算 结合 JavaBean

杨润康Bla
 杨润康Bla
发布于 2016/05/18 18:04
字数 646
阅读 6
收藏 0
点赞 2
评论 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
粉丝 14
博文 76
码字总数 0
作品 0
合肥
后端工程师
公式解析器开源项目整理

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

浩然一点 ⋅ 2014/03/07 ⋅ 0

理工科常用的学习工具

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

学术研究软件 ⋅ 2016/10/12 ⋅ 0

JS数学公式表达--jsMath

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

匿名 ⋅ 2009/07/02 ⋅ 2

DSL 创建的深度神经网络--DeepLearning.scala

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

匿名 ⋅ 2016/11/30 ⋅ 0

(JavaEE-09)JSP中的MVC与三层架构

JSP开发模式 SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式 JSP+JavaBean模式适合开发业务逻辑不太复杂的web应用...

_-Leon-_ ⋅ 2014/07/11 ⋅ 2

如何实现MathType公式编辑器中不等号的输入

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

MathType ⋅ 2015/10/08 ⋅ 1

推荐系统遇上深度学习(八)--AFM模型理论和实践

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

石晓文 ⋅ 05/05 ⋅ 0

数学老师装逼技巧,你绝对不会!

依稀记得,在小学到高中的学习生涯中,印象最深刻的就是数学老师了,总是觉得数学老师是最牛掰的,什么难题都能解,什么图都会画,好像就没有什么是能难倒他的。那么作为一名数学老师,你怎样...

学术研究软件 ⋅ 2016/04/25 ⋅ 0

CSS 文本截断知多少

文本截断是我们前端经常会碰到的需求,有些文本比较长,设计师往往会在有限的空间内限制字符数量,以确保界面的美观性,而且会在一些字符后面加上省略号来表示截断,这个时候我们往往会使用c...

lucefer ⋅ 2017/07/20 ⋅ 0

计算引擎--Jace.NET

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

红薯 ⋅ 2013/09/06 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

vbs 取文件大小 字节

dim namedim fs, s'name = Inputbox("姓名")'msgbox(name)set fs = wscript.createobject("scripting.filesystemobject") 'fs为FSO实例if (fs.folderexists("c:\temp"))......

vga ⋅ 6分钟前 ⋅ 0

高并发之Nginx的限流

首先Nginx的版本号有要求,最低为1.11.5 如果低于这个版本,在Nginx的配置中 upstream web_app { server 到达Ip1:端口 max_conns=10; server 到达Ip2:端口 max_conns=10; } server { listen ...

算法之名 ⋅ 今天 ⋅ 0

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部