前文: 四则计算器(一)
对前文的四则计算器做如下改进:
- 处理小数点,不出现
13.2.2
这种情况 - 增加清零、删除功能
- 增加历史记录功能
处理小数点、处理符号
1. 问题描述
处理思路:当点击小数点的时候,函数判断当前的字符串到上一个运算符之前有没有小数点。如果有,就不允许输入小数点了
再次观察自己的实现方式,发现这样的代码(没有做任何校验)会出现下图所示的情况:
实际上,应该对所有的符号做处理,不应该将+ - * /
放在onclicknum
函数中做处理
var numresult;
var str;
function onclicknum(nums) {
str = document.getElementById("nummessege");
str.value = str.value + nums;
}
function onclickresult() {
str = document.getElementById("nummessege");
numresult = eval(str.value);
str.value = numresult;
}
2. 解决方法
错误的情况:
- 运算符没有算子
当输入符号时,不允许上一个字符是符号 - 小数
当输入小数点时,到上一个操作符为止,不允许有小数点
var numresult;
var str;
function onclicknum(nums) {
str = document.getElementById("nummessege");
str.value = str.value + nums;
}
function onclickresult() {
str = document.getElementById("nummessege");
if (isOperator(str.value.charAt(str.value.length - 1)) || isPoint(str.value.charAt(str.value.length - 1))) {
str.value = str.value.substring(0, str.value.length-1); //若最后一个字符是符号,则删除
}
numresult = eval(str.value);
str.value = numresult;
}
function onclicksymbol(symbol) {
str = document.getElementById("nummessege");
if (isOperator(str.value.charAt(str.value.length - 1)) || isPoint(str.value.charAt(str.value.length - 1))) {
return 0;
} else {
//上一个字符不是符号
if (symbol == `.`) {
//输入小数点,判断到前一个运算符前有没有小数点,
//如果没有,就可以,如果有,就不行。
for (var i = str.value.length - 2; i >= 0; i--) {
console.log(str.value.charAt(i));
if (isPoint(str.value.charAt(i))) {
return 0;
} else if (isOperator(str.value.charAt(i))) {
break;
}
}
}
str.value = str.value + symbol;
}
}
function isOperator(char_isOperator) {
if (char_isOperator == '+' || char_isOperator == '-' || char_isOperator == '*' || char_isOperator == '/') {
return true;
}
return false;
}
function isPoint(char_isPoint) {
if (char_isPoint == `.`) {
return true;
}
return false;
}
清零和删除
- 增加按键
- 增加处理逻辑,清零则清空输入区,退格则删除最后一个数字
.html
文件
<tr>
<td colspan="2">
<input class=col2 type="button" value="CE" id="CE" onclick="onclear()"