亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

利用ScriptEngineManager實現字符串公式靈活計算的方法

2024-07-14 08:41:39
字體:
來源:轉載
供稿:網友

在開發中我們可能會遇到好多不固定的公式計算 如有時候我們需要將excel中大量的計算公式轉換成java語言進行實現

如果說單純的用java的基本方法實現計算 我們就需要的分析excel中的公式將其一一并轉換成java代碼 這樣對我們開發人員來說工作量有點太大了 而且在轉換過程中很可能會出錯

下面就介紹一種簡單的實現方法

我們知道js的eval()方法可以執行字符串的代碼 而恰好jdk6增加了對腳本語言的支持 我們可以利用這個特性對計算實現簡單化的處理

下面舉個例子

加入有個公式

A+B*C A=1,B=2,C=3

我們可以將公式的A B C替換成數字 轉換為 1+2*3 最后就可以得到結果了

接下來 我么就探討下實現方法

直接以代嗎的形式來寫吧

public Double Calculation(String formula){Double result=null; //計算結果ScriptEngineManager manager = new ScriptEngineManager(); //創建一個ScriptEngineManager對象ScriptEngine engine = manager.getEngineByName("js"); //通過ScriptEngineManager獲得ScriptEngine對象try {result = (Double) engine.eval(formula); //用ScriptEngine的eval方法執行腳本} catch (ScriptException e) {this.isSuccess=false;result=Double.NaN;} return result;}

利用上面的方法我們就可以將一個數學表達式計算出結果

Calculation(“1+2*3”)-->得到結果7

顯然這樣是不能實現公式的靈活計算的 怎么實現A+B*C 此時我們應該會想到將參數ABC替換成數字就可以實現計算結果了

接下來我們就探討如何實現替換的功能

說到替換 我們不難想到String的replaceAll方法,但是這樣我們會遇到一個問題就是替換形如A+AA+AAA的問題

如果str.replaceAll("A",2) ;結果就是2+22+222了

所以我想到了利用正則去準確匹配替換 方法如下

參數1:替換公式字的符串 參數2: 公式中要替換的字母如上邊的A 參數3:要替換成的數值

/** * 精確替換字符 防止出現 匹配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;}}

上述的正則表達式就是利用了數學公式中出現+-*/運算符號的規律

這樣我們就可以先替換 再計算了

我們的公式中可以實現計算平方等 如Math.pow(2,2) 只要js支持的數學公式都可以寫進去

至于怎么將公式中的參數全部替換 我們可以用循環遍歷替換參數 這里就不寫了 有了上面的方法就ok了

我有這樣的想法就是因為開發中頻繁編寫公式 可能會出錯 另一方面純用java實現公式后期維護修改也麻煩 利用這種方法我們在后期修改公式時只需修改字符串公式即可

這樣我們還可以讓用戶自定義公式

當然我們還可以利用ScriptEngineManager他實現執行js代碼塊 如if語句等 下面是個例子 可以參考下

public Map<String,Object> myFunction(String formula){ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); Object result;try {engine.eval(formula);Invocable inv = (Invocable) engine;result=inv.invokeFunction("js"); Object function = engine.get("useFunction");map.put("result", result);map.put("function", function);} catch (Exception e) {result=Double.NaN;} return map;}

