1 package net.sf.openrocket.util;
3 import de.congrace.exp4j.Calculable;
4 import de.congrace.exp4j.ExpressionBuilder;
5 import de.congrace.exp4j.UnknownFunctionException;
6 import de.congrace.exp4j.UnparsableExpressionException;
8 public class ExpressionParser {
11 public double parse(String expression) throws InvalidExpressionException {
13 ExpressionBuilder builder = new ExpressionBuilder(modify(expression));
14 Calculable calc = builder.build();
15 return calc.calculate();
16 } catch (java.lang.NumberFormatException e) {
17 throw new InvalidExpressionException("Invalid expression: " + expression, e);
18 } catch (UnknownFunctionException e) {
19 throw new InvalidExpressionException("Invalid expression: " + expression, e);
20 } catch (UnparsableExpressionException e) {
21 throw new InvalidExpressionException("Invalid expression: " + expression, e);
22 } catch (java.util.EmptyStackException e) {
23 throw new InvalidExpressionException("Invalid expression: " + expression, e);
27 private String modify(String exp) throws InvalidExpressionException {
28 char[] chars = exp.toCharArray();
29 for( int i = 0; i< chars.length; i++ ) {
30 int value = Character.getNumericValue(chars[i]);
31 if ( value >= 0 && value < 10 ) {
32 chars[i] = Character.toChars(48 + value)[0];
34 if ( chars[i] == '\u2044') {
38 exp = String.copyValueOf(chars);
39 exp = exp.replaceAll("(\\d+)\\s+(\\d+)\\s*/\\s*(\\d+)", "($1+$2/$3)");
40 exp = exp.replace(',', '.');
41 // Disallow spaces between numbers - default is to remove spaces!
42 if (exp.matches(".*[0-9.]\\s+[0-9.].*")) {
43 throw new InvalidExpressionException("Invalid expression: " + exp);