Blogger Information
Blog 29
fans 0
comment 0
visits 11080
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
JavaScript 实现基本计算器
尹辉
Original
249 people have browsed it

JavaScript 实现基本计算器

在课堂案例基础上更新以下功能

  • 更新 CSS 样式

  • 添加 M+、M-、MR、MC 功能:

  • 添加正负数切换功能

  • 操作符不能位于首位,连续输入时只显示最后输入的操作符

  • 除零错误

  • 按下 +-x÷ 后先计算结果,再添加操作符

JavaScript 代码如下

  1. // 定义 memory 变量,用于存储 M+、M- 数据
  2. let memory = 0;
  3. function calculator(ev){
  4. // 获取显示区 input 元素
  5. const result = document.querySelector('.result');
  6. // 获取显示区内容的最后一个字符,用于判断是否连续输入操作符
  7. const lastChar = result.value.slice(result.value.length - 1, result.value.length);
  8. let isLastCharOperator = false;
  9. if(lastChar == '+' || lastChar == '-' || lastChar == 'x' || lastChar == '÷'){
  10. isLastCharOperator = true;
  11. }
  12. // 如果点击的不是按钮则返回
  13. if (ev.target.tagName !== 'BUTTON') return false;
  14. // 获取当前按钮元素
  15. const curBtn = ev.target;
  16. // 获取当前按钮元素内容
  17. let content = curBtn.textContent;
  18. // 计算函数,+、-、X、/、= 五个操作符都会用到
  19. function calResult(){
  20. // 缓存结果
  21. let tmpResult = 0;
  22. try {
  23. // 如果是乘法,将 "x" 换成 "*"
  24. result.value = result.value.replace('x', '*');
  25. // 如果是除法,将 "÷" 换成 "/"
  26. result.value = result.value.replace('÷', '/');
  27. // 计算字符串表达式
  28. if(result.value == '错误'){
  29. tmpResult = 0;
  30. } else if(result.value.search('/') > 0){
  31. // 如果除于 0 显示“错误”
  32. const tempArr = result.value.split('/');
  33. if (tempArr[tempArr.length-1] == 0){
  34. tmpResult = '错误';
  35. } else {
  36. tmpResult = eval(result.value);
  37. }
  38. } else {
  39. tmpResult = eval(result.value);
  40. }
  41. // 如果结果是小数,仅保留5位就可以了
  42. if (tmpResult.toString().includes('.')) {
  43. tmpResult = tmpResult.toFixed(5);
  44. // 如果小数部分出现了多余的0,应该去掉(对结果精度没影响)
  45. tmpResult = parseFloat(tmpResult);
  46. }
  47. // 显示出结果
  48. result.value = tmpResult;
  49. } catch {
  50. result.value = '错误';
  51. }
  52. }
  53. // 操作符通用函数
  54. function fnOperator() {
  55. // 如果当前显示“错误”,归零
  56. if (result.value == '错误') {
  57. result.value = 0;
  58. } else if (isLastCharOperator) {
  59. // 连续输入操作符,显示最后按的操作符
  60. // 如果操作符后输入“=”,无操作
  61. if(content !== '='){
  62. result.value = result.value.slice(0, -1);
  63. result.value += content;
  64. }
  65. } else {
  66. calResult();
  67. // 计算结果是“错误”,则不加当前操作符
  68. if (result.value !== '错误'){
  69. // 当前按钮是“=”,也不加当前操作符
  70. if(content !== '='){
  71. result.value += content;
  72. }
  73. }
  74. }
  75. }
  76. // 根据用户点击的按钮内容确定要执行的操作
  77. switch (content){
  78. // AC 清零
  79. case 'AC': result.value = '0'; break;
  80. // CE: 退格
  81. case 'CE':
  82. // 如果结果区只有一位数字,或 “错误”,恢复为 0,否则删除最后一个字符
  83. if (result.value.length == 1 || result.value == '错误') {
  84. result.value = 0;
  85. } else {
  86. // 删除最后一个字符
  87. result.value = result.value.slice(0, -1);
  88. }
  89. break
  90. // M+ 累加存储数据
  91. case 'M+':
  92. // 判断显示区内容是否是纯数字
  93. // 如果不是纯数字(含有操作符),显示“错误”
  94. // 如果是纯数字,则将其转换成数值并累加到变量 memory
  95. if ( isNaN(Number(result.value)) ){
  96. result.value = '错误';
  97. } else {
  98. memory += Number(result.value);
  99. }
  100. break;
  101. case 'M-':
  102. // 判断显示区内容是否是纯数字
  103. // 如果不是纯数字(含有操作符),显示“错误”
  104. // 如果是纯数字,则将变量 memory 减去其转换成的数值
  105. if ( isNaN(Number(result.value)) ){
  106. result.value = '错误';
  107. } else {
  108. memory -= Number(result.value);
  109. }
  110. break;
  111. case 'MR':
  112. // 如果显示区不是纯数字
  113. // 1,“错误” => 将显示区内容改为变量 memory 的值
  114. // 2,含有操作符,则将 memory 值添加到操作符后面
  115. // 如果显示区为纯数字,将显示区内容改为变量 memory 的值
  116. if (result.value == '错误'){
  117. result.value = memory;
  118. } else if (isNaN(Number(result.value))){
  119. result.value += memory;
  120. } else {
  121. result.value = memory;
  122. }
  123. break;
  124. case 'MC':
  125. // 将变量 memory 的值清零
  126. memory = 0;
  127. break;
  128. case '±':
  129. // 判断显示区内容是否是纯数字
  130. // 如果不是纯数字(含有操作符),不进行任何操作
  131. // 如果是纯数字,则切换正负
  132. if ( isNaN(Number(result.value)) ){
  133. return false;
  134. } else {
  135. result.value = -result.value;
  136. }
  137. break;
  138. case '+': fnOperator(); break;
  139. case '-': fnOperator(); break;
  140. case 'x': fnOperator(); break;
  141. case '÷': fnOperator(); break;
  142. case '=': fnOperator(); break;
  143. default:
  144. // 如果当前结果区显示0,先清空, 防止出现前导0
  145. // 如果当前结果区显示“错误”,先清空
  146. if (result.value == 0 || result.value == '错误') {
  147. result.value = ''
  148. }
  149. result.value += content;
  150. }
  151. }
Correcting teacher:PHPzPHPz

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post