本帖最后由 忧伤_ 于 2020-4-12 11:20 编辑
响应老师的提议,初学安卓想看到效果,加上感觉可以做出来,就动手了,然而,你老师还是你老师 bug数量极其恐怖!
布局思路
布局采用表格布局,放两个文本框用于显示
代码思路
通过为每一个按钮设置监听器,当点击按钮时,对应按钮的值会以字符串的形式追加到文本框中,通过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
鲁迅先生曾经说过:站在巨人的肩膀看世界,写计算器,当然得看看别人的计算器效果了,于是
感想
计算器看似简单,其实正如我们老师所说的理想很美好,现实很骨感,那种点两下出现bug的痛苦谁能体会,不过还是蛮好玩的。其实用正则限定输入也是可以吧,而我只会用if大法
最后,只是想分享一下想法,如有不当之处,还请指正!希望大家也可以来分享一下想法思路
|