首先创建package计算器,然后创建Calculate类和CalculatorUI类,运行CalculatorUI即可
计算类Calculate
使用堆栈实现优先级计算,传入式子,返回结果
// An highlighted block
package 计算器;
import java.util.List;
import java.util.Stack;
import java.util.ArrayList;
public class Calculate {
public static Double fun(Double n) {
Double sum=1.0;
for(int i=1;i<=n;i++)
sum*=i;
return sum;
}
public String cal(String str1) {
List<String> strlist = new ArrayList<>();
StringBuilder str2=new StringBuilder(str1);
str2.insert(0,"0");
String ss=""+str2;
char[] ar = ss.toCharArray();
int index;
for(int i=0;i<ss.length();i++) {
if(ar[i]=='(') {
index=i;
while(index<ss.length()) {
if(ar[index]=='-')
str2.insert(index,"0");
if(ar[index]==')')
break;
index++;
}
}
}
String str=""+str2;
char[] Arr = str.toCharArray();
StringBuffer bufstr = new StringBuffer();
for (int i=0;i<str.length();i++) {
if(Arr[i]=='.') {
bufstr.append(Arr[i]);
}
else if(Arr[i]>='0' && Arr[i]<='9') {
bufstr.append(Arr[i]);
}
else if(Arr[i]==' ') {
continue;
}
else if(Arr[i]=='+' || Arr[i]=='-' || Arr[i]=='*' || Arr[i]=='/' || Arr[i]=='(' || Arr[i]==')'|| Arr[i]=='^' || Arr[i]=='!') {
if (bufstr.length() > 0) {
strlist.add(bufstr.toString());
bufstr.setLength(0);
}
strlist.add(Arr[i] + "");
}
else if(Arr[i]=='t'&&Arr[i+1]=='a'&&Arr[i+2]=='n') {
i+=2;
strlist.add("tan");
}
else if(Arr[i]=='s'&&Arr[i+1]=='i'&&Arr[i+2]=='n') {
strlist.add("sin");
i+=2;
}
else if(Arr[i]=='c'&&Arr[i+1]=='o'&&Arr[i+2]=='s')
strlist.add("cos");
else if(Arr[i]=='l'&&Arr[i+1]=='n') {
strlist.add("ln");
i++;
}
else if(Arr[i]=='l'&&Arr[i+1]=='o'&&Arr[i+2]=='g') {
strlist.add("log");
i+=2;
}
}
if (bufstr.length()>0)
strlist.add(bufstr.toString());
List<String> strList = new ArrayList<>();
Stack<String> Stack = new Stack<>();
String dex;
for (String s : strlist) {
if (s.equals("(")) {
Stack.push(s);
}
else if (s.equals(")")) {
while (!(dex = Stack.pop()).equals("(")) {
strList.add(dex);
}
}
else if (s.equals("*") || s.equals("/")) {
while(!Stack.isEmpty()) {
dex=Stack.peek();
if (dex.equals("ln")||dex.equals("*") || dex.equals("/")||dex.equals("sin")||dex.equals("cos")||dex.equals("tan")||dex.equals("!")||dex.equals("^")) {
Stack.pop();
strList.add(dex);
}
else {
break;
}
}
Stack.push(s);
}
else if(s.equals("tan") || s.equals("sin") || s.equals("cos")) {
Stack.push(s);
}
else if(s.equals("ln")||s.equals("log")) {
Stack.push(s);
}
else if(s.equals("^")) {
while(!Stack.isEmpty()) {
dex=Stack.peek();
if (dex.equals("tan") || dex.equals("sin") || dex.equals("cos") ||dex.equals("!") ||dex.equals("^")||dex.equals("ln")) {
Stack.pop();
strList.add(dex);
}
else {
break;
}
}
Stack.push(s);
}
else if(s.equals("ln")){
Stack.push(s);
}
else if(s.equals("!")) {
while(!Stack.isEmpty()) {
dex=Stack.peek();
if (dex.equals("tan") || dex.equals("sin") || dex.equals("cos") ||dex.equals("!")) {
Stack.pop();
strList.add(dex);
}
else {
break;
}
}
Stack.push(s);
}
else if (s.equals("+") || s.equals("-")) {
while(!Stack.isEmpty()) {
dex = Stack.peek();
if (!dex.equals("(")) {
Stack.pop();
strList.add(dex);
}
else {
break;
}
}
Stack.push(s);
}
else {
strList.add(s);
}
}
while (!Stack.isEmpty())
strList.add(Stack.pop());
Stack<Double> newstack = new Stack<>();
for (String s : strList) {
if (s.equals("*") || s.equals("/") || s.equals("+") || s.equals("-") || s.equals("!") || s.equals("^") || s.equals("tan") ||s.equals("sin") ||s.equals("cos")||s.equals("ln")||s.equals("log") ) {
switch (s) {
case "-":{
Double left = newstack.pop();
Double right = newstack.pop();
newstack.push(right-left);
break;
}
case "+":{
Double left = newstack.pop();
Double right = newstack.pop();
newstack.push(right+left);
break;
}
case "*":{
Double left = newstack.pop();
Double right = newstack.pop();
newstack.push(right*left);
break;
}
case "tan":{
Double number = newstack.pop();
newstack.push(Math.tan(number));
break;
}
case "sin":{
Double number = newstack.pop();
newstack.push(Math.sin(number));
break;
}
case "cos":{
Double number = newstack.pop();
newstack.push(Math.cos(number));
break;
}
case "!":{
Double number = newstack.pop();
newstack.push(fun(number));
break;
}
case "^":{
Double left = newstack.pop();
Double right = newstack.pop();
newstack.push(Math.pow(right,left ));
break;
}
case "ln":{
Double number = newstack.pop();
newstack.push(Math.log(number)/Math.log(Math.E));
break;
}
case "log":{
Double left = newstack.pop();
Double right = newstack.pop();
newstack.push(Math.log(left)/Math.log(right));
break;
}
case "/":
Double left = newstack.pop();
Double right = newstack.pop();
if(left==0.0) {
System.out.println("ErrorDivided by zero ");
System.exit(0);
}
Double number=right/left;
newstack.push(number);
break;
}
}
else {
newstack.push(Double.valueOf(s));
}
}
Double number=newstack.pop();
String outcome= String.format("%.4f", number);
return outcome;
}
}
界面类CalculatorUI
// An highlighted block
package 计算器;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.Locale;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.DatePicker;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
public class CalculatorUI extends Application {
private Stage stage;
private DatePicker checkInDatePicker;
private DatePicker checkOutDatePicker;
private int index=0;
private Group g = new Group();
public static void main(String[] args) {
Locale.setDefault(Locale.US);
launch(args);
}
public void start(Stage stage) {
this.stage = stage;
this.stage.setWidth(565);
this.stage.setHeight(300);
this.stage.setResizable(false);
stage.setTitle("计算器 ");
计算();日历();
Scene scene =new Scene(g);
stage.setScene(scene);
stage.show();
}
private void 计算() {
TextArea ta = new TextArea(); // 创建文本域
ta.setPrefSize(280, 110);
ta.setWrapText(true);
ta.setStyle("-fx-text-fill:black");
ta.setStyle("-fx-font-family: 'SimHei';-fx-font-size: 20;");
g.getChildren().add(ta);
Calculate cal=new Calculate();
GridPane gridPane = new GridPane();
GridPane gridPane1 = new GridPane();
Button b0 = new Button("0");
b0.setPrefSize(140, 30);
b0.setLayoutX(0);
b0.setLayoutY(240);
Button b1 = new Button("1");
b1.setPrefSize(70, 30);
gridPane.add(b1, 0, 3);
Button b2 = new Button("2");
b2.setPrefSize(70, 30);
gridPane.add(b2, 1, 3);
Button b3 = new Button("3");
b3.setPrefSize(70, 30);
gridPane.add(b3, 2, 3);
Button b4 = new Button("4");
b4.setPrefSize(70, 30);
gridPane.add(b4, 0, 2);
Button b5 = new Button("5");
b5.setPrefSize(70, 30);
gridPane.add(b5, 1, 2);
Button b6 = new Button("6");
b6.setPrefSize(70, 30);
gridPane.add(b6, 2, 2);
Button b7 = new Button("7");
b7.setPrefSize(70, 30);
gridPane.add(b7, 0, 1);
Button b8 = new Button("8");
b8.setPrefSize(70, 30);
gridPane.add(b8, 1, 1);
Button b9 = new Button("9");
b9.setPrefSize(70, 30);
gridPane.add(b9, 2, 1);
Button badd = new Button("+");
badd.setPrefSize(70, 30);
gridPane.add(badd, 3, 3);
Button bsub = new Button("-");
bsub.setPrefSize(70, 30);
gridPane.add(bsub, 3, 2);
Button bmul = new Button("*");
bmul.setPrefSize(70, 30);
gridPane.add(bmul, 3, 1);
Button bdiv = new Button("/");
bdiv.setPrefSize(70, 30);
gridPane.add(bdiv, 3, 0);
Button bequ = new Button("=");
bequ.setPrefSize(70, 30);
bequ.setLayoutX(210);
bequ.setLayoutY(240);
Button bdel = new Button("X");
bdel.setPrefSize(70, 30);
gridPane.add(bdel, 2, 0);
Button bce = new Button("ce");
bce.setPrefSize(70, 30);
gridPane.add(bce, 0, 0);
Button bc = new Button("c");
bc.setPrefSize(70, 30);
gridPane.add(bc, 1, 0);
Button bspot = new Button(".");
bspot.setPrefSize(70, 30);
bspot.setLayoutX(140);
bspot.setLayoutY(240);
gridPane1.add(b0, 0, 0);
gridPane1.add(bspot, 1, 0);
gridPane1.add(bequ, 2, 0);
gridPane.setLayoutX(0);
gridPane.setLayoutY(120);
gridPane1.setLayoutX(0);
gridPane1.setLayoutY(240);
g.getChildren().addAll(gridPane,gridPane1);
gridPane.setGridLinesVisible(true);
gridPane1.setGridLinesVisible(true);
bspot.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
String s=bspot.getText();
String s1=ta.getText();
if(index==0) {
if(s1.length()==0)
ta.appendText("");
else if (Character.isDigit(s1.charAt(s1.length()-1)))
ta.appendText(s);
}
}
});
b0.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
String s=b0.getText();
if(index==0)
ta.appendText(s);
else {
index=0;
ta.setText("");
ta.appendText(s);
}
}
});
b1.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
String s=b1.getText();
ta.appendText(s);
}
});
b2.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
String s=b2.getText();
if(index==0)
ta.appendText(s);
else {
index=0;
ta.setText("");
ta.appendText(s);
}
}
});
b2.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
String s=b3.getText();
if(index==0)
ta.appendText(s);
else {
index=0;
ta.setText("");
ta.appendText(s);
}
}
});
b3.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
String s=b3.getText();
if(index==0)
ta.appendText(s);
else {
index=0;
ta.setText("");
ta.appendText(s);
}
}
});
b4.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
String s=b4.getText();
if(index==0)
ta.appendText(s);
else {
index=0;
ta.setText("");
ta.appendText(s);
}
}
});
b5.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
String s=b5.getText();
if(index==0)
ta.appendText(s);
else {
index=0;
ta.setText("");
ta.appendText(s);
}
}
});
b6.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
String s=b6.getText();
if(index==0)
ta.appendText(s);
else {
index=0;
ta.setText("");
ta.appendText(s);
}
}
});
b7.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
String s=b7.getText();
if(index==0)
ta.appendText(s);
else {
index=0;
ta.setText("");
ta.appendText(s);
}
}
});
b8.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
String s=b8.getText();
if(index==0)
ta.appendText(s);
else {
index=0;
ta.setText("");
ta.appendText(s);
}
}
});
b9.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
String s=b9.getText();
if(index==0)
ta.appendText(s);
else {
index=0;
ta.setText("");
ta.appendText(s);
}
}
});
badd.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
String s=badd.getText();
String s1=ta.getText();
if(index==0) {
if(s1.length()==0)
ta.appendText("");
else if (Character.isDigit(s1.charAt(s1.length()-1)))
ta.appendText(s);
}
if(index==1) {
int i=s1.length()-1;
while (s1.charAt(i)!='=') {
i--;
}
index=0;
String s2=ta.getText(i+2,s1.length())+badd.getText();
ta.setText(s2);
}
}
});
bsub.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
String s=bsub.getText();
String s1=ta.getText();
if(index==0) {
if(s1.length()==0)
ta.appendText("");
else if (Character.isDigit(s1.charAt(s1.length()-1)))
ta.appendText(s);
}
if(index==1) {
int i=s1.length()-1;
while (s1.charAt(i)!='=') {
i--;
}
index=0;
String s2=ta.getText(i+2,s1.length())+bsub.getText();
ta.setText(s2);
}
}
});
bmul.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
String s=bmul.getText();
String s1=ta.getText();
if(index==0) {
if(s1.length()==0)
ta.appendText("");
else if (Character.isDigit(s1.charAt(s1.length()-1)))
ta.appendText(s);
}
if(index==1) {
int i=s1.length()-1;
while (s1.charAt(i)!='=') {
i--;
}
index=0;
String s2=ta.getText(i+2,s1.length())+bmul.getText();
ta.setText(s2);
}
}
});
bdiv.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
String s=bdiv.getText();
String s1=ta.getText();
if(index==0) {
if(s1.length()==0)
ta.appendText("");
else if (Character.isDigit(s1.charAt(s1.length()-1)))
ta.appendText(s);
}
if(index==1) {
int i=s1.length()-1;
while (s1.charAt(i)!='=') {
i--;
}
index=0;
String s2=ta.getText(i+2,s1.length())+bdiv.getText();
ta.setText(s2);
}
}
});
bce.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
String s=ta.getText();int i;
char[] arry = s.toCharArray();
for( i=s.length()-1;i>=0;i--) {
if(arry[i]=='+'||arry[i]=='-'||arry[i]=='*'||arry[i]=='/') {
break;
}
}
if(index==0) {
if(i!=-1)
ta.deleteText(i+1,s.length());
else
ta.setText("");
}
}
});
bc.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
ta.setText("");
}
});
bdel.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
String s=ta.getText();
if(index==0) {
if(s.length()!=0)
ta.deleteText(s.length()-1,s.length());
}
}
});
bequ.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
String s=ta.getText();String s1=ta.getText();
if(s.length()!=0) {
if (Character.isDigit(s1.charAt(s1.length()-1))) {
if(index==0) {
String expression=ta.getText();
ta.appendText("\n=\n"+cal.cal(expression));
}
index=1;
}
}
}
});
}
private void 日历() {
checkInDatePicker = new DatePicker();
checkOutDatePicker = new DatePicker();
checkInDatePicker.setValue(LocalDate.now());
checkOutDatePicker.setValue(checkInDatePicker.getValue().plusDays(1));
TextField tfs=new TextField();
TextField tf=new TextField();
GridPane gridPane = new GridPane();
gridPane.setHgap(5);
gridPane.setVgap(5);
Label checkInlabe = new Label("计算两个日期之差");
checkInlabe.setStyle("-fx-font-family: 'SimHei';-fx-font-size: 16;");
gridPane.add(checkInlabe, 0, 0);
Label checkInlabel = new Label("从");
gridPane.add(checkInlabel, 0, 2);
gridPane.add(checkInDatePicker, 0, 3);
Label checkOutlabel = new Label("到");
gridPane.add(checkOutlabel, 0, 4);
gridPane.add(checkOutDatePicker, 0,5);
Label las = new Label("差(年、月、日、周、天)");
gridPane.add(las, 0,6);
tfs.setPrefSize(10, 30);
gridPane.add(tfs, 0,7);
Label la = new Label("差(天)");
gridPane.add(la, 0,8);
tf.setPrefSize(20, 30);
gridPane.add(tf, 0,9);
Button bcal=new Button("计算");
bcal.setPrefSize(70, 33);
gridPane.add(bcal, 0,11);
bcal.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
long years=Math.abs(ChronoUnit.YEARS.between(
checkInDatePicker.getValue(), checkOutDatePicker.getValue()
));
long months=Math.abs(ChronoUnit.MONTHS.between(
checkInDatePicker.getValue(), checkOutDatePicker.getValue()
));
long days = Math.abs(ChronoUnit.DAYS.between(
checkInDatePicker.getValue(), checkOutDatePicker.getValue()
));
long Months=months-12*years;
long Weeks=(days-months*30)/7;
long day=days-Weeks*7-Months*30;
String ss=""+years+"年,"+Months+"月,"+Weeks+"周,"+day+"天";
String s=""+days;
tfs.setText(ss);
tf.setText(s);
}
});
gridPane.setLayoutX(350);
gridPane.setLayoutY(0);
g.getChildren().add(gridPane);
}
}