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):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <EditText
        android:id="@+id/result_text"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:textSize="30sp"
        android:padding="20dp"
        android:layout_gravity="end"
        android:editable="false"
        android:textAlignment="textEnd"
        android:singleLine="true"
        android:text="0"
        />

    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="AC"
                android:id="@+id/ac_btn" />

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="Del"
                android:id="@+id/delete_btn" />

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="%"
                android:id="@+id/percent_btn" />

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="÷"
                android:id="@+id/divide_btn" />
        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="7"
                android:id="@+id/num_seven" />

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="8"
                android:id="@+id/num_eight" />

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="9"
                android:id&#
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值