簡單四則運算及表達式校驗和轉換工具類,僅供參考。
完整工具類請往我的github項目bee.js
//簡單四則運算 ElementaryArithmeticUtils = { //運算符優先級 operatorPrecedence: { "+": 0, "-": 0, "*": 1, "×": 1, "÷": 1, "/": 1 }, //運算符 operator: { "+": "+", "-": "-", "*": "*", "×": "*", "÷": "/", "/": "/" }, //加法 add: function(operandLeft, operandRight) { var operand1 = operandLeft.toString(); var operand2 = operandRight.toString(); var decimalPlace1 = operand1.indexOf(".") >= 0 ? operand1.split(".")[1].length : 0; var decimalPlace2 = operand2.indexOf(".") >= 0 ? operand2.split(".")[1].length : 0; var multiple = Math.pow(10, Math.max(decimalPlace1, decimalPlace2)); return(operandLeft * multiple + operandRight * multiple) / multiple; }, //減法 subtract: function(operandLeft, operandRight) { var operand1 = operandLeft.toString(); var operand2 = operandRight.toString(); var decimalPlace1 = operand1.indexOf(".") >= 0 ? operand1.split(".")[1].length : 0; var decimalPlace2 = operand2.indexOf(".") >= 0 ? operand2.split(".")[1].length : 0; var multiple = Math.pow(10, Math.max(decimalPlace1, decimalPlace2)); //toFixed避免多出來小數位,如 11.3-10.12000=1.1800000000000015 var decimalPlace = (decimalPlace1 >= decimalPlace2) ? decimalPlace1 : decimalPlace2; return((operandLeft * multiple - operandRight * multiple) / multiple).toFixed(decimalPlace); }, //乘法 multiply: function(operandLeft, operandRight) { var operand1 = operandLeft.toString(); var operand2 = operandRight.toString(); var decimalPlace1 = operand1.indexOf(".") >= 0 ? operand1.split(".")[1].length : 0; var decimalPlace2 = operand2.indexOf(".") >= 0 ? operand2.split(".")[1].length : 0; var multiple1 = Math.pow(10, decimalPlace1); var multiple2 = Math.pow(10, decimalPlace2); return((operandLeft * multiple1) * (operandRight * multiple2)) / Math.pow(10, decimalPlace1 + decimalPlace2); }, //除法 divide: function(operandLeft, operandRight) { var operand1 = operandLeft.toString(); var operand2 = operandRight.toString(); var decimalPlace1 = operand1.indexOf(".") >= 0 ? operand1.split(".")[1].length : 0; var decimalPlace2 = operand2.indexOf(".") >= 0 ? operand2.split(".")[1].length : 0; var multiple1 = Math.pow(10, decimalPlace1); var multiple2 = Math.pow(10, decimalPlace2); return((operandLeft * multiple1) / (operandRight * multiple2)) * Math.pow(10, decimalPlace2 - decimalPlace1); }, //校驗表達式的合法性 isArithmeticExpression: function(expression) { try { expression = expression.replace(/÷/g, "/").replace(/×/g, "*"); var result = eval(expression); } catch(e) { return false; } return true; }, //計算 calculate: function(expression) { var value = eval(expression); return value; }, //中綴表達式轉后綴表達式 infixToPostfixExpression: function(expression) { expression = Bee.StringUtils.deleteWhitespace(expression); expression = this.eliminatePositiveOrNegativeSign(expression); var operatorStack = []; var resultStack = []; var elementArr = expression.match(/[-+/÷*×()]|(?:[1-9]d*|0)(?:.d+)?/g); var size = elementArr.length; for(var i = 0; i < size; i++) { if(Bee.StringUtils.isNumeric(elementArr[i])) { //如果是數值 resultStack.push(elementArr[i]); } else { //操作符棧頂元素 var operatorStackTopElement = operatorStack.length === 0 ? "" : operatorStack[operatorStack.length - 1]; //運算符 if(operatorStack.length === 0 || elementArr[i] === "(" || operatorStackTopElement === "(" || this.operatorPrecedence[elementArr[i]] > this.operatorPrecedence[operatorStackTopElement]) { //操作符棧為空或棧頂元素為右括號")",或操作符的優先級比棧頂運算符高或相等,直接入棧 operatorStack.push(elementArr[i]); } else { //如果是右括號")",則依次彈出操作符棧頂的運算符,并壓入結果棧,直到遇到左括號"("為止,左右括號不壓入結果棧; if(elementArr[i] === ")") { for(var index = operatorStack.length - 1; index >= 0; index--) { if(operatorStack[index] === "(") { operatorStack.pop(); break; } else { resultStack.push(operatorStack.pop()); } } } else { //將符號棧頂的運算符彈出并壓入到結果棧中,再次與符號棧中新的棧頂運算符相比較 resultStack.push(operatorStack.pop()); i--; continue; } } } } //處理操作符棧剩余的符號 if(operatorStack.length > 0) { for(var j = operatorStack.length - 1; j >= 0; j--) { resultStack.push(operatorStack.pop()); } } //結果返回 return resultStack.join(" "); }, //中綴表達式轉前綴表達式(結果以空格隔開) infixToPrefixExpression: function(expression) { expression = Bee.StringUtils.deleteWhitespace(expression); expression = this.eliminatePositiveOrNegativeSign(expression); var operatorStack = []; var resultStack = []; var elementArr = expression.match(/[-+/÷*×()]|(?:[1-9]d*|0)(?:.d+)?/g); var size = elementArr.length; for(var i = size - 1; i >= 0; i--) { if(Bee.StringUtils.isNumeric(elementArr[i])) { //如果是數值 resultStack.push(elementArr[i]); } else { //操作符棧頂元素 var operatorStackTopElement = operatorStack.length === 0 ? "" : operatorStack[operatorStack.length - 1]; //運算符 if(operatorStack.length === 0 || elementArr[i] === ")" || operatorStackTopElement === ")" || this.operatorPrecedence[elementArr[i]] >= this.operatorPrecedence[operatorStackTopElement]) { //操作符棧為空或棧頂元素為右括號")",或操作符的優先級比棧頂運算符高或相等,直接入棧 operatorStack.push(elementArr[i]); } else { //如果是左括號"(",則依次彈出操作符棧頂的運算符,并壓入結果棧,直到遇到右括號")"為止,左右括號不壓入結果棧; if(elementArr[i] === "(") { for(var index = operatorStack.length - 1; index >= 0; index--) { if(operatorStack[index] === ")") { operatorStack.pop(); break; } else { resultStack.push(operatorStack.pop()); } } } else { //將符號棧頂的運算符彈出并壓入到結果棧中,再次與符號棧中新的棧頂運算符相比較 resultStack.push(operatorStack.pop()); i++; continue; } } } } //處理操作符棧剩余的符號 if(operatorStack.length > 0) { for(var j = operatorStack.length - 1; j >= 0; j--) { resultStack.push(operatorStack.pop()); } } //結果返回 return resultStack.reverse().join(" "); }, //解決正負號問題-1轉為0-1;+1轉為0+1 eliminatePositiveOrNegativeSign: function(expression) { return expression.replace(/((|^)([-+])/g, "$10$2"); }, //把中綴表達式轉為前綴表達式,再計算 calculateByPrefixExpression: function(expression) { var elementArr = this.infixToPrefixExpression(expression).split(" "); var size = elementArr.length; var resultStack = []; for(var i = size - 1; i >= 0; i--) { if(Bee.StringUtils.isNumeric(elementArr[i])) { //如果是數值 resultStack.push(elementArr[i]); } else { var operand1 = resultStack.pop(); var operand2 = resultStack.pop(); var result; switch(elementArr[i]) { case "+": result = Bee.ElementaryArithmeticUtils.add(operand1, operand2); break; case "-": result = Bee.ElementaryArithmeticUtils.subtract(operand1, operand2); break; case "×": case "*": result = Bee.ElementaryArithmeticUtils.multiply(operand1, operand2); break; case "/": case "÷": result = Bee.ElementaryArithmeticUtils.divide(operand1, operand2); break; default: result = ""; alert("The operator 【" + elementArr[i] + "】 is not legal"); break; } resultStack.push(result); } } return resultStack; }, //把中綴表達式轉為后綴表達式,再計算 calculateByPostfixExpression: function(expression) { var elementArr = this.infixToPostfixExpression(expression).split(" "); var size = elementArr.length; var resultStack = []; for(var i = 0; i < size; i++) { if(Bee.StringUtils.isNumeric(elementArr[i])) { //如果是數值 resultStack.push(elementArr[i]); } else { var operand1 = resultStack.pop(); var operand2 = resultStack.pop(); var result; switch(elementArr[i]) { case "+": result = Bee.ElementaryArithmeticUtils.add(operand2, operand1); break; case "-": result = Bee.ElementaryArithmeticUtils.subtract(operand2, operand1); break; case "×": case "*": result = Bee.ElementaryArithmeticUtils.multiply(operand2, operand1); break; case "/": case "÷": result = Bee.ElementaryArithmeticUtils.divide(operand2, operand1); break; default: result = ""; alert("The operator 【" + elementArr[i] + "】 is not legal"); break; } resultStack.push(result); } } return resultStack; }, //橫式計算 horizontalCalculation: function(expression) { expression = Bee.StringUtils.deleteWhitespace(expression); expression = this.eliminatePositiveOrNegativeSign(expression); var result = expression; while(expression.indexOf("(") >= 0) { expression = expression.replace(/([^()]+)/g, function(matchStr) { return eval(matchStr); }); result += "=" + expression; } while(expression.indexOf("[") >= 0) { expression = expression.replace(/[[^[]]+]/g, function(matchStr) { return eval(matchStr); }); result += "=" + expression; } while(expression.indexOf("{") >= 0) { expression = expression.replace(/{[^{}]+}/g, function(matchStr) { return eval(matchStr); }); result += "=" + expression; } var pattern = /(?:[1-9]d*|0)(?:.d+)?[*/](?:[1-9]d*|0)(?:.d+)?/; while(expression.indexOf("*") >= 0 || expression.indexOf("/") >= 0) { expression = expression.replace(pattern, function(matchStr, index) { return eval(matchStr); }); result += "=" + expression; } if(/[-+*/]/.test(expression)) { result += "=" + eval(expression); } return result; }, //豎式計算 verticalCalculation: function(expression) { var result = this.horizontalCalculation(expression); return result.replace(/=/g, " $&"); } };
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/84597.html
摘要:函數式編程與面向對象編程編程的本質之劍目錄編程的本質讀到兩篇文章寫的不錯綜合摘錄一下復合是編程的本質函數式程序員在洞察問題方面會遵循一個奇特的路線。在面向對象編程中,類或接口的聲明就是表面。 函數式編程與面向對象編程[5]:編程的本質 之劍 2016.5.6 01:26:31 編程的本質 讀到兩篇文章,寫的不錯, 綜合摘錄一下 復合是編程的本質 函數式程序員在洞察問題方面會遵循...
時間:2017年09月03日星期日說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com 教學源碼:https://github.com/zccodere/s...學習源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 面向切面 課程章節 概覽 AOP使用 AOP原理 AOP開源運用 課程實戰 課程總結 面向切面編程是一種...
摘要:前言正則表達式時處理字符串中常用的手法,本文以簡單的方式,快速展示了中正則相關的基礎知識點。文末還提供了幾個簡單的正則相關面試題。接下來是正則部分,注意后面的并不匹配,也就是比如,實際匹配的值是和,在和后面加上,就完成了預期。 前言:正則表達式時處理字符串中常用的手法,本文以簡單的方式,快速展示了JavaScript中正則相關的基礎知識點。文末還提供了幾個簡單的正則相關面試題。個人總結...
摘要:簡言在做用戶實名驗證時,常會用到身份證號碼的正則表達式及校驗方案。身份證號碼說明居民身份證號碼,正確正式的稱謂應該是公民身份號碼。也有說法表述開頭是外國人取得中國身份證號碼的前兩位編碼,但本人并未得到證實。 簡言 在做用戶實名驗證時,常會用到身份證號碼的正則表達式及校驗方案。本文列舉了兩種驗證方案,大家可以根據自己的項目實際情況,選擇適合的方案。 showImg(https://seg...
摘要:性能問題一般不會超過占整個項目性能的,一般在。內置函數的性能優劣。幾乎與在函數中調用局部變量的速度相當。遞增一個全局變量要比遞增一個局部變量慢倍。類似的方法調用所花費的時間接近于次的局部變量遞增操作。 php性能怎么優化?性能是網站運行是否良好的關鍵因素, 網站的性能與效率影響著公司的運營成本及長遠發展,編寫出高質高效的代碼是我們每個開發人員必備的素質,也是我們良好...
閱讀 1500·2021-11-17 09:33
閱讀 1267·2021-10-11 10:59
閱讀 2900·2021-09-30 09:48
閱讀 1909·2021-09-30 09:47
閱讀 3032·2019-08-30 15:55
閱讀 2343·2019-08-30 15:54
閱讀 1499·2019-08-29 15:25
閱讀 1653·2019-08-29 10:57