dポイントプレゼントキャンペーン実施中!

文字列を数式として認識し、計算結果をひろいたいのですが、、、

例)"3*2"という文字列を、6という数値として認識したい。
  複数計算式も同様で、"-2*3+8"という文字列を2という数値で認識したい。

四則演算記号で分解して認識するには多大な行を要します。。。
数行でできたら最高なのですが^^;

A 回答 (4件)

ひろえないとか数値を認識とかじゃなくて、それはただのコンパイルエラーです。


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 …
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/04/11 08:59

・ IEの


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

この回答への補足

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

補足日時:2008/04/11 09:00
    • good
    • 1

最近では、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では、一度エラーを起こすと継続できない。

・ 以上、不都合な点の解明は出来ませんでした。
  何か情報が得られればお知らせください。
    • good
    • 0

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/technote …

この回答への補足

早々の回答ありがとうございます。

>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");

これじゃひろえないです。。。

補足日時:2008/04/11 02:05
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!