以上這篇利用ScriptEngineManager實現字符串公式靈活計算的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩风俗一区 二区| 91av国产在线| 97国产真实伦对白精彩视频8| 久久久久久久久久久人体| 96精品视频在线| 综合网日日天干夜夜久久| 中文字幕无线精品亚洲乱码一区| 久久国产精品网站| 亚洲第一av网站| 国产精品一区二区三区免费视频| 国内免费精品永久在线视频| 欧美国产精品人人做人人爱| 日韩精品一二三四区| 亚洲色图欧美制服丝袜另类第一页| 福利视频一区二区| 久久激情五月丁香伊人| 69视频在线播放| 欧美情侣性视频| 宅男66日本亚洲欧美视频| 欧美日韩激情小视频| 国产成一区二区| 国产精品日韩专区| 一区二区日韩精品| 亚洲成人激情在线| 亚洲网站在线播放| 中文日韩电影网站| 亚洲精品自拍第一页| 中文字幕亚洲无线码在线一区| 亚洲色图色老头| 日韩美女av在线| 欧美国产激情18| 国产91精品视频在线观看| 国产丝袜一区二区三区免费视频| 成人免费在线视频网站| 亚洲男人天堂久| 欧美一级大片在线免费观看| 国产日产欧美精品| 国产精品久久久久高潮| 成人欧美一区二区三区在线湿哒哒| 欧美在线视频a| 日韩美女写真福利在线观看| 高清欧美性猛交| 久久天天躁夜夜躁狠狠躁2022| 欧美中文字幕在线观看| 国内精品久久久久久久| 5252色成人免费视频| 国产精品video| 日本午夜精品理论片a级appf发布| 欧美亚洲日本黄色| 中文一区二区视频| 欧美精品第一页在线播放| 国产精品91在线| 国产成人高潮免费观看精品| 亚洲欧洲国产伦综合| 国产精品久久久久久一区二区| 91精品国产电影| 日韩av在线影院| 日韩av观看网址| 国产精品91免费在线| 国产91精品视频在线观看| 国产精品免费久久久| 一本大道香蕉久在线播放29| 日韩最新免费不卡| 亚洲а∨天堂久久精品9966| 久久久女人电视剧免费播放下载| 国产亚洲精品久久久久动| 日韩国产欧美精品在线| 成人免费在线网址| 正在播放欧美一区| 欧美一级电影免费在线观看| 激情久久av一区av二区av三区| 久久久久久国产精品三级玉女聊斋| 欧美大片免费观看在线观看网站推荐| 久久久久久18| 一区二区欧美在线| 国产精品久久久久久久天堂| 国产精品pans私拍| 欧美www视频在线观看| 国产亚洲精品久久久| 高清欧美性猛交xxxx黑人猛交| 国产精品久久久久久久久久ktv| 91精品国产综合久久香蕉922| 2019中文字幕在线| 国产精品爽爽ⅴa在线观看| 亚洲精品一区在线观看香蕉| 亚洲品质视频自拍网| 国产精品久久99久久| 日韩av电影免费观看高清| 欧美一性一乱一交一视频| 97国产在线视频| 日韩精品久久久久| 亚洲一区二区三区香蕉| 97国产精品久久| 影音先锋日韩有码| 亚洲老头同性xxxxx| 精品无人区太爽高潮在线播放| 国产日本欧美一区二区三区在线| 宅男66日本亚洲欧美视频| 6080yy精品一区二区三区| 亚洲深夜福利视频| 国产精品视频资源| 亚洲免费av电影| 国产日韩欧美在线| 最新中文字幕亚洲| 日韩视频免费观看| 中文国产成人精品久久一| 久久久久久久久电影| 国产成人高潮免费观看精品| 欧美野外wwwxxx| 欧美国产欧美亚洲国产日韩mv天天看完整| 在线a欧美视频| 在线中文字幕日韩| 国产成人aa精品一区在线播放| 精品日本美女福利在线观看| 国产精品露脸av在线| 国产精品久久久久久久久久久久久| 欧美日韩高清在线观看| 国产精品久久一区| 亚洲人成伊人成综合网久久久| 一区二区三区美女xx视频| www.日本久久久久com.| 欧美极品美女电影一区| 日韩免费不卡av| 亚洲激情第一页| 伊人久久久久久久久久久久久| 日韩av电影中文字幕| 热久久视久久精品18亚洲精品| 国产一区二区在线免费视频| 欧美中文字幕在线| 日韩欧美在线国产| 久久99久国产精品黄毛片入口| 亚洲最大福利网| 日韩视频在线免费| 国产精品久久久久7777婷婷| 97超级碰碰碰久久久| 亚洲男人7777| 一本一本久久a久久精品综合小说| 亚洲精品一区中文字幕乱码| 亚洲激情在线观看| 欧美成人在线网站| 欧美日韩国产色| 亚洲精品欧美极品| 国产日韩亚洲欧美| 美女精品久久久| 欧美高清不卡在线| 岛国av一区二区三区| 亚洲另类欧美自拍| 91免费观看网站| 国产亚洲成精品久久| 欧美成人午夜影院| 色先锋久久影院av| 欧美在线观看网址综合| 最新国产精品拍自在线播放| 久久久久日韩精品久久久男男| 亚洲另类激情图| 揄拍成人国产精品视频| 国产91精品高潮白浆喷水| 国产精品成人播放| 国外成人在线播放| 日韩精品电影网| 欧美高清视频在线观看| 国产精品网站视频| 日韩国产在线播放| 日韩中文字幕在线播放|