package com.numix.calculator; public class EquationFormatter { public static final char PLACEHOLDER = '\u200B'; public static final char POWER = '^'; public static final char PLUS = '+'; public static final char MINUS = '\u2212'; public static final char MUL = '\u00d7'; public static final char DIV = '\u00f7'; public static final char EQUAL = '='; public static final char LEFT_PAREN = '('; public static final char RIGHT_PAREN = ')'; public String appendParenthesis(String input) { final StringBuilder formattedInput = new StringBuilder(input); int unclosedParen = 0; for(int i = 0; i < formattedInput.length(); i++) { if(formattedInput.charAt(i) == LEFT_PAREN) unclosedParen++; else if(formattedInput.charAt(i) == RIGHT_PAREN) unclosedParen--; } for(int i = 0; i < unclosedParen; i++) { formattedInput.append(RIGHT_PAREN); } return formattedInput.toString(); } public String insertSupscripts(String input) { final StringBuilder formattedInput = new StringBuilder(); int sub_open = 0; int sub_closed = 0; int paren_open = 0; int paren_closed = 0; for(int i = 0; i < input.length(); i++) { char c = input.charAt(i); if(c == POWER) { formattedInput.append("<sup>"); if(sub_open == 0) formattedInput.append("<small>"); sub_open++; if(i + 1 == input.length()) { formattedInput.append(c); if(sub_closed == 0) formattedInput.append("</small>"); formattedInput.append("</sup>"); sub_closed++; } else { formattedInput.append(PLACEHOLDER); } continue; } if(sub_open > sub_closed) { if(paren_open == paren_closed) { // Decide when to break the <sup> started by ^ if(c == PLUS // 2^3+1 || (c == MINUS && input.charAt(i - 1) != POWER) // 2^3-1 || c == MUL // 2^3*1 || c == DIV // 2^3/1 || c == EQUAL // X^3=1 || (c == LEFT_PAREN && (Character.isDigit(input.charAt(i - 1)) || input.charAt(i - 1) == RIGHT_PAREN)) // 2^3(1) // or // 2^(3-1)(0) || (Character.isDigit(c) && input.charAt(i - 1) == RIGHT_PAREN) // 2^(3)1 || (!Character.isDigit(c) && Character.isDigit(input.charAt(i - 1))) && c != '.') { // 2^3log(1) while(sub_open > sub_closed) { if(sub_closed == 0) formattedInput.append("</small>"); formattedInput.append("</sup>"); sub_closed++; } sub_open = 0; sub_closed = 0; paren_open = 0; paren_closed = 0; if(c == LEFT_PAREN) { paren_open--; } else if(c == RIGHT_PAREN) { paren_closed--; } } } if(c == LEFT_PAREN) { paren_open++; } else if(c == RIGHT_PAREN) { paren_closed++; } } formattedInput.append(c); } while(sub_open > sub_closed) { if(sub_closed == 0) formattedInput.append("</small>"); formattedInput.append("</sup>"); sub_closed++; } return formattedInput.toString(); } }