您的位置:首页 > 移动开发 > Android开发

Android小项目:计算器

2016-04-06 16:12 507 查看
项目源码在文章最后。

这两天写了一个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 即是。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: