Android计算器(计算表达式,能计算小数点以及括号)方法简单易懂
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                Android计算器(计算表达式,能计算小数点以及括号)方法简单易懂
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                布局代碼:
<?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="wrap_content"android:stretchColumns="4"android:focusable="true"android:focusableInTouchMode="true"tools:context=".MainActivity"><TableRowandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="#aaaaaa"><LinearLayoutandroid:layout_width="0dp"android:layout_height="200dp"android:layout_column="0"android:gravity="right"android:layout_weight="1"><EditTextandroid:id="@+id/content_box"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="bottom|right"android:background="@null"android:hint="0"android:textSize="20pt" /></LinearLayout></TableRow> <!--計算表達式輸入框--><TableRow><Buttonandroid:id="@+id/btn_c"android:layout_width="0dp"android:layout_height="70dp"android:layout_column="0"android:layout_weight="1"android:text="C"android:textColor="#ff0000"android:textSize="12pt" /><Buttonandroid:id="@+id/btn_ce"android:layout_width="0dp"android:layout_height="70dp"android:layout_column="1"android:layout_weight="1"android:text="CE"android:textColor="#ff0000"android:textSize="12pt" /><Buttonandroid:id="@+id/btn_aliquot"android:layout_width="0dp"android:layout_height="70dp"android:layout_column="2"android:layout_weight="1"android:text="%"android:textColor="#ff0000"android:textSize="12pt" /><Buttonandroid:id="@+id/btn_divide"android:layout_width="0dp"android:layout_height="70dp"android:layout_column="3"android:layout_weight="1"android:text="/"android:textColor="#ff0000"android:textSize="12pt" /></TableRow><TableRow><Buttonandroid:id="@+id/btn_leftBracket"android:layout_width="0dp"android:layout_height="70dp"android:layout_column="0"android:layout_span="1"android:layout_weight="1"android:text="("android:textColor="#ff0000"android:textSize="12pt" /><Buttonandroid:id="@+id/btn_rightBracket"android:layout_width="0dp"android:layout_height="70dp"android:layout_column="0"android:layout_span="1"android:layout_weight="1"android:text=")"android:textColor="#ff0000"android:textSize="12pt" /></TableRow><TableRow><Buttonandroid:id="@+id/btn_seven"android:layout_width="0dp"android:layout_height="70dp"android:layout_column="0"android:layout_weight="1"android:text="7"android:textSize="12pt" /><Buttonandroid:id="@+id/btn_eight"android:layout_width="0dp"android:layout_height="70dp"android:layout_column="1"android:layout_weight="1"android:text="8"android:textSize="12pt" /><Buttonandroid:id="@+id/btn_nine"android:layout_width="0dp"android:layout_height="70dp"android:layout_column="2"android:layout_weight="1"android:text="9"android:textSize="12pt" /><Buttonandroid:id="@+id/btn_multiply"android:layout_width="0dp"android:layout_height="70dp"android:layout_column="3"android:layout_weight="1"android:text="*"android:textColor="#ff0000"android:textSize="12pt" /></TableRow><TableRow><Buttonandroid:id="@+id/btn_four"android:layout_width="0dp"android:layout_height="70dp"android:layout_column="0"android:layout_weight="1"android:text="4"android:textSize="12pt" /><Buttonandroid:id="@+id/btn_five"android:layout_width="0dp"android:layout_height="70dp"android:layout_column="1"android:layout_weight="1"android:text="5"android:textSize="12pt" /><Buttonandroid:id="@+id/btn_six"android:layout_width="0dp"android:layout_height="70dp"android:layout_column="2"android:layout_weight="1"android:text="6"android:textSize="12pt" /><Buttonandroid:id="@+id/btn_subtract"android:layout_width="0dp"android:layout_height="70dp"android:layout_column="3"android:layout_weight="1"android:text="-"android:textColor="#ff0000"android:textSize="12pt" /></TableRow><TableRow><Buttonandroid:id="@+id/btn_one"android:layout_width="0dp"android:layout_height="70dp"android:layout_column="0"android:layout_weight="1"android:text="1"android:textSize="12pt" /><Buttonandroid:id="@+id/btn_two"android:layout_width="0dp"android:layout_height="70dp"android:layout_column="1"android:layout_weight="1"android:text="2"android:textSize="12pt" /><Buttonandroid:id="@+id/btn_three"android:layout_width="0dp"android:layout_height="70dp"android:layout_column="2"android:layout_weight="1"android:text="3"android:textSize="12pt" /><Buttonandroid:id="@+id/btn_add"android:layout_width="0dp"android:layout_height="70dp"android:layout_column="3"android:layout_weight="1"android:text="+"android:textColor="#ff0000"android:textSize="12pt" /></TableRow><TableRow><Buttonandroid:id="@+id/btn_point"android:layout_width="0dp"android:layout_height="70dp"android:layout_column="0"android:layout_weight="1"android:text="."android:textSize="12pt" /><Buttonandroid:id="@+id/btn_zero"android:layout_width="0dp"android:layout_height="70dp"android:layout_column="1"android:layout_weight="1"android:text="0"android:textSize="12pt" /><Buttonandroid:id="@+id/btn_equal"android:layout_width="0dp"android:layout_height="70dp"android:layout_column="2"android:layout_weight="2"android:text="="android:textColor="#ff0000"android:textSize="12pt" /></TableRow></TableLayout>Activicy代碼:
package com.example.newcalculator;import androidx.appcompat.app.AppCompatActivity;import android.content.Context; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast;import java.lang.reflect.Type;public class MainActivity extends AppCompatActivity implements View.OnClickListener{/*按鈕定義*/Button btn_one; //1Button btn_two; //2Button btn_three; //3Button btn_four; //4Button btn_five; //5Button btn_six; //6Button btn_seven; //7Button btn_eight; //8Button btn_nine; //9Button btn_zero; //0Button btn_c; //cButton btn_ce; //ceButton btn_aliquot; //%Button btn_divide; //除號Button btn_multiply;//xButton btn_subtract;//-Button btn_add; //+Button btn_point; //.Button btn_equal; //=Button btn_leftBracket;//(Button btn_rightBracket;//)EditText contentBox;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initControls();initClickEvent();}//找到控件private void initControls() {btn_one = findViewById(R.id.btn_one);btn_two = findViewById(R.id.btn_two);btn_three = findViewById(R.id.btn_three);btn_four = findViewById(R.id.btn_four);btn_five = findViewById(R.id.btn_five);btn_six = findViewById(R.id.btn_six);btn_seven = findViewById(R.id.btn_seven);btn_eight = findViewById(R.id.btn_eight);btn_nine = findViewById(R.id.btn_nine);btn_zero = findViewById(R.id.btn_zero);btn_c = findViewById(R.id.btn_c);btn_ce = findViewById(R.id.btn_ce);btn_aliquot = findViewById(R.id.btn_aliquot);btn_divide = findViewById(R.id.btn_divide);btn_multiply = findViewById(R.id.btn_multiply);btn_subtract = findViewById(R.id.btn_subtract);btn_add = findViewById(R.id.btn_add);btn_point = findViewById(R.id.btn_point);btn_equal = findViewById(R.id.btn_equal);contentBox = findViewById(R.id.content_box);btn_leftBracket = findViewById(R.id.btn_leftBracket);btn_rightBracket = findViewById(R.id.btn_rightBracket);}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.btn_one:{changeVal("1");}break;case R.id.btn_two:{changeVal("2");}break;case R.id.btn_three:{changeVal("3");}break;case R.id.btn_four:{changeVal("4");}break;case R.id.btn_five:{changeVal("5");}break;case R.id.btn_six:{changeVal("6");}break;case R.id.btn_seven:{changeVal("7");}break;case R.id.btn_eight:{changeVal("8");}break;case R.id.btn_nine:{changeVal("9");}break;case R.id.btn_zero:{changeVal("0");}break;case R.id.btn_aliquot:{changeVal("%");}break;case R.id.btn_divide:{changeVal("/");}break;case R.id.btn_multiply:{changeVal("*");}break;case R.id.btn_subtract:{changeVal("-");}break;case R.id.btn_add:{changeVal("+");}break;case R.id.btn_rightBracket:{changeVal(")");}break;case R.id.btn_leftBracket:{changeVal("(");}break;case R.id.btn_c:{funC();}break;case R.id.btn_ce:{funClearAll();}break;case R.id.btn_point:{changeVal(".");}break;case R.id.btn_equal:{String str = contentBox.getText().toString();Calculator calculator = new Calculator();Double result = calculator.Eval(str);contentBox.setText(result.toString());}break;}}private void changeVal(String flag){String str = contentBox.getText().toString();contentBox.setText(str+flag);}private void funC(){String str = contentBox.getText().toString();str = str.substring(0,str.length()-1);contentBox.setText(str);}private void funClearAll(){contentBox.setText("");}private void initClickEvent(){btn_one.setOnClickListener(this);btn_two.setOnClickListener(this);btn_three.setOnClickListener(this);btn_four.setOnClickListener(this);btn_five.setOnClickListener(this);btn_six.setOnClickListener(this);btn_seven.setOnClickListener(this);btn_eight.setOnClickListener(this);btn_nine.setOnClickListener(this);btn_zero.setOnClickListener(this);btn_aliquot.setOnClickListener(this);btn_divide.setOnClickListener(this);btn_multiply.setOnClickListener(this);btn_subtract.setOnClickListener(this);btn_point.setOnClickListener(this);btn_equal.setOnClickListener(this);btn_add.setOnClickListener(this);btn_c.setOnClickListener(this);btn_ce.setOnClickListener(this);btn_rightBracket.setOnClickListener(this);btn_leftBracket.setOnClickListener(this);} }計算表達式代碼:
package com.example.newcalculator;import java.util.*;//計算 2*(4+(88-86)/2)//計算 2*(4+(88-86)/2)class Caculater {private String[] sArry;//存分割后的字符串private Stack<String> houx = new Stack<String>();private Stack<String> fuhao = new Stack<String>();//結構初始化Caculater(String str) {int i = str.length() - 1;String temp = "";int j = 0;Boolean bool = true;//在符號左右各添加一個#字符劃分while (true) {if (!bool) break;if (i == j) {bool = false;}if (str.charAt(j) == '+'|| str.charAt(j) == '-'|| str.charAt(j) == '*'|| str.charAt(j) == '/'|| str.charAt(j) == '('|| str.charAt(j) == ')') {temp += '#';temp += str.charAt(j);temp += '#'; //填完后是2#*##(#4#+##(#88#-#86#)##/#32#)#} else {temp += str.charAt(j);}j++;}sArry = temp.split("#+");//用正則表達式分割成字符串,#+表示一個或多個#字符//結果:[2,*,(,4,+,(,88,-,85,),/,2,)]}//后序排列public void backsort() {//循環sArryfor (int i = 0; i < sArry.length; i++) {//如果不是字符,就直接push入houx棧if (!sArry[i].equals("+")&& !sArry[i].equals("-")&& !sArry[i].equals("*")&& !sArry[i].equals("/")&& !sArry[i].equals("(")&& !sArry[i].equals(")")) {houx.push(sArry[i]);continue;//否則是字符,若符號棧為空,直接入棧} else if (fuhao.isEmpty()) {fuhao.push(sArry[i]);continue;//如果為(括號,直接入符號棧} else if (sArry[i].equals("(")) {fuhao.push(sArry[i]);continue;//如果為)括號} else if (sArry[i].equals(")")) {/*** 不斷出棧直到(括號出現**/while (!fuhao.peek().equals("(")) {houx.push(fuhao.pop());}fuhao.pop();//清掉(括號//如果不為空,且要入的符號比符號棧頂的符號優先級高,則直接push入符號棧} else if (!fuhao.isEmpty() && check(sArry[i], fuhao.peek())) { //fuhao.push(sArry[i]);continue;//否則,將符號棧內優先級高的符號出棧,push入houx棧,再將符號存進符號棧} else {houx.push(fuhao.pop());fuhao.push(sArry[i]);continue;}}//遍歷完后,直接將符號棧內的依次出棧,push入houx棧while (!fuhao.isEmpty()) {houx.push(fuhao.pop());}//結果是:2 4 88 86 - 2 / + * 棧內順序}//check對比優先級private boolean check(String a, String b) {//如果符號棧內是(括號,直接返trueif (b.equals("(")) {return true;}//如果符號棧內的優先級比要入的高,返回falseif ((b.equals("*") || b.equals("/")) && (a.equals("+") || a.equals("-"))) { //b>areturn false;}//。。。。。。。。。。。。。的低,返回trueif ((b.equals("+") || b.equals("-")) && (a.equals("*") || a.equals("/"))) { //b<areturn true;}return false;}//出棧計算public Double suan() {backsort();//后序排列//結果棧endStack<Double> end = new Stack<Double>();//遍歷houx棧for (int i = 0; i < houx.size(); i++) {//如果是加號,end pop出來兩個數字,計算后結果入棧if (houx.get(i).equals("+")) {Double b = end.pop();Double a = end.pop();end.push(a + b);continue;//如果是減號,end pop出棧兩個數字,計算后結果入棧} else if (houx.get(i).equals("-")) {Double b = end.pop();Double a = end.pop();end.push(a - b);continue;//如果是乘號,end pop出棧兩個數字,計算后結果入棧} else if (houx.get(i).equals("*")) {Double b = end.pop();Double a = end.pop();end.push(a * b);continue;//如果是除號,end pop出棧兩個數字,計算后結果入棧} else if (houx.get(i).equals("/")) {Double b = end.pop();Double a = end.pop();end.push(a / b);continue;} else if (houx.get(i).isEmpty()) {continue;} else {//不是符號,也就是數字的情況,Integer.parseInt轉int型, push入棧end.push(Double.parseDouble(houx.get(i)));}}//輸出結果return end.pop();}}public class Calculator {static String str="";public Double Eval(String str){//結構化Caculater cl = new Caculater(str);//計算Double result = cl.suan();return result;} }?
總結
以上是生活随笔為你收集整理的Android计算器(计算表达式,能计算小数点以及括号)方法简单易懂的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: ElementUI 图标Icon
- 下一篇: JSD-2204-续Docker命令-布
