成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

簡單四則運(yùn)算及表達(dá)式校驗(yàn)

nanfeiyan / 3325人閱讀

簡單四則運(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

相關(guān)文章

  • 函數(shù)式編程與面向?qū)ο缶幊蘙5]:編程的本質(zhì)

    摘要:函數(shù)式編程與面向?qū)ο缶幊叹幊痰谋举|(zhì)之劍目錄編程的本質(zhì)讀到兩篇文章寫的不錯綜合摘錄一下復(fù)合是編程的本質(zhì)函數(shù)式程序員在洞察問題方面會遵循一個奇特的路線。在面向?qū)ο缶幊讨校惢蚪涌诘穆暶骶褪潜砻妗? 函數(shù)式編程與面向?qū)ο缶幊蘙5]:編程的本質(zhì) 之劍 2016.5.6 01:26:31 編程的本質(zhì) 讀到兩篇文章,寫的不錯, 綜合摘錄一下 復(fù)合是編程的本質(zhì) 函數(shù)式程序員在洞察問題方面會遵循...

    miracledan 評論0 收藏0
  • 慕課網(wǎng)_《探秘Spring AOP》學(xué)習(xí)總結(jié)

    時間: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é) 面向切面編程是一種...

    Tony_Zby 評論0 收藏0
  • 前端計劃——JavaScript正則達(dá)式快速入門

    摘要:前言正則表達(dá)式時處理字符串中常用的手法,本文以簡單的方式,快速展示了中正則相關(guān)的基礎(chǔ)知識點(diǎn)。文末還提供了幾個簡單的正則相關(guān)面試題。接下來是正則部分,注意后面的并不匹配,也就是比如,實(shí)際匹配的值是和,在和后面加上,就完成了預(yù)期。 前言:正則表達(dá)式時處理字符串中常用的手法,本文以簡單的方式,快速展示了JavaScript中正則相關(guān)的基礎(chǔ)知識點(diǎn)。文末還提供了幾個簡單的正則相關(guān)面試題。個人總結(jié)...

    Xufc 評論0 收藏0
  • 身份證號碼的正則達(dá)式驗(yàn)證詳解(JavaScript,Regex)

    摘要:簡言在做用戶實(shí)名驗(yàn)證時,常會用到身份證號碼的正則表達(dá)式及校驗(yàn)方案。身份證號碼說明居民身份證號碼,正確正式的稱謂應(yīng)該是公民身份號碼。也有說法表述開頭是外國人取得中國身份證號碼的前兩位編碼,但本人并未得到證實(shí)。 簡言 在做用戶實(shí)名驗(yàn)證時,常會用到身份證號碼的正則表達(dá)式及校驗(yàn)方案。本文列舉了兩種驗(yàn)證方案,大家可以根據(jù)自己的項(xiàng)目實(shí)際情況,選擇適合的方案。 showImg(https://seg...

    laznrbfe 評論0 收藏0
  • php性能怎么優(yōu)化?php性能優(yōu)化安全策略

    摘要:性能問題一般不會超過占整個項(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ì),也是我們良好...

    番茄西紅柿 評論0 收藏2637

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<