View Javadoc

1   package fr.ove.openmath.jome.model.evaluation;
2   
3   public final class Evaluator {
4       public static String evaluate(String operand1, String operand2, String anOperator) {
5           String oper1 = removeBrackets(operand1);
6           String oper2 = removeBrackets(operand2);
7           
8           double result;
9           
10          if (anOperator.equals("+")) {
11              if (isNumber(oper1) && isNumber(oper2))
12                  return cutDecimal((Double.valueOf(oper1)).doubleValue() + (Double.valueOf(oper2)).doubleValue());
13              else
14                  // Si la seconde opÈrande est un -, alors il ne faudra pas insÈrer le + entre les 2
15                  anOperator = (oper2.charAt(0) == '-') ? "" : anOperator;
16          }
17          else if (anOperator.equals("-")) {
18              if (isNumber(oper1) && isNumber(oper2))
19                  return cutDecimal((Double.valueOf(oper1)).doubleValue() - (Double.valueOf(oper2)).doubleValue());
20          }
21          else if (anOperator.equals("*")) {
22              if (isNumber(oper1) && isNumber(oper2))
23                  return cutDecimal((Double.valueOf(oper1)).doubleValue() * (Double.valueOf(oper2)).doubleValue());
24          }
25          else if (anOperator.equals("/")) {
26              if (isNumber(oper1) && isNumber(oper2))
27                  return cutDecimal((Double.valueOf(oper1)).doubleValue() / (Double.valueOf(oper2)).doubleValue());
28          }
29          else if (anOperator.equals("^")) {
30              if (isNumber(oper1) && isNumber(oper2))
31                  return cutDecimal(Math.pow((Double.valueOf(oper1)).doubleValue(), (Double.valueOf(oper2)).doubleValue()));
32          }
33              
34          return operand1 + anOperator + operand2;
35      }
36      
37      public static String evaluate(String function, String argument) {
38          function = function.toLowerCase();
39          
40          argument = removeBrackets(argument);
41          
42          if (function.equals("sin")) {
43              if (isNumber(argument))
44                  return cutDecimal(Math.sin((Double.valueOf(argument)).doubleValue()));
45          }
46          if (function.equals("arcsin")) {
47              if (isNumber(argument))
48                  return cutDecimal(Math.asin((Double.valueOf(argument)).doubleValue()));
49          }
50          if (function.equals("cos")) {
51              if (isNumber(argument))
52                  return cutDecimal(Math.cos((Double.valueOf(argument)).doubleValue()));
53          }
54          if (function.equals("arccos")) {
55              if (isNumber(argument))
56                  return cutDecimal(Math.acos((Double.valueOf(argument)).doubleValue()));
57          }
58          if (function.equals("tan")) {
59              if (isNumber(argument))
60                  return cutDecimal(Math.tan((Double.valueOf(argument)).doubleValue()));
61          }
62          if (function.equals("arctan")) {
63              if (isNumber(argument))
64                  return cutDecimal(Math.atan((Double.valueOf(argument)).doubleValue()));
65          }
66          if (function.equals("sqrt")) {
67              if (isNumber(argument))
68                  return cutDecimal(Math.sqrt((Double.valueOf(argument)).doubleValue()));
69          }
70              
71          return function + "(" + argument + ")";
72      }
73      
74      public static int type(String argument) {
75  
76          argument = removeBrackets(argument);
77          
78          if (isNumber(argument))
79              return 0;
80          else
81              return 1;
82      }
83      
84      /***
85      * Analyzes a token and determines whether it is a number or not.<BR>
86      *
87      * @param token the token to analyze.
88      * @return <CODE>true</CODE> if the token is a number. <CODE>false</CODE> otherwise.
89      */
90      private static boolean isNumber(String token) {
91          char oneChar;
92          
93          token = removeBrackets(token);
94          
95          for (int i = 0; i < token.length(); i++) {
96              oneChar = token.charAt(i);
97              
98              if (!Character.isDigit(oneChar) && (oneChar != '.'))
99                  if (!((i == 0) && (oneChar == '-')))
100                     return false;
101         }
102         return true;
103     }
104     
105     /***
106     *
107     */
108     private static String removeBrackets(String token) {
109         if ((token.charAt(0) == '(') && (token.charAt(token.length() - 1) == ')'))
110             return token.substring(1, token.length() - 1);
111         else
112             return token;
113     }
114     
115     /***
116     *
117     */
118     private static String cutDecimal(double value) {
119         if ((value - Math.floor(value)) < 10e-5)
120             return "" + (int) Math.floor(value);
121         else
122             return "" + value;
123     }
124 }