为了账号安全,请及时绑定邮箱和手机立即绑定

无论怎么点都不会崩的计算器

标签:
Android

最近常在慕课网看到有同学提问Android攻城狮的第一门课(入门篇)最后那个计算器的实现。所以我就抽空也写了一个计算器,不算完美,没有考虑精度丢失问题,也不支持连缀运算,但是代码思路清晰,并且无论怎么点都不会出bug。


public class MainActivity extends Activity implements OnClickListener {
    // 定义0-9十个数字Button
    private Button btn0...btn9;
    private Button btnPoint;   // .
    private Button btnPlus;    // + 
    private Button btnMinus;   // -
    private Button btnMultiply;// ×
    private Button btnDivide;  // ÷
    private Button btnEqual;   // =
    private Button btnClear;   // C, 清空显示屏
    private Button btnDel;     // Del, 删除一个数字或符号
    private EditText etScreen; // 计算器显示屏

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findView();
        setListener();
    }

    /** 找到View */
    private void findView() {
        btn0 = (Button) findViewById(R.id.btn0);
        // 省略其他按钮和EditText的findView代码
    }

    /** 设置监听 */
    private void setListener() {
        btn0.setOnClickListener(this);
        // 省略其他按钮的设置监听代码
    }

    @Override
    public void onClick(View v) {
        String str = etScreen.getText().toString();
        Button btn = (Button) v;
        switch (v.getId()) {
        case R.id.btnPlus:
        case R.id.btnMinus:
        case R.id.btnMultiply:
        case R.id.btnDivide:
            str += " "+btn.getText()+" ";
            break;
        case R.id.btnEqual:
            str = btnEqualEvent(str);
            break;
        case R.id.btnClear:
            str = "";
            break;
        case R.id.btnDel:
            str = btnDelEvent(str);
            break;
        case R.id.btnPoint:
            if (!str.endsWith("."))
                str += btn.getText();
            break;
        default:
            str += btn.getText();
        }
        etScreen.setText(str);
    }

    /** btnDel 按钮事件 */
    private String btnDelEvent(String str) {
        if (str!=null && !"".equals(str)) {
            if (str.endsWith(" ")) {
                str = str.substring(0, str.length()-3);
            } else {
                str = str.substring(0, str.length()-1);
            }
        }
        return str;
    }

    /** btnEqual 按钮事件 */
    private String btnEqualEvent(String str) {
        if (str==null  "".equals(str)  str.endsWith(" ")) return str;
        if (str.contains(" ")) {
            char operator;
            int startSpace = str.indexOf(" ");
            int endSpace = str.lastIndexOf(" ");
            if (startSpace == 0) return str;
            if (endSpace-startSpace > 2) {
                Toast.makeText(this, "不支持连缀运算", Toast.LENGTH_SHORT).show();
                return str;
            } else {
                operator = str.charAt(startSpace+1);
                double one = Double.parseDouble(str.substring(0, startSpace));
                double two = Double.parseDouble(str.substring(endSpace+1));
                double result = 0;
                int intResult = 0;
                switch (operator) {
                case '+':
                    result = one + two;
                    if (!str.contains(".")) {
                        intResult = (int) result;
                        str = intResult+"";
                    } else {
                        str = result+"";
                    }
                    break;
                case '-':
                    result = one - two;
                    if (!str.contains(".")) {
                        intResult = (int) result;
                        str = intResult+"";
                    } else {
                        str = result+"";
                    }
                    break;
                case 'x':
                    result = one * two;
                    if (!str.contains(".")) {
                        intResult = (int) result;
                        str = intResult+"";
                    } else {
                        str = result+"";
                    }
                    break;
                case '÷':
                    if (two != 0d) {
                        result = one / two;
                        intResult = (int) result;
                        if (!str.contains(".") && result%1==0) {
                            str = intResult+"";
                        } else {
                            str = result+"";
                        }
                    } else {
                        Toast.makeText(this, "除数不可为0!", Toast.LENGTH_SHORT).show();
                    }
                    break;
                }

            }
        }
        return str;
    }

}

布局文件在这里就省略了,请参考课程视频。

点击查看更多内容
25人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消