久久机这里只有精品,国产69精品一区二区亚洲孕妇,91精品国产综合久久婷婷香蕉,午夜久久久久久电影

最新活動:電腦PC端+手機端+微網站+自適應網頁多模板選擇-建站388元起價!!!
當前位置:主頁 > 網站建設 > 使用java處理字符串公式運算的方法建站知識

使用java處理字符串公式運算的方法建站知識

時間:2023-05-24 09:05:24 閱讀: 文章分類: 網站建設 作者: 網站編輯員

導讀:1建站知識在改進一個關于合同的項目時,有個需求,就是由于合同中非數據項的計算公式會根據年份而進行變更,而之前是將公式硬編碼到系統中的,只要時間一變,系統就沒法使用了,因此網站seo優化培訓網站優化seo培訓。

網站seo優化培訓網站優化seo培訓在改進一個關于合同的項目時,有個需求,就是由于合同中非數據項的計算公式會根據年份而進行變更,而之前是將公式硬編碼到系統中的,只要時間一變,系統就沒法使用了,因此要求合同中各個非基礎數據的項都能自定義公式,根據設置的公式來自動生成報表和合同中的數據。     顯然定義的公式都是以字符串來存儲到數據庫的,可是java中沒有這種執行字符串公式的工具或者類,而且是公式可以嵌套一個中間公式。比如:基礎數據dddd是56,而一個公式是依賴dddd的,eeee=dddd*20,而最終的公式可能是這樣:eeee*-12+13-dddd+24。可知eeee是一個中間公式,所以一個公式的計算需要知道中間公式和基礎數據。   這好像可以使用一個解釋器模式來解決,但是我沒有成功,因為括號的優先級是一個棘手的問題,后來又想到可以使用freemarker類似的模板引擎或者java6之后提供的ScriptEngine 腳本引擎,做了個實驗,腳本引擎可以解決,但是這限制了必須使用java6及以上的版本。最終功夫不負有心人,終于找到了完美解決方案,即后綴表達式。我們平時寫的公式稱作中綴表達式,計算機處理起來比較困難,所以需要先將中綴表達式轉換成計算機處理起來比較容易的后綴表達式。   將中綴表達式轉換為后綴表達式具體算法規則:見后綴表達式     a.若為 '(',入棧;   b.若為 ')',則依次把棧中的的運算符加入后綴表達式中,直到出現'(',從棧中刪除'(' ;   c.若為 除括號外的其他運算符 ,當其優先級高于棧頂運算符時,直接入棧。否則從棧頂開始,依次彈出比當前處理的運算符優先級高和優先級相等的運算符,直到一個比它優先級低的或者遇到了一個左括號為止。   ·當掃描的中綴表達式結束時,棧中的的所有運算符出棧;    我們提出的要求設想是這樣的:   復制代碼 代碼如下:     public class FormulaTest { @Test public void testFormula() { //基礎數據 Map<String, BigDecimal> values = new HashMap<String, BigDecimal>(); values.put("dddd", B網seo優化趨勢igDecimal.valueOf(56d));   //需要依賴的其他公式 Map<String, String> formulas = new HashMap<String, String>(); formulas.put("eeee", "#{dddd}*20"); 網站seo優化   //需要計算的公式 String expression = "#{eeee}*-12+13-#{dddd}+24";   BigDecimal result = FormulaParser.parse(expression, formulas, values); Assert.assertEquals(result, BigDecimal.valueOf(-13459.0)); } }     以下就是解決問題的步驟: 1、首先將所有中間變量都替換成基礎數據   FormulaParser的finalExpression方法會將所有的中間變量都替換成基礎數據,就是一個遞歸的做法   復制代碼 代碼如下:     public class FormulaParser { /** * 匹配變量占位符的正則表達式 */ private static Pattern pattern = Pattern.compile("\\#\\{(.+?)\\}");   /** * 解析公式,并執行公式計算 *  * @param formula * @param formulas * @param values * @return */ public static BigDecimal parse(String formula, Map<String, String> formulas, Map<String, BigDecimal> values) { if (formulas == n建設網站公司ull)formulas = Collections.emptyMap(); if (values == null)values = Collections.emptyMap(); String expression = finalExpression(formula, formulas, values); return new Calculator().eval(expression); }   /** * 解析公式,并執行公式計算 *  * @param formula * @param values * @return */ public static BigDecimal parse(String formula, Map<String, BigDecimal> values) { if (values == null)values = Collections.emptyMap(); return parse(formula, Collections.<String, String> emptyMap(), values); }   /** * 解析公式,并執行公式計算 *  * @param formula * @return */ public static BigDecimal parse(String formula) { return parse(formula, Collections.<String, String> emptyMap(), Collections.<String, BigDecimal> emptyMap()); }   /** * 將所有中間變量都替換成基礎數據 *  * @param expression * @param formulas * @param values * @return */ private static String finalExpression(String expression, Map<String, String> formulas, Map<String, BigDecimal> values) { Matcher m = pattern.matcher(expression); if (!m.find())return expression;   m.reset();   StringBuffer buffer = new StringBuffer(); while (m.find()) { String group = m.group(1); if (formulas != null && formulas.containsKey(group)) { String formula = formulas.get(group); m.appendReplacement(buffer, '(' + formula + ')'); } else if (values != null && values.containsKey(group)) { BigDecimal value = values.get(group); m.appendReplacement(buffer,value.toPlainString()); }else{ throw new IllegalArgumentException("expression '"+expression+"' has a illegal variable:"+m.group()+",cause veriable '"+group+"' not being found in formulas or in values."); } } m.appendTail(buffer); return finalExpression(buffer.toString(), formulas, values); } }     2、將中綴表達式轉換為后綴表達式   Calculator的infix2Suffix將中綴表達式轉換成了后綴表達式   3、計算后綴表達式     Calculator的evalInfix計算后綴表達式   復制代碼 代碼如下:相關網站seo優化培訓網站優化seo培訓。

關鍵詞標簽: 字符串 公式

聲明: 本文由我的SEOUC技術文章主頁發布于:2023-05-24 ,文章使用java處理字符串公式運算的方法建站知識主要講述字符串,公式,使用java處理字符串公式運算的方法網站建設源碼以及服務器配置搭建相關技術文章。轉載請保留鏈接: http://www.bifwcx.com/article/web_6522.html

我的IDC 網站建設技術SEOUC.COM
專注網站建設,SEO優化,小程序設計制作搭建開發定制網站等,數千家網站定制開發案例,網站推廣技術服務。
  • 5000+合作客服
  • 8年從業經驗
  • 150+覆蓋行業
  • 最新熱門源碼技術文章

    主站蜘蛛池模板: 林口县| 资源县| 固镇县| 宜兰县| 深圳市| 祁连县| 汨罗市| 广丰县| 锦州市| 剑川县| 淳安县| 桑植县| 鸡泽县| 偃师市| 龙门县| 宜宾市| 宣化县| 普兰店市| 宜州市| 永德县| 蓬安县| 五家渠市| 阜康市| 循化| 蕉岭县| 冷水江市| 莲花县| 泗洪县| 天津市| 东丽区| 夹江县| 高密市| 上杭县| 兴隆县| 华宁县| 兰溪市| 麦盖提县| 什邡市| 玉田县| 连云港市| 巴塘县|