Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich versuche grade ein Matheprogramm zu schreiben. Da geb ich erst ne Gleichung als String ein (z.B. 5 * x). Jetzt werden alle "x" durch eine Zahl ersetzt, die immer variiert, z.B. die 8. Jetzt steht da
String s = 5 * 8. Jetzt will ich das ganze durch Java ausrechnen lassen, weiß aber nicht wie ich das ganze als Ergebnis von einem int machen kann.
Danke schonmal
Daniel
Da müsstest du einen Parser schreiben oder eine Bibliothek nutzen. Hier gibt es auch so ein ähnliches Problem, vielleicht findest du da eine Lösung, die dir gefällt: Java Gleichungslöser bauen - ComputerBase Forum
Ansonsten könntest du das ganze auch per ScriptEngine und eval() lösen. Da bekommst du dann einen double zurück, den du nur noch zu int casten musst.
Falls du nicht weißt, wie das geht, kann ich natürlich auch noch ein kleines Beispiel schreiben.
Vorweg muss man dazu aber noch sagen, dass das eine nicht gerade Performante Lösung ist, aber um dir nen kleinen Taschenrechner zu basteln ist das ganz gut. Bei professioneller Software solltest du dann lieber einen Parser benutzen, denn dadurch, dass du eben beliebe Skripte ausführen kannst, stellt das ganze auch eine Sicherheitslücke dar, da man unter anderem auch die Möglichkeit hat, auf die komplette Java Bibliothek und auch auf fremde Klassen zu zugreifen
Java:
import java.util.Scanner;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class ScriptEngineExample {
public static void main(String[] args) {
// erst braucht man einen neuen ScriptEngineManager
ScriptEngineManager mngr = new ScriptEngineManager();
// danach kannst du dir die ScriptEngine per Name holen
ScriptEngine engine = mngr.getEngineByName("ECMAScript");
// ECMAScript bzw. JavaScript ist bei einer JVM immer dabei, man kann
// aber auch Erweiterungen für Groovy oder Jython nachrüsten
// Eine Eingabe wie x = 2; x * 5 / 2 oder 5 * 5 oder auch x = 5; y = 7;
// x + y ist möglich, ebenso kannst du im Prinzip auch so ziemlich den
// gesammten
// Sprachumfang von JavaScript nutzen.
String line = new Scanner(System.in).nextLine();
try {
// mit engine.eval() kann man einen zum Beispiel einen String
// interpretieren lassen und das Ergebnis wird als double
// zurückgegeben.
System.out.println((int) (double) engine.eval(line));
} catch (ScriptException e) {
System.out.println("Something went wrong ;(");
e.printStackTrace();
}
}
}
Jetzt rein um in dem String nach Ganzzahlen zu suchen
allerdings könnte das parsen eine Exception auslösen und sollte mit einem Try/catch block umgeben werden , der übersicht halber hab ich mir das mal gesparrt
Java:
public class Test{
private String string = "10";
private int zahl1, zahl2, ergebnis;
public static void main(String[]args)
{
new Test().beispiel();
}
public void beispiel()
{
zahl2 = 20; // Wertzuweisung ohne setter
zahl1 = Integer.parseInt(string); // den String nach nach Ganzzahlen durchsuchen "parsen"
ergebnis = zahl1 + zahl2; //Rechnen
System.out.println("Das ergebnis beträgt " + ergebnis);
}
}
Das ergebnis beträgt 30
Das mit try catch kann man sich im Prinzip sparen wenn man einen regulären Ausdruck schreibt der alle Zahlen aus dem String ausliest. Man müsste dann nur noch den Operator selber parsen, aber das ginge auch mit regEx. Ich mache mal ein Beispiel das allerdings nur mit der Gleichung "x + y" zurechtkommen würde:
Java:
// Ein Objekt dass den regulären Ausdruck selbst beinhaltet
Pattern number = Pattern.compile("([0-9]+) \+ ([0-9]+)");
String s = 5 + 8;
// Ein matcher der einen String daraufhin überprüft ob er von der im regulären Ausdruck angegebenen Form ist
Matcher number_matcher = number.matcher(s);
// if-Abfrage die überprüft ob der reguläre Ausdruck auf den String passt
if (number_matcher.matches()) {
// Berechnung des Ergebnisses group(1) und group(2) sind die im regulären Ausdruck
// geklammerten Sachen, also die beiden ([0-9]+) die für Zahlen beliebiger Länge stehen
int result = Integer.parseInt(number_matcher.group(1)) + Integer.parseInt(number_matcher.group(2));
}
Man kann das auf komplexere Gleichungen erweitern, wahrscheinlich sogar auf beliebig komplexe wobei das kompliziert werden könnte.
Wenn er allerdings das ganze nutzt in dem er Textfelder ausließt, muss er wohle oder übel mit mehr als mit x und y rechnen , demnach würde ich beim einfachen parsen den eingaben bleiben , und ggf. einfach den imputtype , insofern möglich auf Ganzzahlen oder fließpunktzahlen setzen, oder dementsprechend alle anderen eingaben rausfiltern .