Frage von BenStudio, 88

Java: Kann man Strings ausrechen lassen?

Erläuterung: In einem String steht z.B. "2*3", dann will ich diesen String sozusagen ausrechnen, so dass ich ein int als Ergebnis zurück bekomme, z.B. 6.

Ich weiß nicht ob das geht bzw. wie das gehen könnte, deswegen bin ich gespannt auf Antworten.

Danke schonmal!

Antwort
von zalto, 44

Java selbst hat keine eval() Funktion - aber Javascript hat sie. Und das kann man seit Java SE 6 über den ScriptEngineManager aufrufen:

import javax.script.ScriptEngineManager; import javax.script.ScriptEngine; public class Test { public static void main(String[] args) throws Exception{ ScriptEngineManager mgr = new ScriptEngineManager(); ScriptEngine engine = mgr.getEngineByName("JavaScript"); String result = "2*3"; System.out.println(engine.eval(result)); } }
Kommentar von TeeTier ,

Das nenn ich mal nen "Einzeiler". :)

Kommentar von RageMode ,

Genau das was ich suche, aber um das ganze noch komplizierter zu machen kann ich da auch Variablen aus Java einbinden? also zum Beispiel das er 2*x ausrechnet wenn x vorher deklariert wird?

Kommentar von zalto ,

Ja, für den Variablenaustausch zwischen den beiden Welten gibt es die Methoden "get" und "put".

https://docs.oracle.com/javase/7/docs/api/javax/script/ScriptEngineManager.html

Antwort
von karinili, 65

Wenn dein String eine reine Zahl enthalten würde, könntest du es mit einem Integer.parseInt umwandeln. Wenn du da aber Zeichen drinnen hast, wird dir eine NumberFormatException geliefert.

So wird dir nicht viel anderes übrig bleiben, als das ganze mit einem Schleifendurchlauf (charAt und und String.length() sollten bekannt sein)  zu lösen. Der Umweg den ich aber gerade im Kopf habe, ist etwas umständlich ^^°

Kommentar von BenStudio ,

Ich denke, ich versuche es mal mit deiner Version Nummer 2, danke!

Kommentar von karinili ,

Gerne :)
Pass aber auf, mit mehrstelligen Zahlen könntest du eventuell einen weiteren String als Zwischenspeicher benötigen!

Kommentar von BenStudio ,

Ja, momentan bin ich erstmal dabei einen Filter zu bauen, der guckt ob das Eingegeben ünerhaupt eine Funktion ist.

Kommentar von karinili ,

Schon überlegt, es mit einem dequeu zu lösen? Sobald ein ungültiger Operator daherkommt, bzw wenn du Klammerung erlaubst, wenn die Klammerung nicht stimmt, kannst du die Operation ja abbrechen, aber wenn du es doch weiterverarbeitest hättest du es die Zeichen bereits sortiert und könntest sie dir je nach Eingabe auslesen.

Keine passende Antwort gefunden?

Fragen Sie die Community