JavaScript 普通计算器 思路分析及代码

1。普通计算器代码实现功能

  • 加减乘除运算功能
  • 取小数
  • 取相反数
  • 清除一位数及运算符
  • 全部清除

2。界面
这里写图片描述
此界面参照oppo r9手机自带计算器的界面

3。思路
(1)显示:
显示界面实际为两个框,下方的是showwin,上方的是calwin
用js的字符串拼接将点击的值拼接起来存储在results中,lastkey存储当前鼠标点击的值,然后将results的值放入showwin中,显示出来
(2)加减乘除运算:
点击 = 后,显示运算的结果值,此时运用到js中的eval()函数,可计算某个字符串。
(3)清除全部:
这个功能很容易实现,只需都初始化就行
(4)清除一位操作:
本来我想的很复杂,但是后来想到了js强大的自身封装好的函数功能,可以直接使用substr()函数,此函数从字符串中抽取从 start 下标开始的指定数目的字符,清除一位的话就是最后一位不要了,所以我们就取0到字符串的长度-1的长度显示出来。
(5)取负
设置一个变量flag用来存储现在数的正负,初始为正,故flag为1。再设置一个变量results2来存储正值。每次都判断flag是1还是-1来进行不同的运算就可以了。

4。注意事项
(1)当点击的是”=”或是显示界面的空白处时,不返回任何值。因为此函数是点击就会在显示界面中显示点击值
(2)当点击两次或多次运算位时,不返回任何值
(3)一次运算结束之后,运算结果参与第二次运算。此时当点击的是运算符时,就会直接进行第二次的运算,进行字符串的拼接。
(4)点击小数点时,当没有输入数据,会直接变成0.xx
(5)如果数字前是乘除或后面是乘除然后点击了“=”,则显示输入错误

5。存在的不足
(1)lastkey的值还是有一些乱。
(2)刚刚在写博客的时候发现,小数点这里的问题很多,比如点击了多次小数点,还有比如已经是1.23然后再点击“.”的时候会显示1.23.xx这样的。需要继续改进。
6。需要掌握的知识
js:
- 正则表达式(初步了解即可)
- event对象。(这个需要考虑一下兼容性问题)
- obj.substr()
- obj.match()
- eval()
css:
border-spacing: 0;
7。代码

html及js

<!DOCTYPE html>
<html>
<head>
    <meta  http-equiv="Content-Type" content="text/html" charset="utf-8"/>
    <link rel="stylesheet" type="text/css" href="css/index.css">
    <title>calculator</title>
</head>
<body>
    <table onclick="calculator()" id="calculator">
        <tr>
            <td colspan="4" id="calwin"> </td>
        </tr>
        <tr>
            <td colspan="4" id="showwin">0</td>
        </tr>
        <tr>
            <td class="numberbtn" id="deletebtn">C</td>
            <td class="numberbtn">+/-</td>
            <td class="numberbtn"><-]</td>
            <td class="operatebtn">/</td>
        </tr>
        <tr>
            <td class="numberbtn">7</td>
            <td class="numberbtn">8</td>
            <td class="numberbtn">9</td>
            <td class="operatebtn">*</td>
        </tr>
        <tr>
            <td class="numberbtn">4</td>
            <td class="numberbtn">5</td>
            <td class="numberbtn">6</td>
            <td class="operatebtn">-</td>
        </tr>
        <tr>
            <td class="numberbtn">1</td>
            <td class="numberbtn">2</td>
            <td class="numberbtn">3</td>
            <td class="operatebtn">+</td>
        </tr>
        <tr>
            <td class="numberbtn" colspan="2">0</td>
            <td class="numberbtn">.</td>
            <td class="operatebtn" onclick="resequal()">=</td>
        </tr>
    </table>
    <script type="text/javascript" src="js/jquery.min.js"></script>
    <script type="text/javascript">
        var calresults="";//运算结果
        var results="";//运算表达式
        var results2="";//存储正值
        var lastkey="";//存储点击值
        var flag=1;//正负号变换标志
        //正则表达式
        var re1=/^[\*|\/].+/;//操作数前面是乘或除
        var re2=/.+[\*|\/]$/;//操作数最后面是乘或除
        var re3=/(\+|-|\*|\/)/;//加减乘除
        function calculator(){
            //如果点击的是=或者是上面显示框的空白处,就不返回
            if (event.srcElement.innerText=="="||event.srcElement.id=="showwin"||event.srcElement.id=="calwin") {
                return;
            }
            //清除全部功能
            else if (event.srcElement.innerText=="C") {
                results="";
                calresults="";
                showwin.innerText="0";
                calwin.innerText="";
                return;
            }
            //清除一位
            else if(event.srcElement.innerText=="<-]") {
                results=results.substr(0,results.length-1);
                showwin.innerText = results;
                return;
            }
            //点击两次运算位
            else if (lastkey.match(re3)&&event.srcElement.innerText.match(re3)) {
                return;
            }
            //取负
            else if (event.srcElement.innerText=="+/-"&&results!="") {
                if (flag==-1) {
                    //强制转换为字母类型
                    results=String(results2);
                    showwin.innerText=results;
                    flag=-flag;
                    return;
                }
                results2=results;
                results="-"+results;
                flag=-flag;
                showwin.innerText=results;
                return;
            }
            //取上次运算结果继续运算
            else if (lastkey=="="&&event.srcElement.innerText.match(re3)) {
                results=calresults;
                results+=event.srcElement.innerText;
                showwin.innerText=results;

            }
            //如果没有输入数据点击小数点时
            else if (event.srcElement.innerText=="."&&results=="") {
                results="0"+event.srcElement.innerText;
                showwin.innerText=results;
            }
            else{
                results+=event.srcElement.innerText;
                lastkey=event.srcElement.innerText;
                showwin.innerText=results;
            }

        }
        function resequal(){
            //如果数字前是乘除或数字后是乘除
            if (results.match(re1)||results.match(re2)) {
                showwin.innerText="输入错误!";
                calwin.innerText="";
                results="";
                return;
            }
            else{
                calresults=eval(results);
                showwin.innerText=calresults;
                calwin.innerText=results;
                lastkey="=";
            }
        }

    </script>

</body>
</html>

css:

*{
    padding:0;
    margin:1px;
}
#calculator{
    margin: auto;
    margin-top: 50px;
    border-spacing: 0;
}
#calwin{
    width: 100%;
    max-width: 246px;
    height: 60px;
    background-color:rgb(23,24,32);
    font-weight: bold;
    color: #ddd; 
    text-align: right;
    padding-right: 5px;
}
#showwin{
    width: 100%;
    max-width: 246px;
    height: 30px;
    background-color: rgb(23,24,32);
    color: rgb(220,220,221);
    font-weight: bold;
    overflow: hidden;
    text-align: right;
    padding-right: 5px;
}
.numberbtn{
    cursor:pointer;
    width: 60px;
    height: 60px;
    text-align: center;
    border: 0.5px solid rgb(54,54,58);
    background-color: rgb(55,59,74);
    color: #fff;
}
.numberbtn:hover,.numberbtn:active{
    background-color: rgb(39,40,47);
}
.operatebtn{
    cursor: pointer;
    width: 60px;
    height: 60px;
    text-align: center;
    border: 0.5px solid rgb(54,54,58);
    background-color: rgb(166,61,70);
    color: #fff;
}
.operatebtn:hover,.operatebtn:active{
    background-color: rgb(146,53,61);
}

猜你喜欢

转载自blog.csdn.net/weixin_42128001/article/details/81542043