歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java實現四則運算表達式計算

Java實現四則運算表達式計算

日期:2017/3/1 10:10:40   编辑:Linux編程
  1. /**
  2. * 四則運算表達式計算
  3. * @author penli
  4. *
  5. */
  6. public class Arithmetic {
  7. public static void main(String args[]){
  8. System.out.println(arithmetic("2.2+((3+4)*2-22)/2*3.2"));
  9. }
  10. public static double arithmetic(String exp){
  11. String result = parseExp(exp).replaceAll("[\\[\\]]", "");
  12. return Double.parseDouble(result);
  13. }
  14. /**
  15. * 解析計算四則運算表達式,例:2+((3+4)*2-22)/2*3
  16. * @param expression
  17. * @return
  18. */
  19. public static String parseExp(String expression){
  20. //String numberReg="^((?!0)\\d+(\\.\\d+(?<!0))?)|(0\\.\\d+(?<!0))$";
  21. expression=expression.replaceAll("\\s+", "").replaceAll("^\\((.+)\\)$", "$1");
  22. String checkExp="\\d";
  23. String minExp="^((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))[\\+\\-\\*\\/]((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))$";
  24. //最小表達式計算
  25. if(expression.matches(minExp)){
  26. String result=calculate(expression);
  27. return Double.parseDouble(result)>=0?result:"["+result+"]";
  28. }
  29. //計算不帶括號的四則運算
  30. String noParentheses="^[^\\(\\)]+$";
  31. String priorOperatorExp="(((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))[\\*\\/]((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\])))";
  32. String operatorExp="(((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))[\\+\\-]((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\])))";
  33. if(expression.matches(noParentheses)){
  34. Pattern patt=Pattern.compile(priorOperatorExp);
  35. Matcher mat=patt.matcher(expression);
  36. if(mat.find()){
  37. String tempMinExp=mat.group();
  38. expression=expression.replaceFirst(priorOperatorExp, parseExp(tempMinExp));
  39. }else{
  40. patt=Pattern.compile(operatorExp);
  41. mat=patt.matcher(expression);
  42. if(mat.find()){
  43. String tempMinExp=mat.group();
  44. expression=expression.replaceFirst(operatorExp, parseExp(tempMinExp));
  45. }
  46. }
  47. return parseExp(expression);
  48. }
  49. //計算帶括號的四則運算
  50. String minParentheses="\\([^\\(\\)]+\\)";
  51. Pattern patt=Pattern.compile(minParentheses);
  52. Matcher mat=patt.matcher(expression);
  53. if(mat.find()){
  54. String tempMinExp=mat.group();
  55. expression=expression.replaceFirst(minParentheses, parseExp(tempMinExp));
  56. }
  57. return parseExp(expression);
  58. }
  59. /**
  60. * 計算最小單位四則運算表達式(兩個數字)
  61. * @param exp
  62. * @return
  63. */
  64. public static String calculate(String exp){
  65. exp=exp.replaceAll("[\\[\\]]", "");
  66. String number[]=exp.replaceFirst("(\\d)[\\+\\-\\*\\/]", "$1,").split(",");
  67. BigDecimal number1=new BigDecimal(number[0]);
  68. BigDecimal number2=new BigDecimal(number[1]);
  69. BigDecimal result=null;
  70. String operator=exp.replaceFirst("^.*\\d([\\+\\-\\*\\/]).+$", "$1");
  71. if("+".equals(operator)){
  72. result=number1.add(number2);
  73. }else if("-".equals(operator)){
  74. result=number1.subtract(number2);
  75. }else if("*".equals(operator)){
  76. result=number1.multiply(number2);
  77. }else if("/".equals(operator)){
  78. result=number1.divide(number2);
  79. }
  80. return result!=null?result.toString():null;
  81. }
  82. }
Copyright © Linux教程網 All Rights Reserved