문자열로 주어진 수학적 표현을 구문 분석하고 숫자를 반환하는 방법은 무엇입니까? [복제하다

StackOverflow https://stackoverflow.com/questions/1432245

문제

Java에는이 수학적 표현에서 결과를 얻을 수있는 방법이 있습니까?

String code = "5+4*(7-15)";

다른 한편으로는 산술 표현을 구문 분석하는 가장 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

당신은 그것을 a에 전달할 수 있습니다 콩 껍질 bsh.Interpreter, 이 같은:

Interpreter interpreter = new Interpreter();
interpreter.eval("result = 5+4*(7-15)");
System.out.println(interpreter.get("result"));

평가하는 문자열이 신뢰할 수있는 소스와 일반적인 예방 조치에서 나오지 않도록하지만 그렇지 않으면 곧바로 작동합니다.

더 복잡한 (그러나 더 안전한) 접근 방식을 원한다면 사용할 수 있습니다. antlr (나는 수학 문법을 시작점으로 생각한다) 실제로 진술을 직접 컴파일/해석합니다.

다른 팁

최근에 Expression Parser를 개발하여 Apache 라이센스에 따라 해제했습니다. 당신은 그것을 잡을 수 있습니다 http://projects.congrace.de/exp4j/index.html

도움이되기를 바랍니다

Scriptengein 클래스를 사용하여 JavaScript 문자열로 평가할 수 있습니다.

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");        
Object result = engine.eval("5+4*(7-15)");

실제로 Yu는 JavaScript의 다음 지침의 결과를 알아야합니다.

   eval('var aa=5+4*(7-15)')
   aa // -27

더 나은 방법이있을 수 있지만이 방법은 작동합니다.

아마도 당신이 바라는만큼 직접적으로 나오지 않을 것입니다!

그러나 예를 들어 javax.script.scripttengine을 사용하고 문자열을 ECMAScript 표현식으로 취급 할 수 있습니까?

보세요: Java 플랫폼 스크립팅.

그렇게하는 방법은 없습니다. 그러나 많은 사람들 중 하나를 사용할 수 있습니다 오픈 소스 계산기 사용 가능.

최근에 나는 매우 성숙한 수학 표현식 파서 라이브러리 인 오픈 소스를 사용하여 Java 및 .NET에 동일한 API를 제공했습니다. 라이브러리 이름은 mxparser입니다. MXPARSER는 기본 기능 (간단한 공식 구문 분석 및 계산) 및 고급 기능 (즉, 사용자 정의 인수, 기능)을 제공합니다. 또한 MXPARSER에는 풍부한 내장 수학 수집 (의미 운영자, 단지 / 이진 / 변수 함수, 합산 및 제품과 같은 반복 연산자)이 있음을 알 수 있습니다.

http://mathparser.org/

http://mathparser.org/mxparser-tutorial/

구문을보다 명확하게 볼 수 있도록 아래 몇 가지 예를 아래에서 찾으십시오.

예 1- 간단한 공식

Expression e = new Expression("2+3");
double v = e.calculate();

예제 2- 내장 기능

Expression e = new Expression("2+sin(3)");
double v = e.calculate();

예 3- 내장 상수

Expression e = new Expression("2+sin(pi)");
double v = e.calculate();

예 4- 사용자 정의 인수 및 상수

Argument x = new Argument("x = 5");
Constant a = new Constant("a = 2 + sin(3)");
Expression e = new Expression("a + x^2", x, a);
double v1 = e.calculate();
x.setArgumentValue(10);
double v2 = e.calculate();

예 5- 사용자 정의 함수

Function f = new Function("f(x,y) = x^2 + cos(y)");
Expression e = new Expression("f(10,pi) - 3", f);
double v = e.calculate();

예 6- 사용자 정의 재귀

Function factorial = new Function("fact(n) = if( n > 0; n*fact(n-1); 1)");
Expression e = new Expression("fact(10) - 10!", factorial);
double v = e.calculate();

예술적으로 발견되었습니다 - 구문을 시도하고 고급 유스 케이스를 참조하십시오. 다운로드 할 수 있습니다. 스칼라 계산기 mxparser가 구동하는 앱.

친애하는

LK

Java SDK에는이 작업을 수행 한 직접적인 지원이 없습니다.

직접 구현해야합니다 (아마도 JAVACC와 같은 파서 생성기를 사용) 또는 기존 라이브러리를 사용해야합니다.

하나의 옵션입니다 Jep (상업), 또 다른 제발 (무료 소프트웨어).

상용 도구가 있습니다 formula4j 그것은 그 일을합니다.

표현식을 취하기 위해 Formula4J를 사용하여 이와 같이 평가됩니다.

Formula formula = new Formula("5+4*(7-15)");

Decimal answer = formula.getAnswer(); //-27

당신은 그것을 사용합니다 프로젝트

사용하는 방법:

double result = 0;
String code = "5+4*(7-15)";
try {
    Expr expr = Parser.parse(code);
    result = expr.value();
} catch (SyntaxException e) {
    e.printStackTrace();
}
System.out.println(String.format("Result: %.04f", result));
public static int calc(String string){
    int result=0; 
    String numbers="0123456789";
    String operations="+-/*";
    for (int i=0;i<string.length();i++){
        if (numbers.contains(string.charAt(i)+"")){
            result=result*10+(Integer.parseInt(string.charAt(i)+""));
            }
        else {
            if (string.charAt(i)=='+'){ result+=calc(string.substring(i+1));}
            if (string.charAt(i)=='-'){ result-=calc(string.substring(i+1));}
            if (string.charAt(i)=='*'){ result*=calc(string.substring(i+1));}
            if (string.charAt(i)=='/'){ try{result/=calc(string.substring(i+1));}
                catch (ArithmeticException e){
                    System.err.println("You cannot devide by Zero!");}
            }  
            break;
        }        
    }
    return result;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top