간단한 내용은 구현 후 관리하지 않아서 여기저기 소스가 흩어져 있어 정리 용도로
구성합니다.
에러 확인 없이 정말 간단한 사칙연산을 위한 코드를 구성해 보았습니다.
곱하기 나누기는 우선순위가 높기 때문에 먼저 문자열 분해 과정에서 계산을 하고,
더하기 빼기의 연산은 Stack 구조이긴 하지만, 앞에서 뒤로 계산하도록 간단히 구성해
보았습니다.
public static double parseStringBasicCalulation(String str) {
if ( str == null ) {
return Double.NaN;
}
double result = Double.NaN;
String trStr = str.replaceAll("[\\h]+", "");
String regStr = "(([+\\-])?([\\d]+)?([.][\\d]+)?([eE][+\\-]?[\\d]+)?)([*/+-]{1}?)?";
Pattern pObj = Pattern.compile(regStr, Pattern.MULTILINE);
Matcher mObj = pObj.matcher(trStr);
Stack<String> dataStack = new Stack<String>();
while ( mObj.find()) {
String numStr = mObj.group(1);
String markStr = mObj.group(6);
if ( !dataStack.isEmpty() ) {
if ( dataStack.peek().equals("*")) {
dataStack.pop();
String preNum = dataStack.pop();
numStr = (Double.parseDouble(preNum)*Double.parseDouble(numStr))+"";
} else if ( dataStack.peek().equals("/")) {
dataStack.pop();
String preNum = dataStack.pop();
numStr = (Double.parseDouble(preNum)/Double.parseDouble(numStr))+"";
}
}
dataStack.add(numStr);
if ( markStr != null ) {
dataStack.add(markStr);
} else {
break;
}
}
if ( dataStack.size() >= 3 ) {
result = Double.parseDouble(dataStack.remove(0));
while ( !dataStack.isEmpty() ) {
String s = dataStack.remove(0);
if ( s.equals("+")) {
result += Double.parseDouble(dataStack.remove(0));
} else if ( s.equals("-")) {
result -= Double.parseDouble(dataStack.remove(0));
}
}
} else {
result = Double.parseDouble(dataStack.pop());
}
return result;
}
main block 에서
String str02 = "8*15/15+5/5+7-6";
System.out.println (parseStringBasicCalulation(str02));
호출하면 결과가 10.0 이 나오면 정상입니다.