제목을 뭐라고 붙일까 하다가 문자열 수식 계산이라고 붙여봤습니다.

문자열 수식계산이 뭐냐? 말그대로 문자열로 입력된 수식을 그대로 계산 한다는 거죠.

수식이라고 하니 좀 거창한데..... 기본 사칙연산입니다. ^^;


쉽게 할수 있냐? 쉽지는 않겠죠!!  문자열로된 수식을 계산 할려면 어디가 숫자이고 계산 순서는 어떻게 되고를 다 파악한후

계산을 해야합니다.


JavaScript에서는 eval함수를 사용해서 계산이 가능 한데..... Java에서도 JavaScript엔지을 사용할수 있다는 놀라운 사실...

구글링 해보니 여기저기 샘플이 많이 있네요.


하지만, 저는 좀더 활용할 수 있는 샘플을 만들어 봤습니다.

왜 만들었냐?  제가 필요 하니까요...^^;


수식 폼을 만들어 놓고 계산할 숫자를 대입 할 수 있도록 만들어 봤습니다.

예를 들어 본다면......

예)

수식폼 : ({0} + {1}) * {2}

대입할 값 배열: {"100", "20", "5"}

조합된 수식 : (100 + 20) * 5


※"{숫자}"는 대입할 값 배열의 인덱스 번호를 의미 합니다.


수식폼을 분리하거나 값을 대입하기위해 정규식을 사용했습니다.

그럼 샘플 소스를 확인해 보세요.


[샘플 소스]

 
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
 
public class StringCalcuRegx {
 
	/**
	 * @param args
	 */
	public static void main(String[] args) {
 
		ScriptEngineManager segm = new ScriptEngineManager();
        ScriptEngine engine = segm.getEngineByName("JavaScript");
 
        // 계산할 값 배열
        String[] datas = {"10.8", "23", "21", "10"};
        // 수식폼
        String form = "(({0}*{1})+{2})/{3}*100";
 
        // 패턴적용
        // "{숫자}", "(", ")", "+", "-", "*", "/"로 구분
        Pattern p = Pattern.compile("[\\{|0-9.|\\}]+|\\(|\\)|\\+|\\-|\\*|\\/");
        Matcher m = p.matcher(form);
 
        StringBuilder stb = new StringBuilder();
        while(m.find()) {
 
        	String word = m.group();
//        	System.out.println(word);
 
    		// 숫자인지 확인
        	boolean isNumber = Pattern.matches("^[0-9.]+", word);
        	// 숫자일 경우
			if (isNumber == false) {
	        	// 형식이 "{숫자}" 인지 확인
	        	boolean isIndex = Pattern.matches("[\\{|0-9.|\\}]+", word);
	        	if (isIndex) {
	        		// 숫자만 남기고 "{}"을 제거
	        		String index = word.replaceAll("[\\{|\\}]+","");
 
	        		// 배열에서 값을 가져와 바꿔치기함.
	        		word = datas[Integer.valueOf(index)];
	        	}
			}
 
			stb.append(word);
        }
 
        System.out.println("계산식 : " + stb.toString());
 
        try {
			System.out.println("결  과 : " + engine.eval(stb.toString()));
		} catch (ScriptException e) {
			e.printStackTrace();
		}
	}
 
}



[실행결과]

stringregxcalcu.PNG


결과 값이 맞는지는 계산기로 확인해 보세요. ^^;

정규식 사용 방법은 구글링 해보면 많이 나옵니다.


감사합니다.