-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCalculatorController.java
146 lines (138 loc) · 5.55 KB
/
CalculatorController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
/* move calculator to different class with getter and setters */
public class CalculatorController {
@FXML
private TextField HistoryField;
@FXML
private TextField TextField;
private boolean isSolved;
private String usedOperator = null;
private boolean secondNumberFlag;
private double firstNumber = 0;
private boolean zeroException;
private static final String PROMPT = "0";
//Operands
private static final String DELETE = "Del";
private static final String CLEAN = "C";
private static final String MINUS = "-";
private static final String PLUS = "+";
private static final String EQUAL = "=";
private static final String POINT = ".";
private static final String DIVIDE = "/";
private static final String MULTIPLY = "*";
private static final String UNARY_MINUS = "+/-";
private static final String PERCENT = "%";
@FXML
void btnPress(ActionEvent event) {
if (zeroException){
firstNumber = 0;
TextField.setText(PROMPT);
HistoryField.setText("");
zeroException = false;
}
String btnText = ((Button) event.getSource()).getText();
String exerciseStr = TextField.getText();
switch (btnText) {
case CLEAN: /* clean all fields */
TextField.setText(PROMPT);
HistoryField.setText("");
usedOperator = null;
isSolved = false;
secondNumberFlag = false;
break;
case DELETE: /* remove last entered symbol */
if (isSolved){ /* if solved clean fields*/
HistoryField.setText("");
TextField.setText(PROMPT);
}
else{
if(!exerciseStr.equals(PROMPT)){
TextField.setText(exerciseStr.substring(0, exerciseStr.length() - 1));
}
if(exerciseStr.length()==1){
TextField.setText(PROMPT);
}
if(exerciseStr.length() == 2 && exerciseStr.startsWith("-"))
TextField.setText(PROMPT);
}
break;
case EQUAL:
try {
TextField.setText(String.format("%.2f", calculateAnswer(exerciseStr)));
HistoryField.setText(HistoryField.getText() + exerciseStr + EQUAL);
}
catch (ArithmeticException exception){
TextField.setText(exception.getMessage());
zeroException = true;
}
isSolved = true;
usedOperator = null;
secondNumberFlag = false;
break;
case PERCENT:
case MULTIPLY:
case DIVIDE:
case MINUS:
case PLUS:
operatorCommandHandler(exerciseStr, btnText);
break;
case UNARY_MINUS:
if (!exerciseStr.equals(PROMPT)) {
if(exerciseStr.startsWith(MINUS))
TextField.setText(exerciseStr.substring(1));
else
TextField.setText(MINUS + exerciseStr);
}
break;
case POINT:
if(!exerciseStr.contains(POINT)) /* if already contain do nothing */
TextField.setText(exerciseStr + btnText);
break;
default:
if(isSolved){ //if solved clean the fields
HistoryField.setText("");
exerciseStr = "";
isSolved = false;
} /* if the operator entered, it's start of second number */
if (usedOperator !=null && !secondNumberFlag)
{
exerciseStr = "";
secondNumberFlag = true;
} /* if first time entered, replace the prompt */
if(exerciseStr.equals(PROMPT))
{
exerciseStr = "";
}
TextField.setText(exerciseStr + btnText);
break;
}
}
private double calculateAnswer(String secondNumberAsString) {
double secondNumber = Double.parseDouble(secondNumberAsString);
if (usedOperator == null){
return secondNumber;
}
switch (usedOperator){
case MULTIPLY:
return firstNumber * secondNumber;
case DIVIDE:
if (secondNumber == 0)
throw new ArithmeticException("Can't divide by zero");
return firstNumber / secondNumber;
case PLUS:
return firstNumber + secondNumber;
case MINUS:
return firstNumber - secondNumber;
default:
return 0;
}
}
private void operatorCommandHandler(String numAsString, String operator) {
usedOperator = operator;
firstNumber = Double.parseDouble(numAsString);
HistoryField.setText(numAsString + operator);
}
}