java表达式计算器_做了个Java表达式计算器

# re: 做了个Java表达式计算器

2008-03-12 12:28

lvq810

import java.util.regex.*;

import java.util.*;

/**

*利用正则式计算表达式的值

*@author: Eastsun

*@version: 0.5 07.2.26

*/

public class Calculate{

public static final String NUM_PATTERN = //数字的匹配模式

"(?:(?<=[\\+\\-\\*\\(/]|^)[+-]|)" //前缀判断,判断前面的+-是否为符号

+"(?:" //数字及小数点部分, 0. 以及 .0 都是合法的数字

+"(?:\\d*\\.)?\\d+|" //.0 的情形

+"\\d+(?:\\.\\d*)?" //0. 的情形

+")"

+"(?!\\d|\\.)"; //边界条件

public static final String BRA_PATTERN =

"\\((NUM)\\)".replace("NUM",NUM_PATTERN);

public static final String ADD_PATTERN =

"(NUM)\\+(NUM)".replace("NUM",NUM_PATTERN);

public static final String SUB_PATTERN =

"(NUM)-(NUM)".replace("NUM",NUM_PATTERN);

public static final String MUL_PATTERN =

"(NUM)\\*(NUM)".replace("NUM",NUM_PATTERN);

public static final String DIV_PATTERN =

"(NUM)/(NUM)".replace("NUM",NUM_PATTERN);

public static final Pattern BRA =Pattern.compile(BRA_PATTERN);

public static final Pattern ADD_OR_SUB =Pattern.compile("(?<=[^\\+\\-\\*/]|^)(?:"+ADD_PATTERN+"|"+SUB_PATTERN+")(?=[^\\*/]|$)");

public static final Pattern MUL_OR_DIV =Pattern.compile("(?

private static double operator(Matcher m,int index){

index =index*2;

double a,b;

if(m.group(1)!=null){

a =Double.parseDouble(m.group(1));

b =Double.parseDouble(m.group(2));

}

else{

index ++;

a =Double.parseDouble(m.group(3));

b =Double.parseDouble(m.group(4));

}

double r =0.0;

switch(index){

case 0:

r =a+b;

break;

case 1:

r =a-b;

break;

case 2:

r =a*b;

break;

case 3:

r =a/b;

break;

}

return r;

}

public static double eval(String str){

StringBuilder sb =new StringBuilder(str.replaceAll("\\s+",""));

while(true){

Matcher m =BRA.matcher(sb);

if(m.find()){

sb.replace(m.start(),m.end(),m.group(1));

}

else{

int index =1;

m =MUL_OR_DIV.matcher(sb);

if(!m.find()){

index --;

m =ADD_OR_SUB.matcher(sb);

if(!m.find()) break;

}

sb.replace(m.start(),m.end(),""+operator(m,index));

}

}

return Double.parseDouble(sb.toString());

}

public static void main(String[] args){

Scanner scan =new Scanner(System.in);

while(true){

System.out.print("\nEnter a expression :");

String str =scan.next();

if(str.equals("exit")) break;

System.out.print(str +" = "+eval(str));

}

}

}  回复  更多评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值