Android小项目:计算器
项目源码在文章最后。
这两天写了一个Android的计算器,现在整理一下思路与代码。
首先是功能需求分析:
1、数字我规定最长为九位,如果有小数点则加上小数点最长为十位
2、第二个参数输入时不允许为负数,但是先得出的结果为负数,可以再进行运算(比如:1-2=-1,结果显示的是-1,可以再运算,-1+2=1)
3、得出的结果如果大于等于10位,则把数据进行科学计数
4、科学计数的数据不能再进行运算,再按按钮会直接显示0或者当前按下的数字
5、进行连续运算时,会先计算先一个运算的结果,在把结果作为第一个参数进行下次运算(比如:1+2+3,当按下第二个加号的时候,会显示3+,先把前一个运算的结果算出来再进行下一个运算)
6、当除数为0时,显示 error
7、默认情况下,显示 0
8、是否进行运算过,判断是否按下过等于号,如果按下,显示了结果,再按数字则直接显示当前数字而不是在结果后添加这个数字
接下来是正式开始编写代码:
1、界面布局 (TableLayout 实现按钮排版 ,EditText 显示表达式或值)
2、初始化所有控件,以及为需要点击事件的控件绑定监听器
3、编写监听器事件逻辑代码
①当按下的是数字,先判断是否计算过
是(按下过等号):把显示的文本改为当前按下的数字,计算过的标志设为false
否(没按过等号):进行下一步判断,计算过的标志设为false
判断当前文本是否有科学计数
是(有科学计数的标志 e ):文本置为 0
判断文本是否只有一个 0
是(当前文本为 0):文本置为空
判断是否有运算符
是(包含运算符):取出运算符后的第二个参数,进行下一步判断
判断最后一个是否是运算符
是(文本最后一个是运算符号):则直接添加按下的数字
否(文本最后一个不是运算符号):进行下一步判断
判断第二个参数的长度,包括小数点则可以为10位,不包括小数点只能为9位
否(不包含运算符):判断第一个参数(即整个文本)的长度,包括小数点则可以为10位,不包括小数点只能为9位
②当按下的是小数点,先判断是否计算过
是(按下过等号):把文本改为 0. (数字 0 的后面有一个小数点),把计算过的标志位设为 false
否(没按过等号):进行下一步判断,,把计算过的标志位设为 false
判断是否有运算符
是(包含运算符):取出第二个参数,判断长度是否超过,是:无操作,否:判断参数中是否已经有小数点,有:无操作,否,添加小数点
否(不包含运算符):判断第一个参数(即整个文本)的长度是否超过,是:无操作,否:判断参数中是否已经有小数点,有:无操作,否,添加小数点
③当按下的是特殊键(归零、回退、百分比)
归零:直接把文本改为 0
回退:判断文本是否是 error,是:文本改为 0,否:判断文本的长度,当文本的长度大于0时且不等于1时,文本删掉最后一个字符,文本长度为1时,文本改为 0
百分比:判断文本是否是 error,是:无操作,否:判断是否是表达式,是:无操作,否:数字除百
④当按下的是运算符,判断当前的文本是否是科学计数
是(文本是科学计数,包含 e):文本置 0
否(文本不是科学计数,不包含 e):判断文本是否是表达式,且第二个参数不为空
是(是表达式,有两个参数):先得出结果,如果结果不是 error,添加上相应的运算符,如果结果是 error,无操作
否(不是表达式,可能是数字,也可能是数字后面带一个运算符):如果计算过的标志位为 true,改为 false,如果最后一个字符为其他运算符,则改为当前按下的运算符,如果最后一个不是当前按下的运算符,则添加改运算符
⑤当按下的是等号,判断当前文本是否是表达式
是:判断包含的是哪种运算符,取出两个参数,如果第二个参数为空,则无操作,如果第二个参数不为空,则进行相应的计算,再把运算结果进行格式化,然后用正则表达式去掉多余的 0 。如果结果的长度大于10位,则把数字转换成科学计数
布局代码如下(activity_main.xml):