java awt现实的简易计算器

说明:Arith数学运算类来源于网络,Calculator计算类是我自己编写的。

源代码:

package testAwtAndSwing;

import java.math.BigDecimal;

/**
 * @author 来源于网络
 *
 */
public class Arith {
    // 默认除法运算精度
    private static final int DEF_DIV_SCALE = 10;

    // 构造器私有化,让这个类不能实例化
    private Arith() {
    }

    /**
     * 精确的加法运算
     */
    public static double add(double v1, double v2) {
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.add(b2).doubleValue();
    }

    /**
     * 精确的减法运算
     */
    public static double sub(double v1, double v2) {
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.subtract(b2).doubleValue();
    }

    /**
     * 精确的乘法运算
     */
    public static double mul(double v1, double v2) {
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.multiply(b2).doubleValue();
    }

    /**
     * (相对)精确的除法运算,当发生除不尽的情况时,精确到小数点后10位的数字四舍五入
     */
    public static double div(double v1, double v2) {
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.divide(b2, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    public static void main(String[] args) {
        System.out.println("0.05 + 0.01 = " + Arith.add(0.05, 0.01));
        System.out.println("12 + 456 = " + Arith.add(12, 456));
        System.out.println("1.0 - 0.42 = " + Arith.sub(1.0, 0.42));
        System.out.println("4.015 × 100 = " + Arith.mul(4.015, 100));
        System.out.println("123.3 ÷ 2542355.323 = " + Arith.div(123.3, 2542355.323D));
        System.out.println("123.3 ÷ 2542355.323 = " + Arith.div(123.3, Double.parseDouble("2542355.323")));
    }
}

package testAwtAndSwing;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.regex.Pattern;

/**
 * -Dfile.encoding=gbk
 *
 */
public class Calculator {
    private Frame f = new Frame("简易计算器");
    private Panel textFieldPanel = new Panel();
    private Panel mainPanel = new Panel();
    private TextField tf = new TextField(30);
    /** 被操作数,与opNum2(操作数)进行数值计算 */
    private String opNum = null;
    /** 操作符:+ - × ÷ */
    private String op = null;
    private Pattern zeroPattern = Pattern.compile("0+");
    /** 背景颜色,非必须的属性 */
    private Color bgColor = new Color(204, 238, 208);

    public void init() {
        this.tf.setBackground(this.bgColor);
        this.tf.setEditable(false);
        this.textFieldPanel.add(this.tf);

        this.mainPanel.setLayout(new GridLayout(5, 4, 2, 4));
        this.mainPanel.setBackground(this.bgColor);
        String[] opNames = { "AC", "0", ".", "+", "7", "8", "9", "-", "4", "5", "6", "×", "1", "2", "3", "÷", "=" };
        Button[] btns = new Button[17];
        NumActionListener listener = new NumActionListener();
        for (int i = 0; i < opNames.length; i++) {
            btns[i] = new Button(opNames[i]);
            btns[i].addActionListener(listener);
            this.mainPanel.add(btns[i]);
        }

        this.f.add(this.textFieldPanel, BorderLayout.NORTH);
        this.f.add(this.mainPanel);
        this.f.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        this.f.setLocationRelativeTo(null);
        this.f.pack();
        this.f.setVisible(true);
    }

    class NumActionListener implements ActionListener {
        @SuppressWarnings("synthetic-access")
        @Override
        public void actionPerformed(ActionEvent e) {
            String cmd = e.getActionCommand();
            switch (cmd) {
            case "AC":
                Calculator.this.tf.setText("");
                Calculator.this.opNum = null;
                Calculator.this.op = null;
                break;
            case "+":
                setDataIfOpNumNotNull(cmd);
                break;
            case "-":
                setDataIfOpNumNotNull(cmd);
                break;
            case "×":
                setDataIfOpNumNotNull(cmd);
                break;
            case "÷":
                setDataIfOpNumNotNull(cmd);
                break;
            case "=":
                String opNum2 = Calculator.this.tf.getText();
                // 进行计算的两个数必须有值
                if (Calculator.this.op == null || "".equals(opNum2)) {
                    return;
                }
                // 除数不能为0
                if ("÷".equals(Calculator.this.op) && Double.parseDouble(opNum2) == 0) {
                    Calculator.this.tf.setText(Calculator.this.opNum);
                    Calculator.this.op = null;
                    return;
                }
                processResult(doCalculate(opNum2));
                break;
            default:
                String input = Calculator.this.tf.getText() + cmd;
                int point = input.indexOf('.');
                if (point == 0) {
                    input = "0.";
                    // 比如cmd=. input=18.11. 这样的数是不被允许的,直接返回
                } else if (point > 0) {
                    if (input.substring(point + 1).indexOf('.') > -1) {
                        return;
                    }
                }

                Calculator.this.tf.setText(input);
                if (Calculator.this.op == null) {
                    Calculator.this.opNum = Calculator.this.tf.getText();
                }
                break;
            }
        }

        @SuppressWarnings({ "synthetic-access", "incomplete-switch" })
        private double doCalculate(String opNum2) {
            double result = 0;
            switch (Calculator.this.op) {
            case "+":
                result = Arith.add(Double.parseDouble(Calculator.this.opNum), Double.parseDouble(opNum2));
                break;
            case "-":
                result = Arith.sub(Double.parseDouble(Calculator.this.opNum), Double.parseDouble(opNum2));
                break;
            case "×":
                result = Arith.mul(Double.parseDouble(Calculator.this.opNum), Double.parseDouble(opNum2));
                break;
            case "÷":
                result = Arith.div(Double.parseDouble(Calculator.this.opNum), Double.parseDouble(opNum2));
                break;
            }
            return result;
        }

        @SuppressWarnings("synthetic-access")
        private void setDataIfOpNumNotNull(String cmd) {
            if (Calculator.this.opNum != null) {
                Calculator.this.op = cmd;
                Calculator.this.tf.setText("");
            }
        }
    }

    /**
     * 处理结果:除去多余的0,将结果赋值到opNum,重置op,显示屏显示结果
     */
    private void processResult(double result) {
        String realResult = removeExtraZero(result);
        this.opNum = realResult;
        this.op = null;
        this.tf.setText(realResult);
    }

    /**
     * 传入:18.00,返回18;传入18.01,返回18.01
     */
    private String removeExtraZero(double num) {
        String result = String.valueOf(num);
        int point = result.indexOf('.');
        if (point > 0) {
            String substr = result.substring(point + 1);
            if (this.zeroPattern.matcher(substr).matches()) {
                return result.substring(0, point);
            }
        }
        return result;
    }

    public static void main(String[] args) {
        new Calculator().init();
    }
}

效果图:

简易计算器

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值