2015-9-20计算器小结

突然想对上次的计算器进行一个小小结:

虽然这是一个很简单的入门APP,但是当时在我不了解的情况下,也涉及一些版本设计的不同,做一个小的总结,对一些新知识的学习

我先整体上给出一个概述,再进行一些小的知识的补充:

先强调一下,这是一个很简易的计算器,也就是数字+四则运算+清除

我现在都有点忘了,所以说,好记性不如烂笔头,当时就应该记下来,我现在就简单回顾一下;

初期我是做了一个这样的:我就简单的dang了一个,实现两个数字的四则运算,然后看懂了运行ok然后就交上去了,后来被拿回来做了修改

后期让我改一下变成这样:需要加入括号和显示式子在屏幕上;然后我就慌了,后来又dang了学习理解了;


从初期到修改主要做的改变是:

初期计算器:只是将四则运算全部在程序中运行,很多的case判断,结合内部简单的math类进行运算,会涉及一些标志位flag来进行判别达到状态的修改和判定,功能单调且只能进行两个数字的计算,不能显示计算式子;

后来修改的计算器:虽然也是一个文件但是将计算的部分进行了正则表达式匹配和转换,这样使得括号和整个式子增加计算的参数个数都进行了丰富和提升;那我就主要进行改进后的计算器进行一个简单分析:

除了一般常用的包还需导入:主要进行浮点数和正则表达式的处理;

import bsh.EvalError;
import bsh.Interpreter;

接下就是初始化一些工作,引入button,设置监听器,在监听器的判断中得到各个状态的处理;----其中会涉及到调用后面的两个内部函数

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 功能按钮
//num 数字按钮
//listener
省略此部分代码~~
}

@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(exp==null || exp.trim().length()==0)
return; 
else
rsText.setText(exp.substring(0, exp.length()-1));//substring裁剪子字符串
}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"));//去除尾部的。0操作
}
rsText.setText(exp); 
isClear = false;
}else{//如果不是上面的:清除、C、=,则顺序执行下面的rsText+btn显示到界面上
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);  //将字符串转换成代码执行结果.eval强大!
} catch (EvalError e) {
e.printStackTrace();
isClear = true;
return "算数公式错误";
}        
return result.floatValue()+"";

}


        /**
* @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("[+-/()*]")){//正则表达式,用于满足任何一个【】内部的字符则返回true
if(temp.equals(".")) continue;
end = i - 1;  
temp = exp.substring(begin, end);
if(temp.trim().length() > 0 && temp.indexOf(".")<0)//整数浮点补零。0
num[i-1] = num[i-1]+".0";
begin = end + 1;
}
}
return Arrays.toString(num).replaceAll("[\\[\\], ]", "");

}

本来我是贴了代码片的,不知道怎么访问被拒绝,然后就不见了尴尬那就用这种low的展示方式吧,简单记一下正则表达式的学习;

下面进行一些正则表达式的学习,简单的记录一下初期的学习:

Regular Expression,在代码中常简写为regex、regexp或RE;许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎;

主要分析一下下面几个小函数:

.matches():正则表达式,用于满足任何一个【】内部的字符则返回true;

java.lang包中的String类,java.util.regex包中的Pattern,Matcher类中都有matches()方法;都与正则表达式有关

在.matches("")的双括号中,就是一串字符串,根据内部的语法参数进行正则表达式的处理;具体的语法写几个简单的:

\d :匹配一个数字字符。等价于[0-9]

x|y :匹配x或y。例如,“z|food”能匹配“z”或“food”或"zood"(此处请谨慎)。“(z|f)ood”则匹配“zood”或“food”

[xyz] :字符集合,匹配所包含的任意 一个字符。例如,“[abc]”可以匹配“plain”中的“a”

[^xyz] :负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”

\w :匹配包括下划线的任何单词字符。类似但不等价于“[A-Za-z0-9_]”,这里的"单词"字符使用Unicode字符集


substring:

substring(参数)是java中截取字符串的一个方法;有两种传参方式
一种是public String substring(int beginIndex)
返回一个新的字符串,它是此字符串的一个子字符串。该子字符串从指定索引处的字符开始,直到此字符串末尾。
另一种是public String substring(int beginIndex, int endIndex)
返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符。因此,该子字符串的长度为 endIndex-beginIndex

Interpreter():

eval()函数:可将字符串转换为代码执行,并返回一个或多个值

split("")split() 方法用于把一个字符串分割成字符串数组

stringObject.split(separator,howmany)
separator 必需。字符串或正则表达式,从该参数指定的地方分割 stringObject。
howmany 可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。

如果把空字符串 ("") 用作 separator,那么 stringObject 中的每个字符之间都会被分割

eg:将分割结构更为复杂的字符串:

"2:3:4:5".split(":") //将返回["2", "3", "4", "5"]

"|a|b|c".split("|") //将返回["", "a", "b", "c"]





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值