文本四则运算解析工具与浮点数小数精度保留工具

1、文本四则公式解析工具类:

package org.nercita.ntp.summary.util;
import java.util.ArrayList;
import java.util.LinkedList;
/**
 * @author zhangwenchao
 * @since 2017-07-6
 * 公式解析计算的工具类
 */
public class FormulaCalculatorUtil {
 
 private static boolean isRightFormat = true;
 
 public static double getResult(String formula){  
  double returnValue = 0;  
  try{  
   returnValue = doAnalysis(formula);  
  }catch(NumberFormatException nfe){   
   System.out.println("公式格式有误,请检查:" + formula);  
  }catch(Exception e){   
   e.printStackTrace();  
  } 
  if(!isRightFormat){  
   System.out.println("公式格式有误,请检查:" + formula);  
  } 
  return returnValue; 
 }
 
 private static double doAnalysis(String formula){
  double returnValue = 0;  
  LinkedList<Integer> stack = new LinkedList<Integer>();  
  int curPos = 0;  
  String beforePart = ""; 
  String afterPart = "";  
  String calculator = ""; 
  isRightFormat = true; 
  while(isRightFormat&&(formula.indexOf('(') >= 0||formula.indexOf(')') >= 0)){   
   curPos = 0;  
   for(char s : formula.toCharArray()){   
    if(s == '('){     
     stack.add(curPos);   
    }else if(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); 
  }  
  return returnValue; 
 }
  
 private static double doCalculation(String formula) {  
  ArrayList<Double> values = new ArrayList<Double>();  
  ArrayList<String> operators = new ArrayList<String>(); 
  int curPos = 0; 
  int prePos = 0;
  int minus = 0;  
  for (char s : 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())); 
  char op;  
  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;  
   } 
  }  
  return values.get(0).doubleValue();
 }
 
 public static void main(String[] args) {  
  System.out.println(FormulaCalculatorUtil.getResult("3-(4*5)+5")); 
  System.out.println(FormulaCalculatorUtil.getResult("7/2-(-4)"));   
  System.out.println(FormulaCalculatorUtil.getResult("1287763200000-1276272000000")/(3600*24*1000));
 }
 
}

2、浮点精度保留工具类:

package org.nercita.ntp.summary.util;
import java.math.RoundingMode;
import java.text.DecimalFormat;
/**
 * @author zhangwenchao
 * 小数点 精度的工具类
 */ 
public class NumberPrecisionUtil {
  
 public static String setNumberPrecision(double x,int Number){     
  String p="#########0";     
  if(Number==0){    
   p="#########0";    
  }else{         
   p="#########0.";        
   for(int i=0;i<Number;i++){//for的巧妙运用           
    p=p+"0";         
   }    
  }        
  DecimalFormat f = new DecimalFormat(p); 
  f.setRoundingMode(RoundingMode.HALF_UP); //四舍五入
  String s = f.format(x).toString(); 
  return s;     
 }
 
 
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值