忧伤_ 发表于 2020-4-12 01:36

简易计算器

本帖最后由 忧伤_ 于 2020-4-12 11:20 编辑


**响应老师的提议,初学安卓想看到效果,加上感觉可以做出来,就动手了,然而,你老师还是你老师 bug数量极其恐怖!**

**布局思路**
布局采用表格布局,放两个文本框用于显示

**代码思路**
通过为每一个按钮设置监听器,当点击按钮时,对应按钮的值会以字符串的形式追加到文本框中,通过setText()方法设置文本框的内容,getText().toString()的方法获取到文本框的内容,值得一提的是,setText()的参数似乎只能传字符串类型的值,反正不能直接设置数字:'(weeqw
接下来就是如何计算的问题了
我的思路是,计算嘛,也就是两个数之间的事情,这两个数都有一个共同的特点,那就是都在运算符的前面或后面,而我们的整条式子是一个字符产,也就是说,我们可以通过字符串的方法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**
~~鲁迅先生曾经说过:~~站在巨人的肩膀看世界,写计算器,当然得看看别人的计算器效果了,于是


**感想**
计算器看似简单,其实正如我们老师所说的理想很美好,现实很骨感,那种点两下出现bug的痛苦谁能体会,不过还是蛮好玩的。其实用正则限定输入也是可以吧,而我只会用if大法

**最后,只是想分享一下想法,如有不当之处,还请指正!希望大家也可以来分享一下想法思路**

wang_qianxu 发表于 2020-4-12 09:46

一直没有找到一个好的计算器

忧伤_ 发表于 2020-4-12 11:21

wang_qianxu 发表于 2020-4-12 09:46
一直没有找到一个好的计算器

自己整一个:lol

三滑稽甲苯 发表于 2020-7-24 10:19

python eval(){:301_1001:}

忧伤_ 发表于 2020-8-9 15:02

三滑稽甲苯 发表于 2020-7-24 10:19
python eval()

哈哈,js eval()

lxn03160773 发表于 2020-11-12 19:54

so easy.android
页: [1]
查看完整版本: 简易计算器