最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實現(xiàn)字符串四則運算公式解析工具類的方法

 更新時間:2018年07月18日 09:46:39   作者:零度anngle  
今天小編就為大家分享一篇java實現(xiàn)字符串四則運算公式解析工具類的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

項目中用到用戶定義運算公式進行就算的需求,這樣需要進行字符串四則運算解析,下面提供字符串公式四則運算解析與計算工具類,需要的同學可參考。

工具類如下:FormulaCalculator.java:

package org.nercita.bcp.record.util;
 
import java.util.ArrayList;
import java.util.LinkedList;
 
/**
 * @author zhangwenchao
 * @since 2016-08-26
 * 公式計算的工具類
 */
public class FormulaCalculator {
	
	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(FormulaCalculator.getResult("3-(4*5)+5"));	
		System.out.println(FormulaCalculator.getResult("7/2-(-4)"));			
		System.out.println(FormulaCalculator.getResult("1287763200000-1276272000000")/(3600*24*1000));
	}
	
}

支持四則運算,同時支持負數(shù)解析。

另附,小數(shù)數(shù)據保留位數(shù)工具類,SetNumberPrecision.java

package org.nercita.bcp.record.util;
 
import java.text.DecimalFormat;
 
/**
 
 * @author zhangwenchao
 * 小數(shù)點 精度的工具類
 */ 
public class SetNumberPrecision {
		
	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); 		  
		String s = f.format(x).toString(); 		  
		return s;		 
	}
	
}

以上這篇java實現(xiàn)字符串四則運算公式解析工具類的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Apache?SkyWalking?監(jiān)控?MySQL?Server?實戰(zhàn)解析

    Apache?SkyWalking?監(jiān)控?MySQL?Server?實戰(zhàn)解析

    這篇文章主要介紹了Apache?SkyWalking?監(jiān)控?MySQL?Server?實戰(zhàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Java?C++題解leetcode817鏈表組件示例

    Java?C++題解leetcode817鏈表組件示例

    這篇文章主要為大家介紹了Java?C++題解leetcode817鏈表組件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Java Benchmark 基準測試的實例詳解

    Java Benchmark 基準測試的實例詳解

    這篇文章主要介紹了Java Benchmark 基準測試的實例詳解的相關資料,這里提供實例幫助大家學習理解這部分內容,需要的朋友可以參考下
    2017-08-08
  • springboot如何讀取自定義屬性

    springboot如何讀取自定義屬性

    大家好,本篇文章主要講的是springboot如何讀取自定義屬性,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • Java 比較接口comparable與comparator區(qū)別解析

    Java 比較接口comparable與comparator區(qū)別解析

    這篇文章主要介紹了Java 比較接口comparable與comparator區(qū)別解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Spring整合Quartz實現(xiàn)定時任務調度的方法

    Spring整合Quartz實現(xiàn)定時任務調度的方法

    下面小編就為大家?guī)硪黄猄pring整合Quartz實現(xiàn)定時任務調度的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • Java實現(xiàn)讀取和寫入properties文件

    Java實現(xiàn)讀取和寫入properties文件

    這篇文章主要介紹了Java實現(xiàn)讀取和寫入properties文件方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Java設計模式之抽象工廠模式(Abstract?Factory)

    Java設計模式之抽象工廠模式(Abstract?Factory)

    這篇文章主要為大家詳細介紹了Java設計模式之抽象工廠模式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • springtask 的使用方法和 cron 表達式解析

    springtask 的使用方法和 cron 表達式解析

    這篇文章主要介紹了springtask 的使用方法和 cron 表達式解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • java集合框架線程同步代碼詳解

    java集合框架線程同步代碼詳解

    這篇文章主要介紹了java集合框架線程同步代碼詳解,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12

最新評論

崇明县| 康马县| 攀枝花市| 永顺县| 新民市| 顺平县| 饶河县| 荔浦县| 小金县| 辉县市| 青神县| 宜阳县| 嵩明县| 黎城县| 花莲县| 黑龙江省| 南康市| 巴彦淖尔市| 娄烦县| 合水县| 大名县| 永德县| 旌德县| 肃宁县| 灵川县| 调兵山市| 土默特左旗| 基隆市| 南漳县| 响水县| 黄大仙区| 新蔡县| 元氏县| 临武县| 策勒县| 新沂市| 百色市| 沁水县| 浮梁县| 怀集县| 太仆寺旗|