java实现字符串四则运算公式解析工具类的方法
项目中用到用户定义运算公式进行就算的需求,这样需要进行字符串四则运算解析,下面提供字符串公式四则运算解析与计算工具类,需要的同学可参考。
工具类如下:FormulaCalculator.java:
packageorg.nercita.bcp.record.util;
importjava.util.ArrayList;
importjava.util.LinkedList;
/**
*@authorzhangwenchao
*@since2016-08-26
*公式计算的工具类
*/
publicclassFormulaCalculator{
privatestaticbooleanisRightFormat=true;
publicstaticdoublegetResult(Stringformula){
doublereturnValue=0;
try{
returnValue=doAnalysis(formula);
}catch(NumberFormatExceptionnfe){
System.out.println("公式格式有误,请检查:"+formula);
}catch(Exceptione){
e.printStackTrace();
}
if(!isRightFormat){
System.out.println("公式格式有误,请检查:"+formula);
}
returnreturnValue;
}
privatestaticdoubledoAnalysis(Stringformula){
doublereturnValue=0;
LinkedListstack=newLinkedList();
intcurPos=0;
StringbeforePart="";
StringafterPart="";
Stringcalculator="";
isRightFormat=true;
while(isRightFormat&&(formula.indexOf('(')>=0||formula.indexOf(')')>=0)){
curPos=0;
for(chars:formula.toCharArray()){
if(s=='('){
stack.add(curPos);
}elseif(s==')'){
if(stack.size()>0){
beforePart=formula.substring(0,stack.getLast());
afterPart=formula.substring(curPos+1);
calculator=formula.substring(stack.getLast()+1,curPos);
formula=beforePart+doCalculation(calculator)+afterPart;
stack.clear();
break;
}else{
System.out.println("有未关闭的右括号!");
isRightFormat=false;
}
}
curPos++;
}
if(stack.size()>0){
System.out.println("有未关闭的左括号!");
break;
}
}
if(isRightFormat){
returnValue=doCalculation(formula);
}
returnreturnValue;
}
privatestaticdoubledoCalculation(Stringformula){
ArrayListvalues=newArrayList();
ArrayListoperators=newArrayList();
intcurPos=0;
intprePos=0;
intminus=0;
for(chars:formula.toCharArray()){
if((s=='+'||s=='-'||s=='*'||s=='/')&&minus!=0&&minus!=2){
values.add(Double.parseDouble(formula.substring(prePos,curPos).trim()));
operators.add(""+s);
prePos=curPos+1;
minus=minus+1;
}else{
minus=1;
}
curPos++;
}
values.add(Double.parseDouble(formula.substring(prePos).trim()));
charop;
for(curPos=0;curPos<=operators.size()-1;curPos++){
op=operators.get(curPos).charAt(0);
switch(op){
case'*':
values.add(curPos,values.get(curPos)*values.get(curPos+1));
values.remove(curPos+1);
values.remove(curPos+1);
operators.remove(curPos);
curPos=-1;
break;
case'/':
values.add(curPos,values.get(curPos)/values.get(curPos+1));
values.remove(curPos+1);
values.remove(curPos+1);
operators.remove(curPos);
curPos=-1;
break;
}
}
for(curPos=0;curPos<=operators.size()-1;curPos++){
op=operators.get(curPos).charAt(0);
switch(op){
case'+':
values.add(curPos,values.get(curPos)+values.get(curPos+1));
values.remove(curPos+1);
values.remove(curPos+1);
operators.remove(curPos);
curPos=-1;
break;
case'-':
values.add(curPos,values.get(curPos)-values.get(curPos+1));
values.remove(curPos+1);
values.remove(curPos+1);
operators.remove(curPos);
curPos=-1;
break;
}
}
returnvalues.get(0).doubleValue();
}
publicstaticvoidmain(String[]args){
System.out.println(FormulaCalculator.getResult("3-(4*5)+5"));
System.out.println(FormulaCalculator.getResult("7/2-(-4)"));
System.out.println(FormulaCalculator.getResult("1287763200000-1276272000000")/(3600*24*1000));
}
}
支持四则运算,同时支持负数解析。
另附,小数数据保留位数工具类,SetNumberPrecision.java
packageorg.nercita.bcp.record.util;
importjava.text.DecimalFormat;
/**
*@authorzhangwenchao
*小数点精度的工具类
*/
publicclassSetNumberPrecision{
publicstaticStringsetNumberPrecision(doublex,intNumber){
Stringp="#########0";
if(Number==0){
p="#########0";
}else{
p="#########0.";
for(inti=0;i
以上这篇java实现字符串四则运算公式解析工具类的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。