package com.test.nashornJavaScript; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import java.math.BigDecimal; /** * java8新特性之七Nashorn JavaScript 出处:https://blog.csdn.net/wen901230zi/article/details/105388973 * @auther zhangZhi * @create 2022-05-05 22:41 */ public class NashornJavaScriptTest { public static void main(String[] args) { ScriptEngineManager scriptEngineManager=new ScriptEngineManager(); ScriptEngine scriptEngine=scriptEngineManager.getEngineByName("nashorn"); String name="测试JVM中javasScript eval()函数计算:"; Object result =null; try { scriptEngine.eval("print('" + name + "')"); result = scriptEngine.eval("5*3/(2+10)"); System.out.println("方式1:" + result); result = scriptEngine.eval("x=10; y=20;(x*y);"); System.out.println("方式2:" + result); result = scriptEngine.eval("A=1,B=2,C=3,A+B*C "); System.out.println("方式3:" + result); //方式4:项目中实际公式计算验证 String a = "1.753"; String b = "2.53"; String c = "3.5455"; String d = "4"; String x = "5"; String formula = "AX³+BX²+C*X+D"; String replaceFormula = formula; replaceFormula = replaceFormula.replaceAll("X²","*X*X"); replaceFormula = replaceFormula.replaceAll("X³","*X*X*X"); replaceFormula = replaceStr(replaceFormula,"A", a); replaceFormula = replaceStr(replaceFormula,"B", b); replaceFormula = replaceStr(replaceFormula,"C", c); replaceFormula = replaceStr(replaceFormula,"D", d); replaceFormula = replaceStr(replaceFormula,"X", x); result = scriptEngine.eval(replaceFormula); if(null != result){ BigDecimal bd = new BigDecimal(result.toString()); bd = bd.stripTrailingZeros(); result = bd.toPlainString(); } System.out.println("方式4,原公式函数:" + formula + "\n转换后:" + replaceFormula + "\n计算结果:"+ result.toString()); } catch (Exception e) { e.printStackTrace(); System.out.println("执行脚本错误: "+ e.getMessage()); } } /** * 精确替换字符 防止出现 匹配A 时将AA匹配的情况 */ public static String replaceStr(String sourceStr,String replaceKey,String replaceValue){ String replaceStrReg=""; for(char str_char:replaceKey.toCharArray()){ replaceStrReg+="["; replaceStrReg+=str_char; replaceStrReg+="]"; } String startReg="^"+replaceStrReg+"([\\+\\-\\*/,)])"; String endReg="([\\+\\-\\*/,(])"+replaceStrReg+"$"; String reg="([^a-zA-Z])("+replaceStrReg+")"+"([^a-zA-Z])"; String endStr=sourceStr; while(matcheStr(endStr,replaceKey)){ endStr=endStr.replaceAll(startReg, replaceValue+"$1"); endStr=endStr.replaceAll(reg, "$1"+replaceValue+"$3"); endStr=endStr.replaceAll(endReg, "$1"+replaceValue); } return endStr; } /** * 精确匹配字符 防止出现 匹配A 时将AA匹配的情况 */ public static Boolean matcheStr(String sourceStr,String matchStr){ String replaceStrReg=""; for(char str_char:matchStr.toCharArray()){ replaceStrReg+="["; replaceStrReg+=str_char; replaceStrReg+="]"; } String startReg="^"+replaceStrReg+"([\\+\\-\\*/,)])[\\s\\S]*"; String endReg="[\\s\\S]*([\\+\\-\\*/,(])"+replaceStrReg+"$"; String reg="[\\s\\S]*([^A-Za-z])("+replaceStrReg+")"+"([^A-Za-z])[\\s\\S]*"; if(sourceStr.matches(startReg)||sourceStr.matches(reg)||sourceStr.matches(endReg)){ return true; }else{ return false; } } }