设为首页 加入收藏

TOP

Java高精度四则运算(无括号限制)(二)
2015-11-10 13:44:50 来源: 作者: 【 】 浏览:18
Tags:Java 高精度 四则 运算 括号 限制
static BigDecimal getBasicArithmeticValue(String str, java.util.Map values) {
? ? ? ? str = multiReg(str, values);
? ? ? ? str = divReg(str, values);
? ? ? ? java.util.List signs = getPlusReduceSign(str);//获取符号
? ? ? ? java.util.List valuesign = getValueSign(str);//替换符号
? ? ? ? BigDecimal v = getValue(valuesign, signs, values);
? ? ? ? return v;
? ? }
?
? ? /**
? ? * 获取结果
? ? *
? ? * @param valuesign 值替换符号
? ? * @param signs 符号
? ? * @param values 值存储表
? ? * @return
? ? */
? ? private static BigDecimal getValue(java.util.List valuesign, java.util.List signs, java.util.Map values) {
? ? ? ? BigDecimal value = values.get(valuesign.get(0));
? ? ? ? for (int i = 0; i < signs.size(); i++) {
? ? ? ? ? ? if (signs.get(i)) {
? ? ? ? ? ? ? ? value = value.add(values.get(valuesign.get(i + 1)));
? ? ? ? ? ? ? ? //value += values.get(valuesign.get(i + 1));
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? value = value.subtract(values.get(valuesign.get(i + 1)));
? ? ? ? ? ? ? ? //value -= values.get(valuesign.get(i + 1));
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return value;
? ? }
?
? ? /**
? ? * 获取替换的符号
? ? *
? ? * @param str 待匹配的字符串
? ? * @return 返回 替换的值符号
? ? */
? ? private static java.util.List getValueSign(String str) {
? ? ? ? java.util.List list = new java.util.ArrayList();
? ? ? ? Pattern patt = Pattern.compile("([a-zA-Z0-9]*{1})", Pattern.DOTALL);
? ? ? ? Matcher mat = patt.matcher(str);
? ? ? ? while (mat.find()) {
? ? ? ? ? ? if (mat.group(1).trim().equals("")) {
? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? }
? ? ? ? ? ? list.add(mat.group(1));
? ? ? ? }
? ? ? ? return list;
? ? }
?
? ? /**
? ? * 获取加减符号
? ? *
? ? * @param str 待匹配的字符串
? ? * @return 返回 符号顺序,加号为true,减号为false
? ? */
? ? private static java.util.List getPlusReduceSign(String str) {
? ? ? ? java.util.List list = new java.util.ArrayList();
? ? ? ? Pattern patt = Pattern.compile("([a-zA-Z0-9]*{1}([+|-])[a-zA-Z0-9]*{1})", Pattern.DOTALL);
? ? ? ? Matcher mat = patt.matcher(str);
? ? ? ? while (mat.find()) {
? ? ? ? ? ? if (mat.group(2).trim().equals("+")) {
? ? ? ? ? ? ? ? list.add(true);
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? list.add(false);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return list;
? ? }
?
? ? /**
? ? * 乘法的正则
? ? *
? ? * @param str 运算表达式字符串
? ? * @param values 值存储表
? ? * @return 返回重构后的字符串
? ? */
? ? private static String multiReg(String str, java.util.Map values) {
? ? ? ? Pattern patt = Pattern.compile("([a-zA-Z0-9]*{1}\\*[a-zA-Z0-9]*{1})", Pattern.DOTALL);
? ? ? ? Matcher mat = patt.matcher(str);
? ? ? ? while (mat.find()) {
? ? ? ? ? ? str = excMultiplication(str, mat.group(1), values);
? ? ? ? }
? ? ? ? return str;
? ? }
?
? ? /**
? ? * 除法的正则
? ? *
? ? * @param str 运算表达式字符串
? ? * @param values 值存储表
? ? * @return 返回重构后的字符串
? ? */
? ? private static String divReg(String str, java.util.Map values) {
? ? ? ? Pattern patt = Pattern.compile("([a-zA-Z0-9]*{1}\\/[a-zA-Z0-9]*{1})", Pattern.DOTALL);
? ? ? ? Matcher mat = patt.matcher(str);
? ? ? ? while (mat.find()) {
? ? ? ? ? ? str = excDivsion(str, mat.group(1), values);
? ? ? ? }
? ? ? ? return str;
? ? }
?
? ? /**
? ? * 计算乘法
? ? *
? ? * @param str 全部的运算字符串
? ? * @param value 计算乘法的字符串
? ? * @param map 值存储表
? ? * @return 返回重构后的字符串
? ? */
? ? private static String excMultiplication(String str, String value, java.util.Map map) {
? ? ? ? String vs[] = value.split("\\*");
? ? ? ? BigDecimal v1 = map.get(vs[0]);
? ? ? ? BigDecimal v2 = map.get(vs[1]);
? ? ? ? BigDecimal x = v1.multiply(v2);
? ? ? ? map.remove(vs[0]);
? ? ? ? map.remove(vs[1]);
? ? ? ? String uuid = getUUID();
? ? ? ? map.put(uuid, x);
? ? ? ? str = str.replace(value, uuid);
? ? ? ? return str;
? ? }
?
? ? /**
? ? * 计算出发
? ? *
? ? * @param str 全部的运算字符串
? ? * @param value 计算乘法的字符串
? ? * @param map 值存储表
? ? * @return 返回重构后的字符串
? ? */
? ? private static String excDivsion(String str, String value, java.util.Map map) {
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Oracle 发布 Java 模块系统状态报.. 下一篇Python实现控制台中的进度条

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: