문자열로 주어진 수학적 표현을 구문 분석하고 숫자를 반환하는 방법은 무엇입니까? [복제하다
-
07-07-2019 - |
문제
이 질문은 이미 여기에 답이 있습니다.
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/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
상용 도구가 있습니다 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;
}