• ベストアンサー

文字列を数式に

文字列を数式として認識し、計算結果をひろいたいのですが、、、 例)"3*2"という文字列を、6という数値として認識したい。   複数計算式も同様で、"-2*3+8"という文字列を2という数値で認識したい。 四則演算記号で分解して認識するには多大な行を要します。。。 数行でできたら最高なのですが^^;

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

ひろえないとか数値を認識とかじゃなくて、それはただのコンパイルエラーです。 Javaの文法をすべて学んではいないようですね。あせらないでまずJavaの文法を一通り学んでみてください。 コンパイルできる完全なコードの一例は次のようになります。 参考URLにエラーの意味の解説がありますので、あわせてご覧ください。 import javax.script.*; class test1{ public static void main(String args[]){ try { ScriptEngineManager factory = new ScriptEngineManager(); ScriptEngine engine = factory.getEngineByName("JavaScript"); double result = (Double)engine.eval("-2*3+8"); System.out.println(result); } catch (ScriptException e) { throw new RuntimeException(e); } } }

参考URL:
http://milkyway.merseine.nu/100java/Java/Java049.html
1hydro
質問者

お礼

ありがとうございます。 計算できました^^

その他の回答 (3)

  • auty
  • ベストアンサー率58% (284/486)
回答No.4

・ IEの     +""   問題は再起動後確認したところ消えていました。

1hydro
質問者

補足

ありがとうございます。 参考になりました。^^

  • auty
  • ベストアンサー率58% (284/486)
回答No.3

最近では、ScriptEngineManagerを利用するという方法もありそうですが、 ここでは、アプレットによる方法ですがご紹介します。(ただし完全ではありませんが。) JavaScriptを利用しています。 クラスJSObjectは、 %JAVA_HOME%\jre\lib\plugin.jar に含まれているので、コンパイル時にclsasspathに追加してください。 ------------------------------------------------------------ JSeval.html ------------------------------------------------------------ <html> <head> <title>My Applet</title> </head> <body> <h1> JSeval </h1> <p> <applet code="JSeval.class" mayscript width="220" height="150"> </applet> </p> </body> </html> ------------------------------------------------------------ JSeval.java ------------------------------------------------------------ import java.applet.Applet; import java.awt.*; import java.awt.event.*; import netscape.javascript.*; public class JSeval extends Applet implements ActionListener { Label lb1; TextField txt1, txt2; Button btn1; public void init() { lb1 = new Label("式の入力"); add(lb1); txt1 = new TextField(25); add(txt1); btn1 = new Button("計算"); btn1.addActionListener(this); add(btn1); txt2 = new TextField(25); add(txt2); } public void actionPerformed(ActionEvent e) { String ss; if (e.getSource() == btn1) { ss = txt1.getText(); JSObject win = JSObject.getWindow(this); txt2.setText(win.eval(ss).toString()); } } } ------------------------------------------------------------ ・ Firefoxでの実行例 2*3 2.5*4+100 Math.pow(2,3) ・ IEでの実行例(何故か、+"" が必要でした。) 2*3+"" 2.5*4+100+"" Math.pow(2,3)+"" ・ Firefoxでは、一度エラーを起こすと継続できない。 ・ 以上、不都合な点の解明は出来ませんでした。   何か情報が得られればお知らせください。

回答No.1

3行でできます。 ただし本当に任意のスクリプトを実行できてしまうので、 安全性の保証のないコードを安易に実行しないなど、 セキュリティに注意することをお勧めします。 import javax.script.*; ScriptEngineManager factory = new ScriptEngineManager(); ScriptEngine engine = factory.getEngineByName("JavaScript"); double result = (Double)engine.eval("-2*3+8");

参考URL:
http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/scripting/programmer_guide/index.html
1hydro
質問者

補足

早々の回答ありがとうございます。 >double result = (Double)engine.eval("-2*3+8"); 結果の表示はどうひろえばいいんでしょうか。 import javax.script.*; class test1{ public static void main(String args[]){ ScriptEngineManager factory = new ScriptEngineManager(); ScriptEngine engine = factory.getEngineByName("JavaScript"); double result = (Double)engine.eval("-2*3+8"); System.out.println(result); } } test1.java:10: 例外 javax.script.ScriptException は報告されません。スローするにはキャッチまたは、スロー宣言をしなければなりません。 double result = (Double)engine.eval("-2*3+8"); これじゃひろえないです。。。

関連するQ&A