簡單四則運(yùn)算及表達(dá)式校驗(yàn)和轉(zhuǎn)換工具類,僅供參考。
完整工具類請往我的github項(xiàng)目bee.js
//簡單四則運(yùn)算 ElementaryArithmeticUtils = { //運(yùn)算符優(yōu)先級 operatorPrecedence: { "+": 0, "-": 0, "*": 1, "×": 1, "÷": 1, "/": 1 }, //運(yùn)算符 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避免多出來小數(shù)位,如 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); }, //校驗(yàn)表達(dá)式的合法性 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; }, //中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式 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])) { //如果是數(shù)值 resultStack.push(elementArr[i]); } else { //操作符棧頂元素 var operatorStackTopElement = operatorStack.length === 0 ? "" : operatorStack[operatorStack.length - 1]; //運(yùn)算符 if(operatorStack.length === 0 || elementArr[i] === "(" || operatorStackTopElement === "(" || this.operatorPrecedence[elementArr[i]] > this.operatorPrecedence[operatorStackTopElement]) { //操作符棧為空或棧頂元素為右括號")",或操作符的優(yōu)先級比棧頂運(yùn)算符高或相等,直接入棧 operatorStack.push(elementArr[i]); } else { //如果是右括號")",則依次彈出操作符棧頂?shù)倪\(yùn)算符,并壓入結(jié)果棧,直到遇到左括號"("為止,左右括號不壓入結(jié)果棧; if(elementArr[i] === ")") { for(var index = operatorStack.length - 1; index >= 0; index--) { if(operatorStack[index] === "(") { operatorStack.pop(); break; } else { resultStack.push(operatorStack.pop()); } } } else { //將符號棧頂?shù)倪\(yùn)算符彈出并壓入到結(jié)果棧中,再次與符號棧中新的棧頂運(yùn)算符相比較 resultStack.push(operatorStack.pop()); i--; continue; } } } } //處理操作符棧剩余的符號 if(operatorStack.length > 0) { for(var j = operatorStack.length - 1; j >= 0; j--) { resultStack.push(operatorStack.pop()); } } //結(jié)果返回 return resultStack.join(" "); }, //中綴表達(dá)式轉(zhuǎn)前綴表達(dá)式(結(jié)果以空格隔開) 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])) { //如果是數(shù)值 resultStack.push(elementArr[i]); } else { //操作符棧頂元素 var operatorStackTopElement = operatorStack.length === 0 ? "" : operatorStack[operatorStack.length - 1]; //運(yùn)算符 if(operatorStack.length === 0 || elementArr[i] === ")" || operatorStackTopElement === ")" || this.operatorPrecedence[elementArr[i]] >= this.operatorPrecedence[operatorStackTopElement]) { //操作符棧為空或棧頂元素為右括號")",或操作符的優(yōu)先級比棧頂運(yùn)算符高或相等,直接入棧 operatorStack.push(elementArr[i]); } else { //如果是左括號"(",則依次彈出操作符棧頂?shù)倪\(yùn)算符,并壓入結(jié)果棧,直到遇到右括號")"為止,左右括號不壓入結(jié)果棧; if(elementArr[i] === "(") { for(var index = operatorStack.length - 1; index >= 0; index--) { if(operatorStack[index] === ")") { operatorStack.pop(); break; } else { resultStack.push(operatorStack.pop()); } } } else { //將符號棧頂?shù)倪\(yùn)算符彈出并壓入到結(jié)果棧中,再次與符號棧中新的棧頂運(yùn)算符相比較 resultStack.push(operatorStack.pop()); i++; continue; } } } } //處理操作符棧剩余的符號 if(operatorStack.length > 0) { for(var j = operatorStack.length - 1; j >= 0; j--) { resultStack.push(operatorStack.pop()); } } //結(jié)果返回 return resultStack.reverse().join(" "); }, //解決正負(fù)號問題-1轉(zhuǎn)為0-1;+1轉(zhuǎn)為0+1 eliminatePositiveOrNegativeSign: function(expression) { return expression.replace(/((|^)([-+])/g, "$10$2"); }, //把中綴表達(dá)式轉(zhuǎn)為前綴表達(dá)式,再計算 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])) { //如果是數(shù)值 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; }, //把中綴表達(dá)式轉(zhuǎn)為后綴表達(dá)式,再計算 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])) { //如果是數(shù)值 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, " $&"); } };
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/84597.html
摘要:函數(shù)式編程與面向?qū)ο缶幊叹幊痰谋举|(zhì)之劍目錄編程的本質(zhì)讀到兩篇文章寫的不錯綜合摘錄一下復(fù)合是編程的本質(zhì)函數(shù)式程序員在洞察問題方面會遵循一個奇特的路線。在面向?qū)ο缶幊讨校惢蚪涌诘穆暶骶褪潜砻妗? 函數(shù)式編程與面向?qū)ο缶幊蘙5]:編程的本質(zhì) 之劍 2016.5.6 01:26:31 編程的本質(zhì) 讀到兩篇文章,寫的不錯, 綜合摘錄一下 復(fù)合是編程的本質(zhì) 函數(shù)式程序員在洞察問題方面會遵循...
時間:2017年09月03日星期日說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com 教學(xué)源碼:https://github.com/zccodere/s...學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 面向切面 課程章節(jié) 概覽 AOP使用 AOP原理 AOP開源運(yùn)用 課程實(shí)戰(zhàn) 課程總結(jié) 面向切面編程是一種...
摘要:前言正則表達(dá)式時處理字符串中常用的手法,本文以簡單的方式,快速展示了中正則相關(guān)的基礎(chǔ)知識點(diǎn)。文末還提供了幾個簡單的正則相關(guān)面試題。接下來是正則部分,注意后面的并不匹配,也就是比如,實(shí)際匹配的值是和,在和后面加上,就完成了預(yù)期。 前言:正則表達(dá)式時處理字符串中常用的手法,本文以簡單的方式,快速展示了JavaScript中正則相關(guān)的基礎(chǔ)知識點(diǎn)。文末還提供了幾個簡單的正則相關(guān)面試題。個人總結(jié)...
摘要:簡言在做用戶實(shí)名驗(yàn)證時,常會用到身份證號碼的正則表達(dá)式及校驗(yàn)方案。身份證號碼說明居民身份證號碼,正確正式的稱謂應(yīng)該是公民身份號碼。也有說法表述開頭是外國人取得中國身份證號碼的前兩位編碼,但本人并未得到證實(shí)。 簡言 在做用戶實(shí)名驗(yàn)證時,常會用到身份證號碼的正則表達(dá)式及校驗(yàn)方案。本文列舉了兩種驗(yàn)證方案,大家可以根據(jù)自己的項(xiàng)目實(shí)際情況,選擇適合的方案。 showImg(https://seg...
摘要:性能問題一般不會超過占整個項(xiàng)目性能的,一般在。內(nèi)置函數(shù)的性能優(yōu)劣。幾乎與在函數(shù)中調(diào)用局部變量的速度相當(dāng)。遞增一個全局變量要比遞增一個局部變量慢倍。類似的方法調(diào)用所花費(fèi)的時間接近于次的局部變量遞增操作。 php性能怎么優(yōu)化?性能是網(wǎng)站運(yùn)行是否良好的關(guān)鍵因素, 網(wǎng)站的性能與效率影響著公司的運(yùn)營成本及長遠(yuǎn)發(fā)展,編寫出高質(zhì)高效的代碼是我們每個開發(fā)人員必備的素質(zhì),也是我們良好...
閱讀 1509·2021-11-17 09:33
閱讀 1276·2021-10-11 10:59
閱讀 2906·2021-09-30 09:48
閱讀 1916·2021-09-30 09:47
閱讀 3041·2019-08-30 15:55
閱讀 2349·2019-08-30 15:54
閱讀 1502·2019-08-29 15:25
閱讀 1659·2019-08-29 10:57