강좌 & 팁
글 수 2,412
2013.07.13 17:16:52 (*.52.177.249)
52186
제목을 뭐라고 붙일까 하다가 문자열 수식 계산이라고 붙여봤습니다.
문자열 수식계산이 뭐냐? 말그대로 문자열로 입력된 수식을 그대로 계산 한다는 거죠.
수식이라고 하니 좀 거창한데..... 기본 사칙연산입니다. ^^;
쉽게 할수 있냐? 쉽지는 않겠죠!! 문자열로된 수식을 계산 할려면 어디가 숫자이고 계산 순서는 어떻게 되고를 다 파악한후
계산을 해야합니다.
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(); } } }
[실행결과]
결과 값이 맞는지는 계산기로 확인해 보세요. ^^;
정규식 사용 방법은 구글링 해보면 많이 나옵니다.
감사합니다.