当前访客身份:游客 [ 登录 | 加入开源中国 ]

代码分享

当前位置:
代码分享 » Java  » 手机App开发
分享到: 
收藏 +0
3
基于Android 2.3.3做的一个练手计算器。
可解析带括号的四则运算。
解析算术表达式的时候,准备调用Webkit通过Js来解析的。
但是2.3.3存在Bug,Js调用Java会导致程序崩溃,
所以没办法,最后是用 BeanShell来解析的。
不过,因为需要每个参与计算的数字都是浮点型,
才能正确无误的保留精度,因为我正则不行,过滤表达式还是花了点功夫
首个Android程序,欢迎大家给与意见和指导~
标签: Android SDK

代码片段(4) [全屏查看所有代码]

1. [图片] calc.png    

2. [文件] calculator.apk ~ 360KB     下载(3639)     [全屏预览]

3. [文件] calc-src.zip ~ 2MB     下载(17208)     [全屏预览]

4. [代码][Java]代码     跳至 [4] [全屏预览]

package com.example.calculator;


import java.util.Arrays;

import bsh.EvalError;
import bsh.Interpreter;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

/**
 * @author 铂金小龟 
 */
public class CalculatorActivity extends Activity implements OnClickListener{

	EditText rsText = null;  //显示器
	boolean isClear = false; //用于是否显示器需要被清理
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.calculator);
		
		//fun 功能按钮
		rsText = (EditText)findViewById(R.id.rsText);
		Button btnDel = (Button)findViewById(R.id.delete);
		Button btnPlu = (Button)findViewById(R.id.plus);
		Button btnMin = (Button)findViewById(R.id.minus);
		Button btnMul = (Button)findViewById(R.id.multiply);
		Button btnDiv = (Button)findViewById(R.id.division);
		Button btnEqu = (Button)findViewById(R.id.equ);
		Button btnTono = (Button)findViewById(R.id.tonone);
		Button btnLeft = (Button)findViewById(R.id.left);
		Button btnRight = (Button)findViewById(R.id.right);
		
		//num 数字按钮
		Button num0 = (Button)findViewById(R.id.num0);
		Button num1 = (Button)findViewById(R.id.num1);
		Button num2 = (Button)findViewById(R.id.num2);
		Button num3 = (Button)findViewById(R.id.num3);
		Button num4 = (Button)findViewById(R.id.num4);
		Button num5 = (Button)findViewById(R.id.num5);
		Button num6 = (Button)findViewById(R.id.num6);
		Button num7 = (Button)findViewById(R.id.num7);
		Button num8 = (Button)findViewById(R.id.num8);
		Button num9 = (Button)findViewById(R.id.num9);
		Button dot = (Button)findViewById(R.id.dot);
		
		//listener
		btnTono.setOnClickListener(this);
		btnLeft.setOnClickListener(this);
		btnRight.setOnClickListener(this);
		btnDel.setOnClickListener(this);
		btnPlu.setOnClickListener(this);
		btnMin.setOnClickListener(this);
		btnMul.setOnClickListener(this);
		btnDiv.setOnClickListener(this);
		btnEqu.setOnClickListener(this);
		  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);
		  dot.setOnClickListener(this);
	}

	@Override
	public void onClick(View e) {
		Button btn = (Button)e;
		String exp = rsText.getText().toString();
		if(isClear &&(
			  btn.getText().equals("0")
			||btn.getText().equals("1")
			||btn.getText().equals("2")
			||btn.getText().equals("3")
			||btn.getText().equals("4")
			||btn.getText().equals("5")
			||btn.getText().equals("6")
			||btn.getText().equals("7")
			||btn.getText().equals("8")
			||btn.getText().equals("9")
			||btn.getText().equals(".")) 
		||btn.getText().equals("算数公式错误")){
			rsText.setText("");
			isClear = false;
		}
		if(btn.getText().equals("C")){
			rsText.setText("");
		}else if(btn.getText().equals("清除")){ 
			if(isEmpty(exp)) return;
			else
				rsText.setText(exp.substring(0, exp.length()-1));
		}else if(btn.getText().equals("=")){
			if(isEmpty(exp)) return;
			exp = exp.replaceAll("×", "*");
			exp = exp.replaceAll("÷", "/");
			rsText.setText(getRs(exp)); 
			isClear = false;
		}else{
			rsText.setText(rsText.getText()+""+btn.getText());
			isClear = false;
		}
		//操作完成后始终保持光标在最后一位
		rsText.setSelection(rsText.getText().length());
	}

	/***
	 * @param  exp 算数表达式
	 * @return 根据表达式返回结果
	 */
	private String getRs(String exp){
			Interpreter bsh = new Interpreter();
	        Number result = null;
			try {
				exp = filterExp(exp);
				result = (Number)bsh.eval(exp);
			} catch (EvalError e) {
				e.printStackTrace();
				isClear = true;
				return "算数公式错误";
			}        
			exp = result.doubleValue()+"";
			if(exp.endsWith(".0"))
				exp = exp.substring(0, exp.indexOf(".0"));
			return exp;
	}

		
	/**
	 * 因为计算过程中,全程需要有小数参与,所以需要过滤一下
	 * @param exp 算数表达式
	 * @return 
	 */
	private String filterExp(String exp) {
		String num[] = exp.split("");
		String temp = null;
		int begin=0,end=0;
		 for (int i = 1; i < num.length; i++) {
			 temp = num[i];
			 if(temp.matches("[+-/()*]")){
				 if(temp.equals(".")) continue;
				 end = i - 1;  
				 temp = exp.substring(begin, end);
				 if(temp.trim().length() > 0 && temp.indexOf(".")<0)
					 num[i-1] = num[i-1]+".0";
				 begin = end + 1;
			 }
		 }
		 return Arrays.toString(num).replaceAll("[\\[\\], ]", "");
	}
	
	/***
	 * @param str
	 * @return 字符串非空验证
	 */
	private boolean isEmpty(String str){
		return (str==null || str.trim().length()==0);
	}
	
}


