Vue实现简易计算器

主要采用了javascript中的eval函数和vue.js中的v-for 和v-model来实现计算器,其中处理括号的部分采用栈的特点处理。

<head>
    <title>Title</title>
//引入vue
    <script type="text/javascript" src="js/vue.js"></script>
//简单设置下样式
    <style>
        #app{
            width: 420px;
            border: 1px solid;
        }
        #app>div button{
            margin: 2px;
            width: 100px;
            height: 80px;
            border: none;
        }
    </style>
</head>
<body>
    <div id="app">
            <div>
                <input type="text" v-model="expression" readonly="true">
            </div>
            <div>
                //item代表数组内的元素 index对应相应下标
                <template v-for="(item,index) in num">
                    <button @click="display(index)">{{item}}</button>
                </template><template v-for="(item,index) in sign">
                <button @click="display1(index)">{{item}}</button>
            </template>
            </div>
    </div>
    <script>
        var vm=new Vue({
            el:'#app',
            data:{
                result:0,
                expression:'0',
                num:['0','1','2','3','4','5','6','7','8','9'],
                sign:['(',')','%','C','/','+','-','.','=','*'],
                isFirst:true
            },
            methods:{
                display:function (index) {
                    if(this.isFirst){
                        this.expression=this.num[index];
                        this.isFirst=false;
                    }else{
                        this.expression+=this.num[index];
                    }
                },
                display1:function (index) {
                    if(this.isFirst && this.sign[index]==='('){
                        this.expression=this.sign[index];
                        this.isFirst=false;
                    }else{
                        if(this.sign[index]==='='){
                           this.expression=this.calc(this.expression);
                        }else if(this.sign[index]==='C'){
                            this.expression='0';
                            this.isFirst=true;
                        }else{
                            this.expression+=this.sign[index];
                        }
                    }
                },
                calc:function (expression) {
           
                    var index=this.expression.split("");
                    var stack=[];
                    var calc="";//存储算式
                    var count="";//临时存储结果
                    for(var i=0;i<index.length;i++){
                        if(index[i]===')'){
                            for(var j=stack.length-1;j>=0;j--){
                            //通过栈来把括号一层一层分离
                            //eval是计算表达式类似1+2*4
                                if(stack[j]==='('){
                                    stack.pop();
                                    stack.push((-eval(count)));
                                    break;
                                }
                                count+=stack.pop();
                            }
                        }else{
                            stack.push(index[i]);
                        }
                    }
                    for(var i=0;i<stack.length;i++){
                        calc+=stack[i];
                    }

                    return eval(calc);
                }
            }
        })
    </script>
</body>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值