一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 利用ScriptEngineManager實現字符串公式靈活計算的方法

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

2021-05-17 15:21wyzdeng Java教程

今天小編就為大家分享一篇利用ScriptEngineManager實現字符串公式靈活計算的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

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

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

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

下面舉個例子

加入有個公式

?
1
2
3
a+b*c
 
a=1,b=2,c=3

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

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

直接以代嗎的形式來寫吧

?
1
2
3
4
5
6
7
8
9
10
11
12
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:要替換成的數值

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 * 精確替換字符 防止出現 匹配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;
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 精確匹配字符 防止出現 匹配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語句等 下面是個例子 可以參考下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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實現字符串公式靈活計算的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/wyzdeng/article/details/78704256

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品亚洲片在线不卡 | 2048论坛永久入口 原创合集 | 欧美不卡一区二区三区免 | 欧美日韩专区国产精品 | 免费超级乱淫视频播放性 | 和老外3p爽粗大免费视频 | 国产伦精品一区二区三区免 | 国产久视频 | 男男视频18免费网站 | 国产精品一区二区久久不卡 | 日韩欧美一区黑人vs日本人 | 国产日韩精品一区二区在线观看播放 | 精品一区二区三区五区六区 | 无限资源在线观看完整版免费下载 | 激情影院免费 | 天天做天天爱天天综合网 | t66y地址一地址二地址三 | 日本在线视 | 国产九九| 亚洲国产在线播放在线 | 亚洲 欧美 国产 在线观看 | 美女班主任让我爽了一夜视频 | 免费看欧美一级特黄a大片一 | 国产精品欧美亚洲韩国日本99 | 免费人成在线观看视频播放 | 午夜看片a福利在线观看 | 国产精品高清一区二区三区不卡 | 肉浦团在线观看 | 外女思春台湾三级 | 亚洲精品一区二区三区在线看 | 五月最新商场女厕所高跟嘘嘘 | 美女胸又大又黄又www小说 | 国产亚洲精品九九久在线观看 | 亚洲国产一区 | 欧美视频一区二区三区在线观看 | 国产免费一区二区 | 欧美精品黑人巨大在线播放 | 青青草视频国产 | 免费观看视频网站 | 精品久久久麻豆国产精品 | 国产夜趣福利第一视频 |