好东西分享之计算公式解析与四则运算.doc_第1页
好东西分享之计算公式解析与四则运算.doc_第2页
好东西分享之计算公式解析与四则运算.doc_第3页
好东西分享之计算公式解析与四则运算.doc_第4页
好东西分享之计算公式解析与四则运算.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JAVA公式解析与四则运算第1章 公式解析与四则运算源码package com.citicpru.clm.ruleengine.util;/* * Title: 公式解析类 * Description: 实现对包含“()、max、min”的表达式进行简单的四则运算。 * Copyright: Copyright (c) 2004 * Company: * author leasion * version 1.0 */import java.lang.reflect.Method;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class FormulaParser public static List lc = new ArrayList();/ 定义运算符public static List lj = new ArrayList();/ 定义逻辑运算符public static Map funMap = new HashMap();private String formula;static lc.add(+);lc.add();lc.add(*);lc.add(/);lj.add();lj.add();lj.add(=);lj.add(!);/ int数组注释,第一个标识:0自带函数 1自定义函数;第二个标识:参数个数/ 自带函数,可利用反射机制funMap.put(abs, new int 0, 1 );funMap.put(acos, new int 0, 1 );funMap.put(asin, new int 0, 1 );funMap.put(atan, new int 0, 1 );funMap.put(cbrt, new int 0, 1 );funMap.put(ceil, new int 0, 1 );funMap.put(cos, new int 0, 1 );funMap.put(cosh, new int 0, 1 );funMap.put(exp, new int 0, 1 );funMap.put(expm1, new int 0, 1 );funMap.put(floor, new int 0, 1 );funMap.put(log, new int 0, 1 );funMap.put(log10, new int 0, 1 );funMap.put(log1p, new int 0, 1 );funMap.put(random, new int 0, 1 );funMap.put(rint, new int 0, 1 );funMap.put(round, new int 0, 1 );funMap.put(signum, new int 0, 1 );funMap.put(sin, new int 0, 1 );funMap.put(sinh, new int 0, 1 );funMap.put(sqrt, new int 0, 1 );funMap.put(tan, new int 0, 1 );funMap.put(tanh, new int 0, 1 );funMap.put(max, new int 0, 2 );funMap.put(min, new int 0, 2 );/ 自定义函数funMap.put(if, new int 1, 3 );funMap.put(mod, new int 1, 2 );funMap.put(int, new int 1, 1 );public FormulaParser(String str) this.formula = str;/* * 公式初始化转换 * * param str * return */public static String strCast(String str) str = str.toLowerCase();/ 去除空格,变小写if (str = null ? true : str.length() = 0)return 0;if (!checkFormula(str)return 0;str = str.replaceAll(*-, *);str = str.replaceAll(-*, *);str = str.replaceAll(/-, /);str = str.replaceAll(-/, /);str = str.replaceAll(+-, -);str = str.replaceAll(-+, -);str = str.replaceAll(-, );str = str.replaceAll(*, *-);str = str.replaceAll(/, /-);str = str.replaceAll( , );return str;/* * 检查公式中括号出现次数是否正确 * * param formulaStr * return */public static boolean checkFormula(String formulaStr) boolean flag = true;int count = 0;for (int i = 0; i formulaStr.length(); i+) String s = String.valueOf(formulaStr.charAt(i);if (.equals(s)count+;else if ().equals(s)count-;flag = count = 0;return flag;/* * 分割函数 * * param str * param bs * return */public static String spliteFun(String str, String bs) List list = new ArrayList();String bds = ;int bracket = 0;int len = str.length();for (int i = 0; i len; i+) String s = String.valueOf(str.charAt(i);if (.equals(s) bracket+; else if ().equals(s) bracket-;if (bracket = 0 & bs.equals(s) list.add(bds);bds = ;continue;bds += s;list.add(bds);String ss = new Stringlist.size();for (int i = 0; i list.size(); i+) ssi = (String) list.get(i);return ss;/* * 用户自定义函数 * * param str * param funStr * return */public static String customFun(String str, String funStr) String reval = 0;String gss = spliteFun(str, ,);if (if.equals(funStr) if (compare(gss0) reval = calculate(gss1); else reval = calculate(gss2); else if (mod.equals(funStr) double d2 = new Double(calculate(gss1).doubleValue();if (d2 = 0)return reval;double d1 = new Double(calculate(gss0).doubleValue();reval = (d1 % d2) + ; else if (int.equals(funStr) reval = Math.floor(new Double(calculate(gss0).doubleValue()+ ;return reval;/* * 逻辑表达式判断 * * param str * return */public static boolean compare(String str) boolean flag = false;boolean bs = false;int len = str.length();int bracket = 0;String ljbds = ;double d_left = 0;double d_right = 0;for (int i = 0; i len; i+) String s = String.valueOf(str.charAt(i);if (.equals(s) bracket+; else if ().equals(s) bracket-;if (bracket = 0 & lj.contains(s) for (int j = i; j len; j+) String ts = String.valueOf(str.charAt(j);if (lj.contains(ts) ljbds += ts; else bs = true;break;if (bs)break;String s = str.split(ljbds);d_left = new Double(calculate(s0).doubleValue();d_right = new Double(calculate(s1).doubleValue();if (.equals(ljbds) if (d_left .equals(ljbds) if (d_left d_right)return true; else if (=.equals(ljbds) if (d_left = d_right)return true; else if (=.equals(ljbds) if (d_left = d_right)return true; else if (=.equals(ljbds) if (d_left = d_right)return true; else if (.equals(ljbds) | !=.equals(ljbds) if (d_left != d_right)return true;return flag;/* * 递归调用运算 * * param str * return */public static String calculate(String str) String reval = ;String bds = ;int bracket = 0;/ 对应括号个数int pos = 0;boolean title = false;if (str.substring(0, 1).equals() str = str.substring(1);title = true;int len = str.length();for (int i = 0; i len; i+) String s = String.valueOf(str.charAt(i);pos = i;bracket = 0;if (!lc.contains(s) / 如果没遇到运算符if (.equals(s) / 如果遇到左括号if (funMap.containsKey(bds) / 如果左括号前是函数for (int j = i + 1; j len; j+) / 从左括号后开始循环pos+;/ 累计移动字符位数String ts = String.valueOf(str.charAt(j);/ 单个字符/ reval+=ts;if (.equals(ts)/ 如果是左括号累计bracket+;else if ().equals(ts) / 如果是右括号进行减少bracket-;if (bracket = -1) / 如果是-1,标识括号结束reval = reval.substring(0, reval.length()- bds.length();/ 重新获得去掉函数头的表达式reval += funCalculate(str.substring(i + 1,j), bds);/ 表达式加上函数结果,形成新表达式i = pos;/ 计数器增加bds = ;/ 函数头清空break;/ 退出本次循环 else / 如果是普通运算for (int j = i + 1; j len; j+) pos+;String ts = String.valueOf(str.charAt(j);if (.equals(ts)bracket+;else if ().equals(ts) bracket-;if (bracket = -1) reval += calculate(str.substring(i + 1, pos);i = pos;bds = ;break; else / 累加总表达式和最后一个运算数(或函数)bds += s;reval += s; else / 遇到运算符最后一个运算数(或函数)清空bds = ;reval += s;if (title)reval = - + reval;return szys(reval);/* * 函数运算 * * param gs * param flag * return */public static String funCalculate(String gs, String funStr) String rval = 0;if (funMap.containsKey(funStr) int csi = (int) funMap.get(funStr);try if (csi0 = 0) / java内部函数,通过反射调用Class cs = new Classcsi1;Object objs = new Objectcsi1;String gss = zlcs(gs);for (int i = 0; i csi1; i+) csi = double.class;objsi = new Double(calculate(gssi);Class cls = Class.forName(java.lang.Math);Method m = cls.getMethod(funStr, cs);rval = String.valueOf(m.invoke(cls, objs); else if (csi0 = 1) / 自定义函数rval = customFun(gs, funStr); catch (Exception e) return rval;/ 公式里的参数分割public static String zlcs(String str) int len = str.length();boolean flag = true;String tstr = ;for (int i = 0; i len; i+) String s = String.valueOf(str.charAt(i);if (.equals(s) flag = false; else if ().equals(s) flag = true;if (flag & ,.equals(s) tstr += ; else tstr += s;return tstr.split();/* * 四则运算表达式处理 * * param str * return */public static String szys(String gs) gs = gs + +0; / 因为下面的计算是遇到符号才进行,所以多加入一个计算符号,不影响值.String c1 = ;/ 第一个运算符号String c2 = ;/ 第二个运算符号String s1 = ;/ 第一个运算数String s2 = ;/ 第二个运算数String s3 = ;/ 第三个运算数int len = gs.length();for (int i = 0; i 0 & c1.length() 0 & c2.length() = 0) / 如果第一个数,第一个运算符已保存,第二个运算符未保存,保存第二哥数s2 += s; else if (c1.length() = 0) / 如果没有运算符,保存第一个数s1 += s; else if (s1.length() 0 & s2.length() 0 & c1.length() 0& c2.length() 0) / 如果第一二个数和运算符都有,保存第三个数s3 += s;return s1;/* * 基本四则运算 * * param c1 * 运算数1 * param s1 * 运算符(加减乘除) * param c2 * 运算数2 * return */public static String _4zys(String c1, String s1, String c2) String reval = 0;try double ln = Double.valueOf(c1).doubleValue();double rn = Double.valueOf(c2).doubleValue();if (+.equals(s1) return (ln + rn) + ; else if (.equals(s1) return (ln - rn) + ; else if (*.equals(s1) return (ln * rn) + ; else if (/.equals(s1) if (rn = 0)return reval;elsereturn (ln / rn) + ; catch (Exception e) finally return reval;public double getResult() return new Double(calculate(strCast(this.formula).doubleValue();/* * param args */public static void main(String args) / String gs =/ if(4 3,if( ( 2 - 1 ) / ( 0.0001 ) * 3 3 , ( 2 - ( 2 - 1 ) / ( 0.0001 ) * 3 ) * 0.8 ,0), ( 2 + ( 3 - 2 ) / ( 0.0001 ) *1 ) * 1);/ / 进行四则运算获得结果/ System.out.println(szys(strCast(3-4*-5+5);/ / 函数运算结果/ System.out.println(calculate(strCast(3+abs(mod(4,if(23,1,3)-abs(2*4)*5+5);/ / System.out.println(calculate(strCast(if(0.0*2=10.0,0,10.0-0.0*2);/ / System.out.println(calculate(strCast(if(02,(10.0-0*5)*0.8,0);/ / System.out.println(calculate(strCast(gs);System.out.println(calculate(strCast(60.0 / (-100.0) * 50000.0);第2章 计算公式解析运算import java.math.BigDecimal;import java.util.HashMap;import java.util.Map;import java.util.Map.Entry;public class test001 /* * 计算公式解析运算 * author xrxianga * date 2014-8-26 上午06:08:16 */public static void main(String args) throws ExceptionString str = A*B;System.out.println(计算公式:+str);Map map = new HashMap();map.put(A, 11);map.put(B, -22);map.put(C, 33);map.put(D, 44);for(Entry entry:map.entrySet()String val = entry.getValue().toString();if(Double.valueOf(val)0)val = ;str = str.replaceAll(entry.getKey(), val);System.out.println(计算步骤:+str);String a = doReplace(str);/执行计算if(a.startsWith()a = a.substring(1, a.length()-1);System.out.println(计算结果:+a);private static String doReplace(String str)throws ExceptionString src = ,q=,h=;boolean a1 = false;for(int i=0;istr.length();i+)String str1 = str.substring(i, i+1);boolean flag = str1.matches(a-zA-Z0-9(*/-);if(flag)if(.equals(str1)if(a1)q += (;q += src;src = ;a1 = true;continue;else if().equals(str1)h = str.substring(q+src).length()+2,str.length();break;src += str1;if(!.equals(src)src = doCalculate(src);src = q+src+h;if(src.contains()src = doReplace(src);if(!.equals(src)src = doCalculate(src);return src;private static String doCalculate(String str)throws Exceptionif(str.contains(*)/乘str = doCalculate(str, *, /, +, -);if(str.contains(/)/除str = doCalculate(str, /, *, +, -);if(str.contains(-)/减if(doFlag(str)str = doCalculate(str, -, *, /, +);if(str.contains(+)/加str = doCalculate(str, +, *, /, -);return str;private static boolean doFlag(String str)throws ExceptionString a = 0;for(int i=0;istr.length();i+)String val = str.substring(i,i+1);boolean flag = val.matches(a-zA-Z0-9(*/-);if(flag)if(.equals(val)a = 0;continue;if(0.equals(a)&-.equals(val)a = 2;break;if(2.equals(a)return true;return false;private static String doCalculate(String str,String one,String two,String three,String four)throws ExceptionString src = ,q=,h=,g=0;BigDecimal db01 = null;BigDecimal db02 = null;boolean flg01 = false;for(int i=0;istr.length();i+)String val = str.substring(i,i+1);boolean flag = val.matches(a-zA-Z0-9(*/-);if(flag)if(.equals(val)g = 2;if(i+1)=str.length()if(null!=db01)db02 = new BigDecimal(src);h += ;h = str.substring(h.length(), str.length();break;elsereturn str;continue;if(1.equals(g)src += val;continue;if(flg01)if(+.equals(val)|-.equals(val)|/.equals(val)|*.equals(val)db02 = new BigDecimal(src);if(2.equals(g)src = ;g = 0;h += src;h = str.substring(h.length(), str.length();break;else if(i+1)=str.length()src += val;db02 = new BigD

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论