android 字符串转小数点,Android实现计算器(计算表达式/计算小数点以及括号)...
本文实例为大家分享了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">
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#aaaaaa">
android:layout_width="0dp"
android:layout_height="200dp"
android:layout_column="0"
android:gravity="right"
android:layout_weight="1">
android: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" />
android: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" />
android: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" />
android: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" />
android: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" />
android: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" />
android: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" />
android: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" />
android: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" />
android: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" />
android: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" />
android: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" />
android: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" />
android: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" />
android: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" />
android: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" />
android: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" />
android: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" />
android: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" />
android: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" />
android: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" />
android: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" />
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; //1
Button btn_two; //2
Button btn_three; //3
Button btn_four; //4
Button btn_five; //5
Button btn_six; //6
Button btn_seven; //7
Button btn_eight; //8
Button btn_nine; //9
Button btn_zero; //0
Button btn_c; //c
Button btn_ce; //ce
Button btn_aliquot; //%
Button btn_divide; //除号
Button btn_multiply;//x
Button btn_subtract;//-
Button btn_add; //+
Button btn_point; //.
Button btn_equal; //=
Button btn_leftBracket;//(
Button btn_rightBracket;//)
EditText contentBox;
@Override
protected 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);
}
@Override
public 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 houx = new Stack();
private Stack fuhao = new Stack();
//结构初始化
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() {
//循环sArry
for (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) {
//如果符号栈内是(括号,直接返true
if (b.equals("(")) {
return true;
}
//如果符号栈内的优先级比要入的高,返回false
if ((b.equals("*") || b.equals("/")) && (a.equals("+") || a.equals("-"))) { //b>a
return false;
}
//。。。。。。。。。。。。。的低,返回true
if ((b.equals("+") || b.equals("-")) && (a.equals("*") || a.equals("/"))) { //b
return true;
}
return false;
}
//出栈计算
public Double suan() {
backsort();//后序排列
//结果栈end
Stack end = new Stack();
//遍历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 字符串转小数点,Android实现计算器(计算表达式/计算小数点以及括号)...相关推荐
- java 线性计算器_java版科学计算器,支持表达式计算
<java版科学计算器,支持表达式计算>由会员分享,可在线阅读,更多相关<java版科学计算器,支持表达式计算(12页珍藏版)>请在人人文库网上搜索. 1.程序设计综合设计题目 ...
- android字符串显示textview,Android编程:TextView不显示完整字符串
我有一个TextView,我试图使显示一个基于2d字符的网格.在我的Java代码中,我创建了一个2d数组,我将该数组填充到字符串中,并将每个条目附加到另一个,并在达到数组行的末尾时添加换行符(.n). ...
- android 字符串折线图,Android + MPAndroidChart 实现折线、柱形和饼状图
本文讲讲怎么用 MPAndroidChart 框架实现折线图.柱形图.饼图,并且进行样式设置,达到和宣传图差不多的效果. 一开始看到 MPAndroidChart 的各种图表介绍图感觉很好看,但是直接 ...
- android字符串末尾添加,android在textview编辑的末尾追加''
理由 :宽度"a"小于"a",因此,如果基于某种大小(比如15个字母)截断字符串并通过代码添加"-".你可能会看到意想不到的结果. 现在来看 ...
- 计算表达式结果(支持带括号的加减乘除以及乘幂和小数运算)
以(1.22+((3.43+54.54)*8^3*9)-3*(2+4*2-1))/10+9^3这个表达式为例吧.首先先分析一下这个表达式,有括号,括号的优先级最高,其次有乘幂和乘除,应该是先算乘幂再算 ...
- android 字符串转bitmap,android – 如何将Base64字符串转换为BitMap图像显示在ImageView?...
我有一个Base64字符串,表示一个BitMap图像. 我需要将该字符串转换为BitMap图像,以使用它在ImageView在我的Android应用程序 怎么做? 这是我用来将图像转换为base64字 ...
- android 字符串 时间格式化,Android 获取年月日时分秒 格式化指定时间字符串
1.获取Android系统当前时间年月日 时分秒(24小时制) //获取当前时间 Time time=new Time(); time.setToNow(); Log.i("cp" ...
- android 字符串转浮点,Android String类型转换为float、double和int的工具类方法
在做项目时遇到了需要把年份(String)转换为int类型,对年份进行比较,顺便提取为方法,保存下来方便以后使用. public class ConvertUtil { //把String转化为flo ...
- Android计算器(计算表达式,能计算小数点以及括号)方法简单易懂
布局代码: <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android ...
最新文章
- python 写入网络视频文件很慢_OpenCV视频写入详解_Python,视频保存0kb问题
- 转载--redis密码管理
- linuxsed替换字符串后保存_字符串方法——replace()
- mysql查询并设置高亮_慢查询分析调优工具~mysqldumpslow
- .NET 开源免费图表组件库,Winform,WPF 通用
- linux mint视频,Linux Mint 20.1 beta 发布,新增免费视频播放器
- oracle判断是否是手机号码,oracle判断手机号码是否合法
- SU(Seismic Unix)与CUDA的混合编程
- python散点图拟合曲线如何求拟合_python 拟合曲线并求参
- Python使用xpath爬取51job
- 教你从进程中判断病毒木马的存在
- FastNetMon 使用笔记
- 华为交换机eth口作用_华为5700交换机eth接口做什么用的?怎么使用它?
- 时序逻辑电路的设计(一) -- 模10的计数器电路(附Multisim)
- Python 强制限定小数点位数
- 告别传统IT 信天通信助推教育行业云化变革
- 谷歌浏览器访问抖音网页版白屏
- c语言响铃编程,C语言C加加编程新手快速入门基础学习
- 【100个 Unity实用技能】| 关于触发器互相检测的必要前提条件配置
- 比亚迪“亮刀”、宁德时代“狂奔”,动力电池市场的巨头混战几时休?
热门文章
- 黑客‘劫持’了一颗卫星,用它直播黑客大会和放电影,并且还完全合法?
- Picked up _JAVA_OPTIONS: -Xmx900M”
- Flink实战(九十三):数据倾斜(二)keyby 窗口数据倾斜的优化
- 1163: [Baltic2008]Mafia
- 网络图片加载缓慢问题解决方案
- 江西专升本考试作弊事件,为什么最近考试作弊事件频发?
- python中stringvar的用法_Python tkinter.StringVar方法代码示例
- IMM管理口收集日志
- JSON树节点的增删查改
- 来不及细说,毕业三天靠Python兼职赚了两千