NiceCalculator是我最近在学习Android开发过程中设计的一个小程序,这篇文章对它的原理做一些整理。
程序算法:
每输入一次运算符,都会检查这个数之前是否有未完成的运算,如果有的话就先计算完前面的对应运算,再将本次运算的形式用tag标记,告诉下一个运算符本次运算是+-*/中的哪一种;如果之前没有就直接将文本框中的数值赋给num即可。
也就是本程序现在的能实现的都是a+b;a-b之类的两个数之间的简单运算。
具体实现:
这种计算的关键是准确获得a,b以及他们之间的运算关系:
用isSign判断此前输入的是数值还是字符,用isEqual判断此前是否进行过等式运算;
用num存储上一次文本框中的内容(result)即a;
用buffer读取本次的result;
用tag记录他们的运算关系;
这样子三个问题都得到了解决。
输入数字的问题:
如果前面输入的是等号或者运算符,就需要将result的内容清空,然后再传入数据;
如果上一次输入的是数字,就需要保留result的内容,并将本次的内容加到result文本的最后,最后在运算的时候用Double.valueof()方法将result转化为Double类型数据,继而参与进一步运算或输出。
计算流程:
输入的是0~9的时候:
用isSign判断此前输入的是数值还是字符,用isEqual判断此前是否进行过等式运算,只要是字符或者此前进行过等式运算,就清空result的内容,重新赋值为str
注意此处要捕获异常,当此前未曾输入过数值时result为null,使用toString方法会出现异常,可以用try...catch捕获异常
输入的是运算符的时候:
根据tag判断此前是否有未完成的运算,如果有判断是哪一种,并进行相应运算,最后将结果赋值给result
注意此处要捕获异常:当此前未曾输入过数值的时候,点击+-*/=会在result使用toString方法时出现异常,用try...catch捕获异常
而如果此前result不为空,连续点击+-*/会对result进行对应运算,此处并不认为是错误,所以给予保留
算法的思想是将每一次的两项之间的运算在下一次运算开始之前计算结束,是比较简单的算法,要点是判断当前输入的值类型并依次做相应运算。