开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

发表评论 回到顶部 网友评论(77)

  • 1楼:1001 发表于 2013-01-09 11:22 回复此评论
    和小猪有什么关系。
  • 2楼:寂寞端口 发表于 2013-01-09 12:29 回复此评论

    喜欢里面的页面

  • 3楼:铂金小鸟 发表于 2013-01-09 19:42 回复此评论
    @铂金小猪 @皮总 @蟋蟀哥哥 @红薯 @虫虫 @迷途的书童 @铂金小猫 @铂金苍鹰 @廖斯的情人 

    很漂亮啊
  • 4楼:虫虫 发表于 2013-01-09 19:44 回复此评论
    我记得在大一的时候用 Java 做个一个多项式的计算器~~
  • 5楼:loki_lan 发表于 2013-01-09 22:03 回复此评论
    不错,铂金家人才多。你可以在xml里面加个的Button里面加个android:onClick=“doClick”属性来管理事件比较好,没那么多冗余代码,在Activity里面写个public void doClick(View target){}来处理。
  • 6楼:铂金小龟 发表于 2013-01-09 22:10 回复此评论

    引用来自“铂金小猫”的评论

    不错,铂金家人才多。你可以在xml里面加个的Button里面加个android:onClick=“doClick”属性来管理事件比较好,没那么多冗余代码,在Activity里面写个public void doClick(View target){}来处理。
    @铂金小猫 ,原来可以把监听写在XML里面哦,晚点试一下。还有什么其他可以减少的冗余代码么。第一个Android程序,需要大家指导啊~
  • 7楼:铂金苍鹰 发表于 2013-01-10 08:34 回复此评论
    雄起,建议马上做个坦克大战 挂到商店去每个月赚10块钱
  • 8楼:丁杨帆 发表于 2013-01-10 10:36 回复此评论

    引用来自“铂金苍鹰”的评论

    雄起,建议马上做个坦克大战 挂到商店去每个月赚10块钱
    哈哈。无语。
  • 9楼:铂金小鸟 发表于 2013-01-10 12:58 回复此评论

    引用来自“铂金苍鹰”的评论

    雄起,建议马上做个坦克大战 挂到商店去每个月赚10块钱
    哈哈,¥10.
  • 10楼:WJI 发表于 2013-01-13 10:21 回复此评论

    楼主  请问你的代码怎么没有写按键的位置   怎么做出来的

  • 11楼:铂金小龟 发表于 2013-01-14 15:02 回复此评论

    引用来自“WJI”的评论

    楼主  请问你的代码怎么没有写按键的位置   怎么做出来的

    android控件位置都是可以在写在XML中的,并且鼓励这么做。
  • 12楼:tim1888 发表于 2013-01-15 04:32 回复此评论
    不错啊
  • 13楼:铂金小龟 发表于 2013-01-15 09:12 回复此评论

    引用来自“tim1888”的评论

    不错啊
    深夜~~~4点32分~
  • 14楼:铂金小狼 发表于 2013-01-15 14:56 回复此评论
    顶小龟一个
  • 15楼:铂金小龟 发表于 2013-01-15 18:14 回复此评论

    引用来自“铂金小狼”的评论

    顶小龟一个
    @铂金小狼 ,谢谢谢谢。内牛满面~
  • 16楼:福州软件园小菜鸟 发表于 2013-01-16 14:54 回复此评论

    引用来自“虫虫”的评论

    我记得在大一的时候用 Java 做个一个多项式的计算器~~
    大一 就这么厉害了啊
  • 17楼:真实 发表于 2013-01-16 15:20 回复此评论
    这么多代码的
  • 18楼:tim1888 发表于 2013-01-16 15:21 回复此评论
    大一就这么水平,还是不错的
  • 19楼:打杂程序猿 发表于 2013-01-16 15:24 回复此评论

    引用来自“铂金小龟”的评论

    引用来自“铂金小猫”的评论

    不错,铂金家人才多。你可以在xml里面加个的Button里面加个android:onClick=“doClick”属性来管理事件比较好,没那么多冗余代码,在Activity里面写个public void doClick(View target){}来处理。
    @铂金小猫 ,原来可以把监听写在XML里面哦,晚点试一下。还有什么其他可以减少的冗余代码么。第一个Android程序,需要大家指导啊~
    这里要注意打混淆包的时候...记得...保持方法名...
  • 20楼:一凡8 发表于 2013-01-29 12:28 回复此评论
    filterExp(String exp)中,有一个小Bug:应该将空格也替换,不然在>=两位数运算时报异常
    Arrays.toString(num).replaceAll("[\\[\\], ]", "");
开源从代码分享开始 分享代码
铂金小龟的其它代码 全部(1)...