项目源码在文章最后。

这两天写了一个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"><EditTextandroid: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"/><TableLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><TableRowandroid:layout_width="match_parent"android:layout_height="wrap_content"><Buttonandroid:layout_width="0dp"android:layout_weight="1"android:layout_height="70dp"android:textSize="22sp"android:text="AC"android:id="@+id/ac_btn" /><Buttonandroid:layout_width="0dp"android:layout_weight="1"android:layout_height="70dp"android:textSize="22sp"android:text="Del"android:id="@+id/delete_btn" /><Buttonandroid:layout_width="0dp"android:layout_weight="1"android:layout_height="70dp"android:textSize="22sp"android:text="%"android:id="@+id/percent_btn" /><Buttonandroid:layout_width="0dp"android:layout_weight="1"android:layout_height="70dp"android:textSize="22sp"android:text="÷"android:id="@+id/divide_btn" /></TableRow><TableRowandroid:layout_width="match_parent"android:layout_height="wrap_content"><Buttonandroid:layout_width="0dp"android:layout_weight="1"android:layout_height="70dp"android:textSize="22sp"android:text="7"android:id="@+id/num_seven" /><Buttonandroid:layout_width="0dp"android:layout_weight="1"android:layout_height="70dp"android:textSize="22sp"android:text="8"android:id="@+id/num_eight" /><Buttonandroid:layout_width="0dp"android:layout_weight="1"android:layout_height="70dp"android:textSize="22sp"android:text="9"android:id="@+id/num_nine" /><Buttonandroid:layout_width="0dp"android:layout_weight="1"android:layout_height="70dp"android:textSize="22sp"android:text="×"android:id="@+id/multiply_btn" /></TableRow><TableRowandroid:layout_width="match_parent"android:layout_height="wrap_content"><Buttonandroid:layout_width="0dp"android:layout_weight="1"android:layout_height="70dp"android:textSize="22sp"android:text="4"android:id="@+id/num_four" /><Buttonandroid:layout_width="0dp"android:layout_weight="1"android:layout_height="70dp"android:textSize="22sp"android:text="5"android:id="@+id/num_five" /><Buttonandroid:layout_width="0dp"android:layout_weight="1"android:layout_height="70dp"android:textSize="22sp"android:text="6"android:id="@+id/num_six" /><Buttonandroid:layout_width="0dp"android:layout_weight="1"android:layout_height="70dp"android:textSize="22sp"android:text="-"android:id="@+id/subtract_btn" /></TableRow><TableRowandroid:layout_width="match_parent"android:layout_height="wrap_content"><Buttonandroid:layout_width="0dp"android:layout_weight="1"android:layout_height="70dp"android:textSize="22sp"android:text="1"android:id="@+id/num_one" /><Buttonandroid:layout_width="0dp"android:layout_weight="1"android:layout_height="70dp"android:textSize="22sp"android:text="2"android:id="@+id/num_two" /><Buttonandroid:layout_width="0dp"android:layout_weight="1"android:layout_height="70dp"android:textSize="22sp"android:text="3"android:id="@+id/num_three" /><Buttonandroid:layout_width="0dp"android:layout_weight="1"android:layout_height="70dp"android:textSize="22sp"android:text="+"android:id="@+id/plus_btn" /></TableRow><TableRowandroid:layout_width="match_parent"android:layout_height="wrap_content"><Buttonandroid:layout_width="0dp"android:layout_weight="2"android:layout_height="70dp"android:textSize="22sp"android:text="0"android:id="@+id/num_zero" /><Buttonandroid:layout_width="0dp"android:layout_weight="1"android:layout_height="70dp"android:textSize="22sp"android:text="."android:id="@+id/dot_btn" /><Buttonandroid:layout_width="0dp"android:layout_weight="1"android:layout_height="70dp"android:textSize="22sp"android:text="="android:id="@+id/equal_btn" /></TableRow></TableLayout>
</LinearLayout>

界面效果如下:

逻辑部分代码如下(MainActivity.java):

