吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3171|回复: 6
收起左侧

[其他转载] 简易计算器

[复制链接]
忧伤_ 发表于 2020-4-12 01:36
本帖最后由 忧伤_ 于 2020-4-12 11:20 编辑

1.png
响应老师的提议,初学安卓想看到效果,加上感觉可以做出来,就动手了,然而,你老师还是你老师 bug数量极其恐怖!
2.png
布局思路
布局采用表格布局,放两个文本框用于显示
3.png
代码思路
通过为每一个按钮设置监听器,当点击按钮时,对应按钮的值会以字符串的形式追加到文本框中,通过setText()方法设置文本框的内容,getText().toString()的方法获取到文本框的内容,值得一提的是,setText()的参数似乎只能传字符串类型的值,反正不能直接设置数字
接下来就是如何计算的问题了
我的思路是,计算嘛,也就是两个数之间的事情,这两个数都有一个共同的特点,那就是都在运算符的前面或后面,而我们的整条式子是一个字符产,也就是说,我们可以通过字符串的方法indexOf()来找到运算符的下标,再通过subString()方法来截取出两段字符串从而来进行操作

        public static boolean getSymbol(String str, String S) {
                int num = str.indexOf(S);
                if (num == -1) {
                        return false;
                } else {
                        return true;
                }
        }

        // getValue 根据下标截取除两个整数或小数 传入字符串进行截取
        public static int getVal(String val) {
                int index;
                if (getSymbol(val, "+")) {
                        index = val.indexOf('+');
                }else if (getSymbol(val, "*")) {
                        index = val.indexOf('*');
                } else if (getSymbol(val, "/")) {
                        index = val.indexOf('/');
                } else if (getSymbol(val, "%")) {
                        index = val.indexOf('%');
                }else if (getSymbol(val, "-")) {
                        index = val.indexOf('-');
                } else {
                        index = -1;
                }
                //需要注意的是减号的判断需要放在其他运算符的后面,不然在做负数运算的时候可能不会得到你想要的效果(惨痛的教训)
                String val11;
                String val22;
                int len = val.length();
                // 没找到,获取整个字符串
                if (index == -1) {
                        val11 = val.substring(0, len);
                        val22 = val.substring(0, len);
                } else {
                        val11 = val.substring(0, index);
                        val22 = val.substring(index + 1);
                }
                if (index == -1) {
                        val22 = val11;
                }
                // 字符串转整数运算
                int val1 = Integer.valueOf(val11);
                int val2 = Integer.valueOf(val22);
                /// 匹配运算结果
                if (getSymbol(val, "+")) {
                        return val1 + val2;
                } else if (getSymbol(val, "*")) {
                        return val1 * val2;
                } else if (getSymbol(val, "/")) {
                        return val1 / val2;
                } else if (getSymbol(val, "%")) {
                        return val1 % val2;
                } else if (getSymbol(val, "-")) {
                        return val1 - val2;
                } else {
                        return val1;
                }
        }

上面的代码已经可以运算了,但其程序的健壮性肯定是不够的,比较难处理的是减号和小数点,上面的程序是处理一个符号两个数的,当进行两个负数的时候,最多会有三个符号的处理,对于我来说是很难处理的

try {
                        if(value.length() > 0) {
                            int len = value.length();
                                                        //防止减号后面还可以输入减号
                            if ((value.charAt(len - 1)) == '-') {
                                return;
                            }
                        }
                                                //防止输入1+2-3的格式,三个数的实在不想处理了(没能力) 一个多小时才搞定这里,过程极其痛苦
                        if(value.length() > 0) {
                                                        //getDot方法是返回运算符号加减乘除出现的位置下标
                                                        //这里求的是符号的位置到字符串的差值 例如1+2 此时字符串长度为3,+号下标为1,也就是说加号到末尾这段距离有东西了,你就不能输入减号了
                                                        //这是为了 可以加负数的一个操作 1 + -1
                                                         //字符串长度-运算符号的下标>1,不让你输入
                            int e = value.length() - getDot(value);
                            if (getDot(value) != -1) {
                                if (e > 1) {
                                    return;
                                }
                            }
                        }
                                                //字符串中没有减号的时候
                        if (!getSymbol(value, "-")) {
                            value += "-";
                        } else if (value.charAt(0) == '-') {
                                                        //当第一个数是负数的时候,一条式子最多只能有两个减号
                            String s = value.substring(1);
                            if (getSymbol(s, "-")) {
                                return;
                            } else {
                                                                //防止连续的减号出现
                                if (value.length() == 1) {
                                    return;
                                }
                                value += "-";
                            }
                        }
                        re.setText(value);
                    }catch (Exception e){

                    }

小数点的话就是两边每个数字最多只能有一个点,有兴趣的小伙伴可以试一下哈哈
BUG
鲁迅先生曾经说过:站在巨人的肩膀看世界,写计算器,当然得看看别人的计算器效果了,于是
4.jpg
5.jpg
感想
计算器看似简单,其实正如我们老师所说的理想很美好,现实很骨感,那种点两下出现bug的痛苦谁能体会,不过还是蛮好玩的。其实用正则限定输入也是可以吧,而我只会用if大法
6.png
最后,只是想分享一下想法,如有不当之处,还请指正!希望大家也可以来分享一下想法思路

免费评分

参与人数 4吾爱币 +5 热心值 +4 收起 理由
play.1122 + 1 + 1 热心回复!
Parkourr + 1 + 1 谢谢@Thanks!
泳诗 + 1 我很赞同!
苏紫方璇 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

wang_qianxu 发表于 2020-4-12 09:46
一直没有找到一个好的计算器
 楼主| 忧伤_ 发表于 2020-4-12 11:21
三滑稽甲苯 发表于 2020-7-24 10:19
 楼主| 忧伤_ 发表于 2020-8-9 15:02

哈哈,js eval()
lxn03160773 发表于 2020-11-12 19:54
so easy.android
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-29 04:14

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表