java解析字符串中的四则运算工具类

<font size="3">import java.text.DecimalFormat;  
import java.text.NumberFormat;  
import java.text.SimpleDateFormat;  
import java.util.regex.Matcher;  
import java.util.regex.Pattern; 

public class ReportUtil {

    /** 
     * 格式化日期 
     * @param obj 日期对象 
     * @param format 格式化字符串 
     * @return 
     */  
    public static String formatDate(Object obj, String format) {  
        if (obj == null)  
            return "";  
  
        String s = String.valueOf(obj);  
        if (format == null || "".equals(format.trim())) {  
            format = "yyyy-MM-dd";  
        }  
        try {  
            SimpleDateFormat dateFormat = new SimpleDateFormat(format);  
            s = dateFormat.format(obj);  
        } catch (Exception e) {  
        }  
        return s;  
    }  
  
    /** 
     * 格式化数字 
     * @param obj 数字对象 
     * @param format 格式化字符串 
     * @return 
     */  
    public static String formatNumber(Object obj, String format) {  
        if (obj == null)  
            return "";  
  
        String s = String.valueOf(obj);  
        if (format == null || "".equals(format.trim())) {  
            format = "#.00";  
        }  
        try {  
            if (obj instanceof Double || obj instanceof Float) {  
                if (format.contains("%")) {  
                    NumberFormat numberFormat = NumberFormat.getPercentInstance();  
                    s = numberFormat.format(obj);  
                } else {  
                    DecimalFormat decimalFormat = new DecimalFormat(format);  
                    s = decimalFormat.format(obj);  
                }  
            } else {  
                NumberFormat numberFormat = NumberFormat.getInstance();  
                s = numberFormat.format(obj);  
            }  
        } catch (Exception e) {  
        }  
        return s;  
    }  
  
    /** 
     * 计算字符串四则运算表达式 
     * @param string 
     * @return 
     */  
    public static String computeString(String string) {  
        String regexCheck = "[\\(\\)\\d\\+\\-\\*/\\.]*";// 是否是合法的表达式  
  
        if (!Pattern.matches(regexCheck, string))  
            return string;  
  
        Matcher matcher = null;  
        String temp = "";  
        int index = -1;  
        String regex = "\\([\\d\\.\\+\\-\\*/]+\\)";// 提取括号表达式  
        string = string.replaceAll("\\s", "");// 去除空格  
        try {  
            Pattern pattern = Pattern.compile(regex);  
            // 循环计算所有括号里的表达式  
            while (pattern.matcher(string).find()) {  
                matcher = pattern.matcher(string);  
                while (matcher.find()) {  
                    temp = matcher.group();  
                    index = string.indexOf(temp);  
                    string = string.substring(0, index)  
                            + computeStirngNoBracket(temp)  
                            + string.substring(index + temp.length());  
                }  
            }  
            // 最后计算总的表达式结果  
            string = computeStirngNoBracket(string);  
        } catch (NumberFormatException e) {  
            return e.getMessage();  
        }  
        return string;  
    }  
  
    /** 
     * 计算不包含括号的表达式 
     * @param string 
     * @return 
     */  
    private static String computeStirngNoBracket(String string) {  
        string = string.replaceAll("(^\\()|(\\)$)", "");  
        String regexMultiAndDivision = "[\\d\\.]+(\\*|\\/)[\\d\\.]+";  
        String regexAdditionAndSubtraction = "(^\\-)?[\\d\\.]+(\\+|\\-)[\\d\\.]+";  
  
        String temp = "";  
        int index = -1;  
  
        // 解析乘除法  
        Pattern pattern = Pattern.compile(regexMultiAndDivision);  
        Matcher matcher = null;  
        while (pattern.matcher(string).find()) {  
            matcher = pattern.matcher(string);  
            if (matcher.find()) {  
                temp = matcher.group();  
                index = string.indexOf(temp);  
                string = string.substring(0, index) + doMultiAndDivision(temp)  
                        + string.substring(index + temp.length());  
            }  
        }  
  
        // 解析加减法  
        pattern = Pattern.compile(regexAdditionAndSubtraction);  
        while (pattern.matcher(string).find()) {  
            matcher = pattern.matcher(string);  
            if (matcher.find()) {  
                temp = matcher.group();  
                index = string.indexOf(temp);  
                if (temp.startsWith("-")) {  
                    string = string.substring(0, index)  
                            + doNegativeOperation(temp)  
                            + string.substring(index + temp.length());  
                } else {  
                    string = string.substring(0, index)  
                            + doAdditionAndSubtraction(temp)  
                            + string.substring(index + temp.length());  
                }  
            }  
        }  
  
        return string;  
    }  
  
    /** 
     * 执行乘除法 
     * @param string 
     * @return 
     */  
    private static String doMultiAndDivision(String string) {  
        String value = "";  
        double d1 = 0;  
        double d2 = 0;  
        String[] temp = null;  
        if (string.contains("*")) {  
            temp = string.split("\\*");  
        } else {  
            temp = string.split("/");  
        }  
  
        if (temp.length < 2)  
            return string;  
  
        d1 = Double.valueOf(temp[0]);  
        d2 = Double.valueOf(temp[1]);  
        if (string.contains("*")) {  
            value = String.valueOf(d1 * d2);  
        } else {  
            value = String.valueOf(d1 / d2);  
        }  
  
        return value;  
    }  
  
    /** 
     * 执行加减法 
     * @param string 
     * @return 
     */  
    private static String doAdditionAndSubtraction(String string) {  
        double d1 = 0;  
        double d2 = 0;  
        String[] temp = null;  
        String value = "";  
        if (string.contains("+")) {  
            temp = string.split("\\+");  
        } else {  
            temp = string.split("\\-");  
        }  
  
        if (temp.length < 2)  
            return string;  
  
        d1 = Double.valueOf(temp[0]);  
        d2 = Double.valueOf(temp[1]);  
        if (string.contains("+")) {  
            value = String.valueOf(d1 + d2);  
        } else {  
            value = String.valueOf(d1 - d2);  
        }  
  
        return value;  
    }  
  
    /** 
     * 执行负数运算 
     * @param string 
     * @return 
     */  
    private static String doNegativeOperation(String string) {  
        String temp = string.substring(1);  
        if (temp.contains("+")) {  
            temp = temp.replace("+", "-");  
        } else {  
            temp = temp.replace("-", "+");  
        }  
        temp = doAdditionAndSubtraction(temp);  
        if (temp.startsWith("-")) {  
            temp = temp.substring(1);  
        } else {  
            temp = "-" + temp;  
        }  
        return temp;  
    }  
  
    public static void main(String[] args) {  
        String s = "1-7+8*2";  
        s = computeString(s);  
        System.out.println((int)Double.parseDouble(s));  
    }  

}</font>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值