项目源码在文章最后。
这两天写了一个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="@+id/num_nine" /> <Button android:layout_width="0dp" android:layout_weight="1" android:layout_height="70dp" android:textSize="22sp" android:text="×" android:id="@+id/multiply_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="4" android:id="@+id/num_four" /> <Button android:layout_width="0dp" android:layout_weight="1" android:layout_height="70dp" android:textSize="22sp" android:text="5" android:id="@+id/num_five" /> <Button android:layout_width="0dp" android:layout_weight="1" android:layout_height="70dp" android:textSize="22sp" android:text="6" android:id="@+id/num_six" /> <Button android:layout_width="0dp" android:layout_weight="1" android:layout_height="70dp" android:textSize="22sp" android:text="-" android:id="@+id/subtract_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="1" android:id="@+id/num_one" /> <Button android:layout_width="0dp" android:layout_weight="1" android:layout_height="70dp" android:textSize="22sp" android:text="2" android:id="@+id/num_two" /> <Button android:layout_width="0dp" android:layout_weight="1" android:layout_height="70dp" android:textSize="22sp" android:text="3" android:id="@+id/num_three" /> <Button android:layout_width="0dp" android:layout_weight="1" android:layout_height="70dp" android:textSize="22sp" android:text="+" android:id="@+id/plus_btn" /> </TableRow> <TableRow android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:layout_width="0dp" android:layout_weight="2" android:layout_height="70dp" android:textSize="22sp" android:text="0" android:id="@+id/num_zero" /> <Button android:layout_width="0dp" android:layout_weight="1" android:layout_height="70dp" android:textSize="22sp" android:text="." android:id="@+id/dot_btn" /> <Button android: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; @Override protected 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 点击的控件 */ @Override public 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+?$", "");//去掉多余的0 s = 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 即是。