こんにちは。「Javaを復習する初心者」です。
Swingで簡易電卓を作成しました。今回はその一部分である式の計算部分を説明します。
画面
Swingで簡易電卓を作成してたのですが、最新のソースはgithubに載せてあります。jarファイルもjava8が動く環境で実行できると思います。使っているPCにはjre1.8.0_102をインストールしてありますが、jarファイルをダブルクリックしたら起動できました。
https://github.com/java-beginner/simple-calculator-swing
画面は以下です。
式を入力して、「=」ボタンをクリックすると計算結果が表示されます。
計算結果を出すためのクラス
今回は式の計算結果を出すためのクラスを記載してあるEvaluation.javaのポイントを解説します。
先にソースの一部を貼ります。
Evaluation.javaの抜粋
public Evaluation() {
engine = new ScriptEngineManager().getEngineByName(Constants.SCRIPTENGINE_SHORT_NAME);
}
public String getValueOf(String formula) {
String value = Constants.STR_EMPTY;
try {
engine.eval(String.format(Constants.SCRIPTENGINE_FORMAT_FOR_EVALUATION, formula));
value = String.valueOf(engine.get(Constants.SCRIPTENGINE_VALUE));
} catch (ScriptException e1) {
}
return value.equals(Constants.STR_NULL) ? Constants.STR_EMPTY : value;
}
定数クラスConstantsに定義されている定数をいくつか使ってます。
変数名 | 内容 |
---|---|
SCRIPTENGINE_SHORT_NAME | “JavaScript” |
STR_EMPTY | “” |
SCRIPTENGINE_FORMAT_FOR_EVALUATION | “var value = eval(\”%s\”);” |
SCRIPTENGINE_VALUE | “value” |
STR_NULL | “null” |
ScriptEngineManager().getEngineByName()メソッドの引数に”JavaScript”を指定します。このメソッドでScriptEngineが作成されます。詳しいことは分からないのですが、JavaScritpを動かすためのインスタンスということになります。eval(String script)メソッドが用意されていて、JavaScriptで書かれた文字列を引数に指定すると実行してくれます。
JavaScriptの内容ですが、例えば、式が「1 + 2」ならば「var value = eval(“1 + 2”);」が実行されます。String.formatメソッドによってそのような文字列になるように調節してます。JavaScriptにはevalメソッドが用意されていて、式を評価してくれます。JavaScriptの変数valueに結果が格納されます。その結果をJava側で取得するにはengine.getメソッドを使います。さらにString.valueOf(Object obj)メソッドでString型に変換してます。式が評価できなかった場合、”null”が格納されるようなので最後に三項演算子で分岐させてます。
演算のテスト
適当に演算をテストしたときのソースと結果です。演算子+, -, *, /, %と括弧を試しました。
ソース
package test;
import com.java_beginner.simple_calculator.Evaluation;
public class EvaluationTest {
public static void main(String[] args) {
Evaluation evaluation = new Evaluation();
test(evaluation, "31 + 94");
test(evaluation, "12 - 3");
test(evaluation, "9 * 8");
test(evaluation, "24 / 3");
test(evaluation, "10 % 3");
test(evaluation, "(1 + 2) * 5");
}
private static void test(Evaluation evaluation, String formula) {
System.out.printf("%s = %s", formula, evaluation.getValueOf(formula));
System.out.println();
}
}
結果
31 + 94 = 125
12 - 3 = 9
9 * 8 = 72
24 / 3 = 8
10 % 3 = 1
(1 + 2) * 5 = 15
括弧の処理もうまくいってます。