您的位置首页生活百科

详解用javascript写一个简单计算器(二)

详解用javascript写一个简单计算器(二)

的有关信息介绍如下:

详解用javascript写一个简单计算器(二)

上一篇已经写好计算器的界面,和最简单的计算功能,这篇主要是继续完善计算器的机能,增强其功能,和提高其使用的容错率。

48详解用javascript写一个简单计算器(一)

var results="";

var calresults="";

function calculater(){

if (event.srcElement.innerText=="=") {

return;

}

results+=event.srcElement.innerText;

display.innerText=results;

}

function resultscalcaulte(){

calresults=eval(results);

display.innerText=calresults;

}

这是(一)篇的js代码,非常简单

我们需要增加的功能有

1.c键的清除功能

2.判断算式是否合理

3.多运算符号输入处理

4.+/-相反数要求的功能

5.按了等号运算后得到的结果继续运算

1.c键的清除功能,在calculater()里加入如下代码

if (event.srcElement.innerText=="c") {

results="";

display.innerText="0";

return;

}

判断如果点击了c的单元格,使results置空,display显示“0”

然后我们需要识别输入的算式,可以用循环和条件语句来做,但这样代码显得比较繁琐,这里我们可以用正则表达来识别输入的算式是否符合要求。

正则表达的内容比较多,这里我们只讲一下我们要用到的符号

\,是转义字符,例如\+表示是"+"这个字符,因为+在正则表达也有自己的含义,所以要用转义字符;

.,表示前面可以是任意的字符

+,表示前面的设定的字符可以重复多次,.+这样写表示前面可以有任意个任意字符

{a},表示前面的设定字符要出现a次

^,表示设置第一位字符

[^表达式],这个^表示不能存在[]里的这些字符的意思

$,表示设置最后一位字符

|,表示或,与编程的或意思一样

\b,表示0-9数字的任意一个

match()函数,用来检测字符串是否符合正则表达式的要求,如果有匹配符合要求的就返回这个字符串,否则返回null

举例说明正则表达式

if (event.srcElement.innerText=="=") {

return;

}

这是我们检测字符是不是=的方法

如果用正侧,表达来写就可以改为这样

var re=/=/;

if (event.srcElement.innerText.match(re)) {

return;

}

/=/就是一个简单的正则表达,表示判断是不是字符“=”

2.接下来我们要判断算式是否合理,如果算式的第一位是运算符号*或/时,则输出“输入错误”,我们可以加入下面代码

var re1=/^[\*|\/].+/;

if (results.match(re1)) {

display.innerText="输入错误";

results="";

return;

}

re1=/^[\*|\/].+/,就是判断字符串的开头是不是符号*或/的正则表达,如果符合正则表达就显示输入错误

我们还要考虑到如果算式是以运算符号*或/结尾时按下等号,也要算是错误的,我们再可以修改一下代码

var re1=/^[\*|\/].+/;

var re2=/.+[\*|\/]$/;

if (results.match(re1)||results.match(re2)) {

display.innerText="输入错误";

results="";

return;

}

代码放在resultscalcaulte()里

3.多运算符号输入处理,例如如果不小心双击了加号,这样多出一个加号,就要重新输入了,我们可以设置如果上一个点击是运算符号,那下一个显示就不能是运算符号。

为此我们要设置多一个全局变量存储上一个点击的值

var lastkey="";

增加一个正则运算判断是不是运算符号

var re3=/(\+|-|\*|\/)/;

再在calculater()里加入

if(lastkey.match(re3)&&event.srcElement.innerText.match(re3)){

return;

}

这样多运算符号输入处理得到了优化处理

4.+/-相反数要求的功能,在calculater()里加入

if (event.srcElement.innerText=="+/-"&&results!="") {

results = "-"+"("+results+")";

display.innerText=results;

return;

}

就把现有数字或算式加上括号,再在前面加负号

当然我们可以继续优化一下,改按了一下+/-键,再按一下+/-键就取消添加括号与负号,再按一下就又添加括号与负号,为此要多加俩个全局变量flg和results2,代码变为

if (event.srcElement.innerText=="+/-"&&results!="") {

if (flg==-1) {

results=String(results2);

display.innerText=results;

flg=-flg;

return;

}

results2=results;

results = "-"+"("+results+")";

flg=-flg;

display.innerText=results;

return;

}

String(results2),这里强制类型转换的原因是results2有可能会是数字类型而非字母类型,因为.match()要求必须results必须要是string类型,所以就进行一下强制类型转换

5.按了等号运算后得到的结果继续运算,在calculater()里加入

if(lastkey=="="&&event.srcElement.innerText.match(re3)){

results=calresults;

}

在resultscalcaulte(),加入

lastkey="=";

简单来说就是运算后,检测再输入的键是不是运算符号,如果是,就用结果继续运算,如果不是就重新开始新算式

这样这个简单的计算器就具有实用功能,下面附上上面完整的js代码

var results="";

var results2="";

var calresults="";

var lastkey="";

var flg=1;

var re1=/^[\*|\/].+/;

var re2=/.+[\*|\/]$/;

var re3=/(\+|-|\*|\/)/;

var re4=/.+[\+|-|\*|\/]{1,99}.+/

var re5=/\d.+/;

function calculater () {

if (event.srcElement.innerText=="=") {

return;

}

if (event.srcElement.innerText=="c") {

results="";

display.innerText="0";

return;

}

if (event.srcElement.id=="display") {

return;

}

if (results.match(re1)) {

display.innerText="输入错误";

results="";

return;

}

if(lastkey.match(re3)&&event.srcElement.innerText.match(re3)){

return;

}

if(lastkey=="="&&event.srcElement.innerText.match(re3)){

results=calresults;

}

if (event.srcElement.innerText=="+/-"&&results!="") {

if (flg==-1) {

results=String(results2);

display.innerText=results;

flg=-flg;

return;

}

results2=results;

results = "-"+"("+results+")";

flg=-flg;

display.innerText=results;

return;

}

results+=event.srcElement.innerText;

lastkey=event.srcElement.innerText;

display.innerText=results;

}

function resultscalcaulte(){

if (results.match(re1)||results.match(re2)) {

display.innerText="输入错误";

results="";

return;

}

calresults=eval(results);

display.innerText=calresults;

lastkey="=";

results="";

}

只要理解上面内容,你还可以继续完善这个简单的计算,修改一下键的功能,

这里就到此结束了。