package com.ikok.calculator;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;public class MainActivity extends AppCompatActivity implements View.OnClickListener {/*** 数字*/private Button num0;private Button num1;private Button num2;private Button num3;private Button num4;private Button num5;private Button num6;private Button num7;private Button num8;private Button num9;/*** 运算符*/private Button plus_btn;private Button subtract_btn;private Button multiply_btn;private Button divide_btn;private Button equal_btn;/*** 其他*/private Button dot_btn;private Button percent_btn;private Button delete_btn;private Button ac_btn;/*** 结果*/private EditText mResultText;/*** 已经输入的字符*/private String existedText = "";/*** 是否计算过*/private boolean isCounted = false;/*** 以负号开头,且运算符不是是减号* 例如:-21×2*/private boolean startWithOperator = false;/*** 以负号开头,且运算符是减号* 例如:-21-2*/private boolean startWithSubtract = false;/*** 不以负号开头,且包含运算符* 例如:21-2*/private boolean noStartWithOperator = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initEvent();}/*** 初始化控件*/private void initView() {/*** 数字*/num0 = (Button) findViewById(R.id.num_zero);num1 = (Button) findViewById(R.id.num_one);num2 = (Button) findViewById(R.id.num_two);num3 = (Button) findViewById(R.id.num_three);num4 = (Button) findViewById(R.id.num_four);num5 = (Button) findViewById(R.id.num_five);num6 = (Button) findViewById(R.id.num_six);num7 = (Button) findViewById(R.id.num_seven);num8 = (Button) findViewById(R.id.num_eight);num9 = (Button) findViewById(R.id.num_nine);/*** 运算符*/plus_btn = (Button) findViewById(R.id.plus_btn);subtract_btn = (Button) findViewById(R.id.subtract_btn);multiply_btn = (Button) findViewById(R.id.multiply_btn);divide_btn = (Button) findViewById(R.id.divide_btn);equal_btn = (Button) findViewById(R.id.equal_btn);/*** 其他*/dot_btn = (Button) findViewById(R.id.dot_btn);percent_btn = (Button) findViewById(R.id.percent_btn);delete_btn = (Button) findViewById(R.id.delete_btn);ac_btn = (Button) findViewById(R.id.ac_btn);/*** 结果*/mResultText = (EditText) findViewById(R.id.result_text);/*** 已经输入的字符*/existedText = mResultText.getText().toString();}/*** 初始化事件*/private void initEvent() {num0.setOnClickListener(this);num1.setOnClickListener(this);num2.setOnClickListener(this);num3.setOnClickListener(this);num4.setOnClickListener(this);num5.setOnClickListener(this);num6.setOnClickListener(this);num7.setOnClickListener(this);num8.setOnClickListener(this);num9.setOnClickListener(this);plus_btn.setOnClickListener(this);subtract_btn.setOnClickListener(this);multiply_btn.setOnClickListener(this);divide_btn.setOnClickListener(this);equal_btn.setOnClickListener(this);dot_btn.setOnClickListener(this);percent_btn.setOnClickListener(this);delete_btn.setOnClickListener(this);ac_btn.setOnClickListener(this);}/*** 点击事件* @param v  点击的控件*/@Overridepublic void onClick(View v) {switch (v.getId()){/*** 数字*/case R.id.num_zero:existedText = isOverRange(existedText,"0");break;case R.id.num_one:existedText = isOverRange(existedText,"1");break;case R.id.num_two:existedText = isOverRange(existedText,"2");break;case R.id.num_three:existedText = isOverRange(existedText,"3");break;case R.id.num_four:existedText = isOverRange(existedText,"4");break;case R.id.num_five:existedText = isOverRange(existedText,"5");break;case R.id.num_six:existedText = isOverRange(existedText,"6");break;case R.id.num_seven:existedText = isOverRange(existedText,"7");break;case R.id.num_eight:existedText = isOverRange(existedText,"8");break;case R.id.num_nine:existedText = isOverRange(existedText,"9");break;/*** 运算符*/case R.id.plus_btn:/*** 判断已有的字符是否是科学计数* 是 置零* 否 进行下一步** 判断表达式是否可以进行计算* 是 先计算再添加字符* 否 添加字符** 判断计算后的字符是否是 error* 是 置零* 否 添加运算符*/if (!existedText.contains("e")) {if (judgeExpression()) {existedText = getResult();if (existedText.equals("error")){} else {existedText += "+";}} else {if (isCounted) {isCounted = false;}if ((existedText.substring(existedText.length() - 1)).equals("-")) {existedText = existedText.replace("-", "+");} else if ((existedText.substring(existedText.length() - 1)).equals("×")) {existedText = existedText.replace("×", "+");} else if ((existedText.substring(existedText.length() - 1)).equals("÷")) {existedText = existedText.replace("÷", "+");} else if (!(existedText.substring(existedText.length() - 1)).equals("+")) {existedText += "+";}}} else {existedText = "0";}break;case R.id.subtract_btn:if (!existedText.contains("e")) {if (judgeExpression()) {existedText = getResult();if (existedText.equals("error")){} else {existedText += "-";}} else {if (isCounted) {isCounted = false;}if ((existedText.substring(existedText.length() - 1)).equals("+")) {
//                    Log.d("Anonymous", "onClick: " + "进入减法方法");existedText = existedText.replace("+", "-");} else if ((existedText.substring(existedText.length() - 1)).equals("×")) {existedText = existedText.replace("×", "-");} else if ((existedText.substring(existedText.length() - 1)).equals("÷")) {existedText = existedText.replace("÷", "-");} else if (!(existedText.substring(existedText.length() - 1)).equals("-")) {existedText += "-";}}} else {existedText = "0";}break;case R.id.multiply_btn:if (!existedText.contains("e")) {if (judgeExpression()) {existedText = getResult();if (existedText.equals("error")){} else {existedText += "×";}} else {if (isCounted) {isCounted = false;}if ((existedText.substring(existedText.length() - 1)).equals("+")) {existedText = existedText.replace("+", "×");} else if ((existedText.substring(existedText.length() - 1)).equals("-")) {existedText = existedText.replace("-", "×");} else if ((existedText.substring(existedText.length() - 1)).equals("÷")) {existedText = existedText.replace("÷", "×");} else if (!(existedText.substring(existedText.length() - 1)).equals("×")) {existedText += "×";}}} else {existedText = "0";}break;case R.id.divide_btn:if (!existedText.contains("e")) {if (judgeExpression()) {existedText = getResult();if (existedText.equals("error")){} else {existedText += "÷";}} else {if (isCounted) {isCounted = false;}if ((existedText.substring(existedText.length() - 1)).equals("+")) {existedText = existedText.replace("+", "÷");} else if ((existedText.substring(existedText.length() - 1)).equals("-")) {existedText = existedText.replace("-", "÷");} else if ((existedText.substring(existedText.length() - 1)).equals("×")) {existedText = existedText.replace("×", "÷");} else if (!(existedText.substring(existedText.length() - 1)).equals("÷")) {existedText += "÷";}}} else {existedText = "0";}break;case R.id.equal_btn:existedText = getResult();isCounted = true;break;/*** 其他*/case R.id.dot_btn:/*** 判断是否运算过* 否*   判断是否有运算符,有 判断运算符之后的数字,无 判断整个数字*   判断数字是否过长,是则不能添加小数点,否则可以添加*   判断已经存在的数字里是否有小数点* 是*   字符串置为 0.*/if (!isCounted){if (existedText.contains("+") || existedText.contains("-") ||existedText.contains("×") || existedText.contains("÷") ){String param1 = null;String param2 = null;if (existedText.contains("+")) {param1 = existedText.substring(0, existedText.indexOf("+"));param2 = existedText.substring(existedText.indexOf("+") + 1);} else if (existedText.contains("-")) {param1 = existedText.substring(0, existedText.indexOf("-"));param2 = existedText.substring(existedText.indexOf("-") + 1);} else if (existedText.contains("×")) {param1 = existedText.substring(0, existedText.indexOf("×"));param2 = existedText.substring(existedText.indexOf("×") + 1);} else if (existedText.contains("÷")) {param1 = existedText.substring(0, existedText.indexOf("÷"));param2 = existedText.substring(existedText.indexOf("÷") + 1);}Log.d("Anonymous param1",param1);Log.d("Anonymous param2",param2);boolean isContainedDot = param2.contains(".");if (param2.length() >= 9){} else if (!isContainedDot){if (param2.equals("")){existedText += "0.";} else {existedText += ".";}} else {return;}} else {boolean isContainedDot = existedText.contains(".");if (existedText.length() >= 9){} else if (!isContainedDot){existedText += ".";} else {return;}}isCounted = false;} else {existedText = "0.";isCounted = false;}break;case R.id.percent_btn:/*** 判断数字是否有运算符* 是 不做任何操作* 否 进行下一步** 判断数字是否是 0* 是 不做任何操作* 否 进行除百** 将字符串转换成double类型,进行运算后,再转换成String型*/if (existedText.equals("error")){} else {getCondition();if (startWithOperator || startWithSubtract || noStartWithOperator) {} else {if (existedText.equals("0")) {return;} else {double temp = Double.parseDouble(existedText);temp = temp / 100;existedText = String.valueOf(temp);}}}break;case R.id.delete_btn:/*** 字符串长度大于 0 时才截取字符串* 如果长度为 1,则直接把字符串设置为 0*/if (existedText.equals("error")){existedText = "0";} else if (existedText.length() > 0){if (existedText.length() == 1) {existedText = "0";} else {existedText = existedText.substring(0,existedText.length()-1);}}break;case R.id.ac_btn:existedText = "0";break;}/*** 设置显示*/mResultText.setText(existedText);}/*** 进行运算,得到结果* @return  返回结果*/private String getResult() {/*** 结果*/String tempResult = null;/*** 两个String类型的参数*/String param1 = null;String param2 = null;/*** 转换后的两个double类型的参数*/double arg1 = 0;double arg2 = 0;double result = 0;getCondition();/*** 如果有运算符,则进行运算* 没有运算符,则把已经存在的数据再传出去*/if ( startWithOperator || noStartWithOperator || startWithSubtract) {if (existedText.contains("+")) {/*** 先获取两个参数*/param1 = existedText.substring(0, existedText.indexOf("+"));param2 = existedText.substring(existedText.indexOf("+") + 1);/*** 如果第二个参数为空,则还是显示当前字符*/if (param2.equals("")){tempResult = existedText;} else {/*** 转换String为Double* 计算后再转换成String类型* 进行正则表达式处理*/arg1 = Double.parseDouble(param1);arg2 = Double.parseDouble(param2);result = arg1 + arg2;tempResult = String.format("%f", result);tempResult = subZeroAndDot(tempResult);}} else if (existedText.contains("×")) {param1 = existedText.substring(0, existedText.indexOf("×"));param2 = existedText.substring(existedText.indexOf("×") + 1);if (param2.equals("")){tempResult = existedText;} else {arg1 = Double.parseDouble(param1);arg2 = Double.parseDouble(param2);result = arg1 * arg2;tempResult = String.format("%f", result);tempResult = subZeroAndDot(tempResult);}} else if (existedText.contains("÷")) {param1 = existedText.substring(0, existedText.indexOf("÷"));param2 = existedText.substring(existedText.indexOf("÷") + 1);if (param2.equals("0")){tempResult = "error";} else if (param2.equals("")){tempResult = existedText;} else {arg1 = Double.parseDouble(param1);arg2 = Double.parseDouble(param2);result = arg1 / arg2;tempResult = String.format("%f", result);tempResult = subZeroAndDot(tempResult);}} else if (existedText.contains("-")) {/*** 这里是以最后一个 - 号为分隔去取出两个参数* 进到这个方法,必须满足有运算公式* 而又避免了第一个参数是负数的情况*/param1 = existedText.substring(0, existedText.lastIndexOf("-"));param2 = existedText.substring(existedText.lastIndexOf("-") + 1);if (param2.equals("")){tempResult = existedText;} else {arg1 = Double.parseDouble(param1);arg2 = Double.parseDouble(param2);result = arg1 - arg2;tempResult = String.format("%f", result);tempResult = subZeroAndDot(tempResult);}}/*** 如果数据长度大于等于10位,进行科学计数** 如果有小数点,再判断小数点前是否有十个数字,有则进行科学计数*/if (tempResult.length() >= 10) {tempResult = String.format("%e", Double.parseDouble(tempResult));} else if (tempResult.contains(".")) {if (tempResult.substring(0, tempResult.indexOf(".")).length() >= 10) {tempResult = String.format("%e", Double.parseDouble(tempResult));}}} else {tempResult = existedText;}return tempResult;}/*** 先判断是否按过等于号* 是 按数字则显示当前数字* 否 在已有的表达式后添加字符** 判断数字是否就是一个 0* 是 把字符串设置为空字符串。*   1、打开界面没有运算过的时候,AC键归零或删除完归零的时候,会显示一个 0*   2、当数字是 0 的时候,设置成空字符串,再按 0 ,数字会还是 0,不然可以按出 000 这种数字* 否 添加按下的键的字符** 判断数字是否包含小数点* 是 数字不能超过十位* 否 数字不能超过九位** 进行上面的判断后,再判断数字是否超过长度限制* 超过不做任何操作* 没超过可以再添数字*/private String isOverRange(String existedText, String s) {/*** 判断是否计算过*/if (!isCounted){/*** 判断是否是科学计数* 是 文本置零*/if (existedText.contains("e")){existedText = "0";}/*** 判断是否只有一个 0* 是 文本清空*/if (existedText.equals("0")){existedText = "";}/*** 判断是否有运算符* 是 判断第二个数字* 否 判断整个字符串*/if (existedText.contains("+") || existedText.contains("-") ||existedText.contains("×") || existedText.contains("÷")){/*** 包括运算符时 两个数字 判断第二个数字* 两个参数*/String param2 = null;if (existedText.contains("+")){param2 = existedText.substring(existedText.indexOf("+")+1);} else if (existedText.contains("-")){param2 = existedText.substring(existedText.indexOf("-")+1);} else if (existedText.contains("×")){param2 = existedText.substring(existedText.indexOf("×")+1);} else if (existedText.contains("÷")){param2 = existedText.substring(existedText.indexOf("÷")+1);}//            Log.d("Anonymous param1",param1);
//            Log.d("Anonymous param2",param2);if (existedText.substring(existedText.length()-1).equals("+") ||existedText.substring(existedText.length()-1).equals("-") ||existedText.substring(existedText.length()-1).equals("×") ||existedText.substring(existedText.length()-1).equals("÷")){existedText += s;} else {if (param2.contains(".")){if (param2.length() >= 10){} else {existedText += s;}} else {if (param2.length() >= 9){} else {existedText += s;}}}} else {/*** 不包括运算符时 一个数字*/if (existedText.contains(".")){if (existedText.length() >= 10){} else {existedText += s;}} else {if (existedText.length() >= 9){} else {existedText += s;}}}isCounted = false;} else {existedText = s;isCounted = false;}return existedText;}/*** 使用java正则表达式去掉多余的.与0* @param s 传入的字符串* @return 修改之后的字符串*/public static String subZeroAndDot(String s){if(s.indexOf(".") > 0){s = s.replaceAll("0+?$", "");//去掉多余的0s = s.replaceAll("[.]$", "");//如最后一位是.则去掉}return s;}/*** 判断表达式** 为了按等号是否进行运算* 以及出现两个运算符(第一个参数如果为负数的符号不计)先进行运算再添加运算符*/private boolean judgeExpression() {getCondition();String tempParam2 = null;if ( startWithOperator || noStartWithOperator || startWithSubtract) {if (existedText.contains("+")) {/*** 先获取第二个参数*/tempParam2 = existedText.substring(existedText.indexOf("+") + 1);/*** 如果第二个参数为空,表达式不成立*/if (tempParam2.equals("")) {return false;} else {return true;}} else if (existedText.contains("×")) {tempParam2 = existedText.substring(existedText.indexOf("×") + 1);if (tempParam2.equals("")) {return false;} else {return true;}} else if (existedText.contains("÷")) {tempParam2 = existedText.substring(existedText.indexOf("÷") + 1);if (tempParam2.equals("")) {return false;} else {return true;}} else if (existedText.contains("-")) {/*** 这里是以最后一个 - 号为分隔去取出两个参数* 进到这个方法,必须满足有运算公式* 而又避免了第一个参数是负数的情况*/tempParam2 = existedText.substring(existedText.lastIndexOf("-") + 1);if (tempParam2.equals("")) {return false;} else {return true;}}}return false;}/*** 取得判断条件*/private void getCondition() {/*** 以负号开头,且运算符不是是减号* 例如:-21×2*/startWithOperator = existedText.startsWith("-") && ( existedText.contains("+") ||existedText.contains("×") || existedText.contains("÷") );/*** 以负号开头,且运算符是减号* 例如:-21-2*/startWithSubtract = existedText.startsWith("-") && ( existedText.lastIndexOf("-") != 0 );/*** 不以负号开头,且包含运算符* 例如:21-2*/noStartWithOperator = !existedText.startsWith("-") && ( existedText.contains("+") ||existedText.contains("-") || existedText.contains("×") || existedText.contains("÷"));}}

运行效果如下:

项目地址在:https://github.com/someonexiaole/Android

Calculator 即是。

Android小项目:计算器相关推荐

  1. Android小项目———— 冰炭不投de小计算器

    我的第一个Android小项目 冰炭不投de小计算器 一.前言 这是我首个使用java写的app,也在学习郭霖老师的第一行代码和李刚老师的疯狂java讲义之时,进行的练习之作,刚刚学习java和and ...

  2. Android小项目————聊天室(UI篇)

    Android小项目----聊天室(UI篇) 一.前言 这是所做的第二个android项目,主要目的对暑假所学的java和android知识点进行复习巩固和实践,由于知识所限,目前这个聊天室并不是很完 ...

  3. Android 小项目之--数据存储【Files】(附源码)

    继上篇数据存储,现在我们来讲讲另外一种数据存储,Files.本篇讲述步骤如下: 1.温故而知新,复习四种数据存储的区别. 2.什么是 Files 数据存储. 3.什么是 Properties ? 4. ...

  4. linux 蓝牙 手机遥控器,嵌入式Android小项目之万能手机遥控器详解

    原标题:嵌入式Android小项目之万能手机遥控器详解 在很久很久以前,手机是有红外功能的,后来随着蓝牙技术的成熟,红外逐渐被蓝牙取代,不再是标配了. 红外本身还是有些优点,比如操作简便,成本低.要想 ...

  5. Android小项目——简易备忘录

    Android小项目--简易备忘录的实现 简易备忘录主要实现功能类似手机默认备忘录,可以对备忘录目录进行增添和删除.在编辑页面,可以显示当前时间,编辑备忘录标题,备忘录内容,设置时间提醒,插入图片等 ...

  6. 一个特别适合新手练习的Android小项目——每日一妹纸

    原文链接 http://sparkyuan.me/ 转载请注明出处 介绍 当前版本V 1.2 刚开始学习Android的时候,主要就是学习了一些Activity的生命周期,各种View和Layout的 ...

  7. Android小项目之--前台界面与用户交互的对接 进度条与拖动条(附源码)

    都知道水果公司(苹果)是己尊重用户体验著称的公司,其设计的产品人性化十足,不得不令后来者赞叹,竞相模仿.iphone的成功就是其典型的案例,做为其移动系统的死对头 Google 想要在市场上分得一杯羹 ...

  8. Android 小项目之--Mini音乐播放器【简单版】(附源码)

    上篇文章讲服务的例子中,有个演示服务的后台播放音乐,今天就来讲一讲多媒体之一的音乐播放. 说到多媒体不得不向上追溯,空间多媒体是如何实现的,如何可以让我们轻松的播放音乐.视频?本章讲述点大致如下: 1 ...

  9. Android小项目——新闻APP

    前言: 在公司学习了一段时间Android知识,决定做一个小项目,目的是学会运用所学的基础知识,在这里记录一下开发历程,大家可以把它看成一款入门级练手的 Demo 应用吧~ 项目概述: 类型: 新闻A ...

  10. android小项目之新闻客户端四

     基于Android小巫新闻客户端开发---显示新闻详细内容UI设计 2013年2月27日,天气潮湿!!! 距上一次写的主界面业务逻辑实现,已经过来11天,小巫觉得拖得太久了,所以决定尽量把所有的 ...

最新文章

  1. java打印四行等腰三角形_(c语言程序案例.doc
  2. python语言由ps f组织所有_python面试题100.docx
  3. 华为服务器修改SN,服务器渠道货SN配置
  4. php使用第三方登录
  5. 1.15运行命令直至执行成功
  6. VS2008系统开发背景图片的添加及注意事项
  7. oracle sqe值,质量感悟 | 无论什么层次的供应商都喜欢跟SQE中的高手过招儿
  8. cdf日上免税店_cdf会员购吐槽大会!从上海日上开始!
  9. 消费金融盈利分析及风控能力建设
  10. 如何在Ubuntu 16.04上安装和配置GitLab
  11. 2018计算机专业考研34所,2018考研:计算机专业全球院校排名公布,上海交通大学竟排第一?...
  12. RV1109 Linux SDK入门指南
  13. SPOJ DQUERY D-query(主席树 区间不同数个数)
  14. #研发中间件介绍#异步消息可靠推送Notify
  15. 【python】编程语言入门经典100例--11
  16. SAP Table 汇总版
  17. 实现音乐播放器歌词显示效果
  18. prometheus监控nginx
  19. Mac 有线网络或WiFi网络共享成WiFiwifi的方法
  20. 用C语言求一元二次方程的解

热门文章

  1. Java 32位最新版 (Java SE 8)
  2. 【MM模块】Inventory Management(IM)库存管理简介
  3. 数字电子技术基础(第六版)阎石 版 课后答案 课后题答案与解析 课后习题答案
  4. VMRC 控制台的连接已断开 for win8 vsphere5.0
  5. 富士通MB95F636H输出PWM
  6. 韩顺平Linux操作系统视频教程
  7. 2021年11月_IEEE TRANSACTIONS ON MEDICAL IMAGING_科技前言热点调研表
  8. ansys_apdl使用教程
  9. 在html中如何写日期的代码,日期html代码
  10. 灵悟礼品网上专卖店——分析类似项目的优缺点