package com.calculator; import javax.script.ScriptEngineManager; import java.io.PrintStream; public class Calculator1 { /** * , . ? * @param expression */ private static void calc(String expression) { try { System.out.println(new ScriptEngineManager().getEngineByName("JavaScript").eval(expression)); } catch (Exception ex) { try (PrintStream stream = (System.out.append("Nan"))) {} } } public static void main(String[] args) { calc("+5 + -12"); calc("+5 * -12"); calc("+5 - -12"); calc("+5 / -12"); } }
package com.calculator; import java.io.PrintStream; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Calculator2 { /** * , * @param expression * @param args , */ private static void calc(String expression, Object ... args) { try { // 1. System.out.println( // 2. BigDecimal.class.getMethod( Arrays.asList("multiply", "add", "subtract", "divide").get( ((args = new Matcher[] { Pattern.compile( // 3. . , <b> </b>, . "[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?\\s*([+-\\\\*/])\\s*[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?$") .matcher(expression)})) != null && ((Matcher) args[0]).find() ? // 4. 42: '*', 43: '+', 45: '-', 47: '/' - 0, 1, 2, 3 ((int) ((Matcher) args[0]).group(1).charAt(0) - 41) / 2 : -1), // 5. BigDecimal.class, MathContext.class).invoke( // 6. new BigDecimal(((args = new Matcher[] { Pattern.compile("([+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?)").matcher(expression)})) != null && ((Matcher) args[0]).find() ? ((Matcher) args[0]).group(0) : ""), // 7. new BigDecimal(((args = new Matcher[] { Pattern.compile("[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?\\s*[+-\\\\*/]\\s*([+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?)$") .matcher(expression)})) != null && ((Matcher) args[0]) .find() ? ((Matcher) args[0]).group(1) : ""), new MathContext(10, RoundingMode.HALF_EVEN))); } catch (Exception ex) { /** */ try (PrintStream stream = (System.out.append("Nan"))) {} } } public static void main(String[] args) { calc("+5 + -12"); calc("+5 * -12"); calc("+5 - -12"); calc("+5 / -12"); } }
package com.calculator; import java.io.PrintStream; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Calculator3 { /** * , , . * @param expression * @param args , */ private static void calc(String expression, Object ... args) { try { // 1. System.out.println( // 2. BigDecimal.class.getMethod( Arrays.asList("multiply", "add", "subtract", "divide").get( // 3. args (Integer) (args = new Object[] {args = new Object[] { Pattern.compile("([+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?)\\s*([+-\\\\*/])\\s*([+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?)$"). matcher(expression)}, args[0], ((Matcher) args[0]).find(), ((Matcher) args[0]).group(1), ((int) ((Matcher) args[0]).group(2).charAt(0) -41) / 2, ((Matcher) args[0]).group(3)})[4]), // 4. BigDecimal.class, MathContext.class).invoke( // 5. new BigDecimal(args[3].toString()), // 6. new BigDecimal(args[5].toString()), new MathContext(10, RoundingMode.HALF_EVEN))); } catch (Exception ex) { /** */ try (PrintStream stream = (System.out.append("Nan"))) {} } } public static void main(String[] args) { calc("+5 + -12"); calc("+5 * -12"); calc("+5 - -12"); calc("+5 / -12"); } }
Source: https://habr.com/ru/post/320830/
All Articles