第27篇 Android Studio无括号计算器(一)布局及算式问题说明
- 1.需求说明
- 1.1.计算器样式
- 1.2.算式输入问题
- 1.3.layout_main.xml布局代码
1.需求说明
无括号计算器目的就是实现能够计算3+6*8-8/2+6+9这样的算式,因为不包括括号,所以比较好实现,当然就算有括号也可以很好实现,因为学数据结构时学过算式中括号的处理方法。
1.1.计算器样式
计算器的界面效果如上图。
如上一篇所说,我目前使用的都是线性布局。
这个计算器的界面,整体上是一个垂直布局V1。
然后下面一排排的涉及水平布局和垂直布局。
首先:
第一排C,D,*,/是一个水平布局H1。
第二排7,8,9,+是一个水平布局H2。
第三排4,5,6,-是一个水平布局H3。
然后:
要使‘=’号占两行,‘0’占两列。则可使1,2,3,0,.,=这六个符号是在一个水平布局内H4,而’='号独占一列,1,2,3,0,.,在一个垂直布局V2内,而且,1,2,3独自在一个水平布局内H5,0,.独自在一个水平布局H6内。
那么我们可以看出,有6个水平布局,2个垂直布局。
<V1
EditText//输入框
<H1
C D * /
</H1>
<H2
7 8 9 +
</H2>
<H3
4 5 6 -
</H3>
<H4
<V2
<H5
1 2 3
</H5>
<H6
0 .
</H6>
</V2>
=
</H4>
</v1>
在.xml文件中布局就是这样了。
1.2.算式输入问题
因为没有添加括号,所以就只能解决简简单单单点的算式,比如:
23+2+38+9/3;
-8+28/7+34-23-43;等。
问题(1):式子为9++6含多个运算符连在一起
怎么解决这个问题呢,既然计算简单的式子,那么就可以设置不能输入多个运算符,那么在输入运算符时,我们先获取式子的最后一个字符,如果该字符为运算符或者‘.’,则不在式子后加入刚输入的运算符,若该字符为数字,则我们在式子尾部加入刚输入的运算符。
String str_end = str_formula.substring(str_formula.length() - 1);
boolean end_isOperator = str_end.equals("+") || str_end.equals("-")||str_end.equals("*")||str_end.equals("/");
if(!end_isOperator){
Button btn_char = findViewById(view.getId());
String str_endChar = btn_char.getText().toString();
str_formula = str_formula + str_endChar;
edit_formula.setText(str_formula);
}
问题(2):式子中4.4.4.4.22数字多个小数点
如果不设置的话,输入的时候是会出现这样的情况的,如果不小心输入,那么计算时就会出现不必要的错误,因为把字符串转成数字时,会使运行出错。
首先我们能够输入小数点,那么这个字符串的最后一位肯定是数字。那么我们可以设置输入这个小数点时,先判断它前面的数字是否已经有了小数点,如果没有就加上,有就不加。
String str = before(str_formula.length(),str_formula);//获取最后一个数字的函数,自己写的
int count = 0;
for(int i = 0;i < str.length();i++){
if(str.charAt(i) == '.'){
count++;
}
}
if(count >= 1){
Toast.makeText(MainActivity.this,"一个数不能使用多个小数点",Toast.LENGTH_SHORT).show();
}
else{
Button btn_char = findViewById(view.getId());
String str_endChar = btn_char.getText().toString();
str_formula = str_formula + str_endChar;
edit_formula.setText(str_formula);
}
问题(3):负数输入问题
计算中肯定要涉及负数的,但是因为没有括号的问题,只能使得算式中的第一位是数字,其他的不能输入为负数,其他只能作为运算符了。
而第一位可以输入为负数的操作很简单,那就是输入框为空的时候输入就好了。
if(str_formula.equals("")){
if(view.getId() == R.id.btn_sub){
Button btn_char = findViewById(view.getId());
String str_endChar = btn_char.getText().toString();
str_formula = str_formula + str_endChar;
edit_formula.setText(str_formula);
}
else{
Toast.makeText(MainActivity.this,"请先输入数字",Toast.LENGTH_SHORT).show();
}
}
这样就大概把输入的一些问题解决了。
下面给出布局文件代码。
1.3.layout_main.xml布局代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
tools:context=".MainActivity">
<EditText
android:id="@+id/edit_formula"
android:layout_width="270dp"
android:layout_height="150dp"
android:textSize="20sp"
android:autofillHints="1" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_clear"
android:layout_width="60dp"
android:layout_height="50dp"
android:text="@string/btn_clear_name"
style="@style/Base.CardView"/>
<Button
android:id="@+id/btn_delete"
android:layout_width="60dp"
android:layout_height="50dp"
android:text="@string/btn_delete_name"
android:layout_marginStart="10dp"
style="@style/Base.CardView"/>
<Button
android:id="@+id/btn_mul"
android:layout_width="60dp"
android:layout_height="50dp"
android:text="@string/btn_mul_name"
android:layout_marginStart="10dp"
style="@style/Base.CardView"/>
<Button
android:id="@+id/btn_div"
android:layout_width="60dp"
android:layout_height="50dp"
android:text="@string/btn_div_name"
android:layout_marginStart="10dp"
style="@style/Base.CardView"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_7"
android:layout_width="60dp"
android:layout_height="50dp"
android:text="@string/btn_7_name"
style="@style/Base.CardView"/>
<Button
android:id="@+id/btn_8"
android:layout_width="60dp"
android:layout_height="50dp"
android:text="@string/btn_8_name"
android:layout_marginStart="10dp"
style="@style/Base.CardView"/>
<Button
android:id="@+id/btn_9"
android:layout_width="60dp"
android:layout_height="50dp"
android:text="@string/btn_9_name"
android:layout_marginStart="10dp"
style="@style/Base.CardView"/>
<Button
android:id="@+id/btn_add"
android:layout_width="60dp"
android:layout_height="50dp"
android:text="@string/btn_add_name"
android:layout_marginStart="10dp"
style="@style/Base.CardView"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_4"
android:layout_width="60dp"
android:layout_height="50dp"
android:text="@string/btn_4_name"
style="@style/Base.CardView"/>
<Button
android:id="@+id/btn_5"
android:layout_width="60dp"
android:layout_height="50dp"
android:layout_marginStart="10dp"
android:text="@string/btn_5_name"
style="@style/Base.CardView"/>
<Button
android:id="@+id/btn_6"
android:layout_width="60dp"
android:layout_height="50dp"
android:text="@string/btn_6_name"
android:layout_marginStart="10dp"
style="@style/Base.CardView"/>
<Button
android:id="@+id/btn_sub"
android:layout_width="60dp"
android:layout_height="50dp"
android:text="@string/btn_sub_name"
android:layout_marginStart="10dp"
style="@style/Base.CardView"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_1"
android:layout_width="60dp"
android:layout_height="50dp"
android:text="@string/btn_1_name"
style="@style/Base.CardView"/>
<Button
android:id="@+id/btn_2"
android:layout_width="60dp"
android:layout_height="50dp"
android:layout_marginStart="10dp"
android:text="@string/btn_2_name"
style="@style/Base.CardView"/>
<Button
android:id="@+id/btn_3"
android:layout_width="60dp"
android:layout_height="50dp"
android:text="@string/btn_3_name"
android:layout_marginStart="10dp"
style="@style/Base.CardView"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_0"
android:layout_width="130dp"
android:layout_height="50dp"
android:text="@string/btn_0_name"
style="@style/Base.CardView"/>
<Button
android:id="@+id/btn_point"
android:layout_width="60dp"
android:layout_height="50dp"
android:text="@string/btn_point_name"
android:layout_marginStart="10dp"
style="@style/Base.CardView"/>
</LinearLayout>
</LinearLayout>
<Button
android:id="@+id/btn_equal"
android:layout_width="60dp"
android:layout_height="100dp"
android:text="@string/btn_equal_name"
android:layout_marginStart="10dp"
style="@style/Base.CardView"/>
</LinearLayout>
</LinearLayout>
代码也不多,如果想添加什么效果的话自行添加就好。