akon1248

Parse And Calc

Jan 22nd, 2020
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.95 KB | None | 0 0
  1. private static double calc(String formula) {
  2.     if (formula.matches("(\\(*-?\\d+(\\.\\d+)?\\)*)|((\\(*-?\\d+(\\.\\d+)?\\)*([+\\-*x×⋅/÷%^]))+\\(*-?\\d+(\\.\\d+)?\\)*)")) {
  3.         if (!formula.contains("(") && !formula.contains(")")) {
  4.             if (formula.matches("-?\\d+(\\.\\d+)?")) {
  5.                 return Double.parseDouble(formula);
  6.             }
  7.             formula = formula.replaceAll("[x×⋅]", "*").replace("÷", "/");
  8.             ArrayList<String> numbers = new ArrayList<>();
  9.             ArrayList<String> operators = new ArrayList<>();
  10.             Matcher matcher = Pattern.compile("-?\\d+(\\.\\d+)?").matcher(formula);
  11.             int start = 0;
  12.             while (matcher.find(start)) {
  13.                 start = matcher.end();
  14.                 if (matcher.pattern().toString().equals("-?\\d+(\\.\\d+)?")) {
  15.                     numbers.add(matcher.group());
  16.                     matcher = Pattern.compile("[+\\-*x×⋅/÷%^]").matcher(formula);
  17.                 } else if (matcher.pattern().toString().equals("[+\\-*x×⋅/÷%^]")) {
  18.                     operators.add(matcher.group());
  19.                     matcher = Pattern.compile("-?\\d+(\\.\\d+)?").matcher(formula);
  20.                 }
  21.             }
  22.             if (operators.size() == numbers.size() - 1) {
  23.                 Iterator<String> iterator1 = numbers.iterator();
  24.                 Iterator<String> iterator2 = operators.iterator();
  25.                 ArrayList<String> elements = new ArrayList<>();
  26.                 while (iterator1.hasNext()) {
  27.                     elements.add(iterator1.next());
  28.                     if (iterator2.hasNext()) {
  29.                         elements.add(iterator2.next());
  30.                     }
  31.                 }
  32.                 try {
  33.                     while (elements.contains("^")) {
  34.                         for (int i = 0; i < elements.size(); i++) {
  35.                             if (elements.get(i).equals("^")) {
  36.                                 elements.set(i, Double.toString(Math.pow(Double.parseDouble(elements.get(i - 1)), Double.parseDouble(elements.get(i + 1)))));
  37.                                 elements.remove(i + 1);
  38.                                 elements.remove(i - 1);
  39.                             }
  40.                         }
  41.                     }
  42.                     while (elements.contains("*") || elements.contains("/") || elements.contains("%")) {
  43.                         for (int i = 0; i < elements.size(); i++) {
  44.                             if (elements.get(i).equals("*")) {
  45.                                 elements.set(i, Double.toString(Double.parseDouble(elements.get(i - 1)) * Double.parseDouble(elements.get(i + 1))));
  46.                                 elements.remove(i + 1);
  47.                                 elements.remove(i - 1);
  48.                             } else if (elements.get(i).equals("/")) {
  49.                                 elements.set(i, Double.toString(Double.parseDouble(elements.get(i - 1)) / Double.parseDouble(elements.get(i + 1))));
  50.                                 elements.remove(i + 1);
  51.                                 elements.remove(i - 1);
  52.                             } else if (elements.get(i).equals("%")) {
  53.                                 elements.set(i, Double.toString(Double.parseDouble(elements.get(i - 1)) % Double.parseDouble(elements.get(i + 1))));
  54.                                 elements.remove(i + 1);
  55.                                 elements.remove(i - 1);
  56.                             }
  57.                         }
  58.                     }
  59.                     while (elements.contains("+") || elements.contains("-")) {
  60.                         for (int i = 0; i < elements.size(); i++) {
  61.                             if (elements.get(i).equals("+")) {
  62.                                 elements.set(i, Double.toString(Double.parseDouble(elements.get(i - 1)) + Double.parseDouble(elements.get(i + 1))));
  63.                                 elements.remove(i + 1);
  64.                                 elements.remove(i - 1);
  65.                             } else if (elements.get(i).equals("-")) {
  66.                                 elements.set(i, Double.toString(Double.parseDouble(elements.get(i - 1)) - Double.parseDouble(elements.get(i + 1))));
  67.                                 elements.remove(i + 1);
  68.                                 elements.remove(i - 1);
  69.                             }
  70.                         }
  71.                     }
  72.                     if (elements.size() == 1) {
  73.                         return Double.parseDouble(elements.get(0));
  74.                     }
  75.                 } catch (NumberFormatException ignored) {}
  76.             }
  77.         } else {
  78.             while (formula.contains("(") || formula.contains(")")) {
  79.                 ArrayList<Integer> openingBrackets = new ArrayList<>();
  80.                 ArrayList<Integer> closeBrackets = new ArrayList<>();
  81.                 int firstOpeningBracket = -1;
  82.                 while ((firstOpeningBracket = formula.indexOf("(", firstOpeningBracket + 1)) != -1) {
  83.                     openingBrackets.add(firstOpeningBracket);
  84.                 }
  85.                 int firstCloseBracket = -1;
  86.                 while ((firstCloseBracket = formula.indexOf(")", firstCloseBracket + 1)) != -1) {
  87.                     closeBrackets.add(firstCloseBracket);
  88.                 }
  89.                 if (openingBrackets.size() == closeBrackets.size()) {
  90.                     int insideCloseBracket = Collections.min(closeBrackets);
  91.                     int insideOpeningBracket = Collections.max(openingBrackets, (i1, i2) -> {
  92.                         if (i1 > insideCloseBracket && i2 < insideCloseBracket) {
  93.                             return i2 - i1;
  94.                         } else {
  95.                             return i1 - i2;
  96.                         }
  97.                     });
  98.                     ArrayList<Character> chars = new ArrayList<>();
  99.                     formula.chars().mapToObj((i) -> (char) i).forEach(chars::add);
  100.                     chars.subList(insideOpeningBracket, insideCloseBracket + 1).clear();
  101.                     ArrayList<Character> answerChars = new ArrayList<>();
  102.                     Double.toString(calc(formula.substring(insideOpeningBracket + 1, insideCloseBracket))).chars().mapToObj((i) -> (char) i).forEach(answerChars::add);
  103.                     Collections.reverse(answerChars);
  104.                     answerChars.forEach((character) -> chars.add(insideOpeningBracket, character));
  105.                     StringBuilder sb = new StringBuilder();
  106.                     chars.forEach(sb::append);
  107.                     formula = sb.toString();
  108.                 } else {
  109.                     return 0;
  110.                 }
  111.             }
  112.             return calc(formula);
  113.         }
  114.     }
  115.     return 0;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment