Fire the simulation changed message when resumed so any background simulation executi...
[debian/openrocket] / core / src / net / sf / openrocket / util / ExpressionParser.java
1 package net.sf.openrocket.util;
2
3 import de.congrace.exp4j.Calculable;
4 import de.congrace.exp4j.ExpressionBuilder;
5 import de.congrace.exp4j.UnknownFunctionException;
6 import de.congrace.exp4j.UnparsableExpressionException;
7
8 public class ExpressionParser {
9         
10         
11         public double parse(String expression) throws InvalidExpressionException {
12                 try {
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);
24                 }
25         }
26         
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];
33                         }
34                         if ( chars[i] == '\u2044') {
35                                 chars[i] = '/';
36                         }
37                 }
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);
44                 }
45                 return exp;
46         }
47         
48 }