5
回答
网上下载的计算器代码部分看不懂,安卓新手,求助,谢谢!
百度AI开发者大赛带你边学边开发,赢100万奖金,加群:418589053   
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;

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();//获取一个视图View对象里的字符串
		if(isClear &&(
			  btn.getText().equals("0")          //判断获取的字符串是否是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(exp==null || exp.trim().length()==0) //trim()去掉字符串头尾的空格
				return; 
			else
				rsText.setText(exp.substring(0, exp.length()-1));//返回一个从0到exp.length()-1的字符串
		}else if(btn.getText().equals("=")){
			if(exp==null || exp.trim().length()==0)
				return; 
			exp = exp.replaceAll("×", "*");         //替换符号
			exp = exp.replaceAll("÷", "/");
			exp = getRs(exp);
			if(exp.endsWith(".0")){
				exp = exp.substring(0, exp.indexOf(".0"));//indexOf()返回 String 对象内第一次出现子字符串的字符位置
			}
			rsText.setText(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 "算数公式错误";
			}        
			return result.doubleValue()+"";
	} 

		
	/**
	 * @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("[\\[\\], ]", "");
	}
	
	

	
}
filterExp函数时做什么用的看不懂,求助,谢谢!

                    
举报
尼克FD
发帖于5年前 5回/903阅
共有5个答案 最后回答: 5年前

遇到小数,比如 5+2.4 就转换为 5.0+2.4

目的是保持类型统一

--- 共有 3 条评论 ---
尼克FD百度解决了嘿,打扰啦,Thank you~ 5年前 回复
尼克FD不好意思再问个问题嘿,127行 bsh.eval(exp)返回的值是什么类型的呀,是想进行浮点数精度的处理,想通过把数值保留几位小数来处理,但是找了网上的方法好像都是处理double型的,谢谢您! result = result.doubleValue();这个可以把result转换成double型吗?好像用了还是不行…… 嘿嘿,我也是福建的哈泉州 5年前 回复
尼克FD哦哦,懂了,太谢谢了~ 5年前 回复
private String getRs(String exp){
	        double result;
			try {
				exp = filterExp(exp);
				result = eval(exp);     
				BigDecimal b = new BigDecimal(result);
				//四舍五入,保留十位小数.
				int saveBitNum = 10;
				result = b.setScale(saveBitNum , BigDecimal.ROUND_HALF_UP).doubleValue();
			} catch (EvalError e) {
				e.printStackTrace();     //打印在控制台上
				isClear = true;
				return "算数公式错误";
			}        
			return result+"";
	} 

		
	private static double eval(String expression) throws EvalError {
        Interpreter bsh = new Interpreter();
        Number result = (Number)bsh.eval(expression);  //返回表达式的结果      
        return result.doubleValue();
    }

改成这样解决精度问题……有点假,保留十位小数……
我勒个草,这个不是我的计算器么。
--- 共有 2 条评论 ---
陈旺旺仔 133行也完全不知道神马意思? return result.doubleValue()+""; 4年前 回复
陈旺旺仔 小龟大神,请问第156行的内容是什么意思啊?完全不懂,到底是用什么替换成什么? return Arrays.toString(num).replaceAll("[\\[\\], ]", ""); 4年前 回复
你怎么不问我原作者呢。
--- 共有 1 条评论 ---
尼克FD好吧我错了……我忘了是哪里下的啦嘿嘿,不好意思哈,下了好多个然后挑个简单的看…… 5年前 回复
顶部