2016/04/22

Java 與 Android 的 Dynamic Formula 動態計算式

在 Java 或 Android 中,

要取得字串 "(1+2)*3" 的計算結果值, 可以有以下幾種方式 :

利用 ScriptEngine 的範例 (Java 內建, 但 Android 不支援) :
 程式碼
public class HelloTomKuoWorld
{
    public static void main(String[] args) throws ScriptException
    {
        ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
        
        // 連結變數 & 變數值
        Map vars = new HashMap();
        vars.put("x", 3);  // 每個變數都要定義
        vars.put("y", 5);
        vars.put("z", 2);
        
        // 定義公式, 與取得計算結果
        double vResult = (double)engine.eval( "(x+y)*z", new SimpleBindings(vars) );
        
        // 透過 DecimalFormat 進行數值格式化
        DecimalFormat df = new DecimalFormat();
        df.applyPattern( "#.##" );
        System.out.println( "result=" + df.format(vResult) );  // result=16
    }
}

利用 exp4j 的範例 (外掛套件) (Java, Android 都支援) :
 程式碼
public class HelloTomKuoWorld
{
    public static void main(String[] args)
    {
        // 定義公式 & 變數
        Expression calc = new ExpressionBuilder("(x+y)*z")
        .variables("x", "y", "z")  // 每個變數都要定義
        .build();
        
        // 連結變數 & 變數值
        calc
        .setVariable("x", 3)  // 每個變數值都要給定
        .setVariable("y", 5)
        .setVariable("z", 2);
        
        // 取得計算結果
        double vResult = calc.evaluate();
        
        // 透過 DecimalFormat 進行數值格式化
        DecimalFormat df = new DecimalFormat();
        df.applyPattern( "#.##" );
        System.out.println( "result=" + df.format(vResult) );  // result=16
    }
}