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
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 }