calc.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. /**!
  2. *
  3. * Copyright(c) boyce and other contributors.
  4. * MIT Licensed
  5. *
  6. * Authors:
  7. * boyce <boyce.ywr@gmail.com> (http://www.jianshu.com/users/9b5b907d9bce)
  8. */
  9. "use strict";
  10. var e = 0,
  11. n = 1,
  12. t = 2,
  13. r = 3,
  14. u = 4,
  15. a = 5,
  16. c = e,
  17. s = 0,
  18. i = "0",
  19. o = "",
  20. f = "",
  21. l = i,
  22. b = "";
  23. function d() {
  24. c = e, s = 0, i = "0", o = "", f = "", l = "0";
  25. }
  26. function p(e) {
  27. return "0" == e;
  28. }
  29. function h(e) {
  30. return e >= "0" && e <= "9";
  31. }
  32. function k(e) {
  33. return "+" == e || "-" == e || "x" == e || "/" == e || "%" == e;
  34. }
  35. function g(e) {
  36. return "." == e;
  37. }
  38. function N(e) {
  39. return "=" == e;
  40. }
  41. function x(e) {
  42. return "d" == e;
  43. }
  44. function m(e, n) {
  45. return e.length < 15 && (e += n), e;
  46. }
  47. function v() {
  48. return c == a || c == u ? (o.length > 0 && (o = o.substr(0, o.length - 1)), void ("" == o && (o = "0"))) : (i.length > 0 && "0" != i && (i = i.substr(0, i.length - 1)), void ("" == i && (i = "0")));
  49. }
  50. function O() {
  51. var e,
  52. n = parseFloat(i),
  53. t = parseFloat(o);
  54. switch (f) {
  55. case "+":
  56. s = n + t;
  57. break;
  58. case "-":
  59. s = n - t;
  60. break;
  61. case "x":
  62. s = n * t;
  63. break;
  64. case "/":
  65. 0 == t ? (d(), s = "NaN", b = "") : s = n / t;
  66. break;
  67. case "%":
  68. 0 == t ? (d(), s = "NaN", b = "") : s = n % t;
  69. }
  70. (e = "" + s).length > 15 && (e = e.substr(0, 15)), s = e;
  71. }
  72. d(), module.exports = {
  73. reset: d,
  74. addOp: function (w) {
  75. var shouldCompute = false; // 新增标志位控制计算结果显示
  76. switch (c) {
  77. case n:
  78. case e:
  79. if (h(w) && !p(w)) {
  80. c = t, i = w;
  81. l = i; // 确保显示当前输入
  82. } else if (g(w)) {
  83. c = r, i = "0.";
  84. l = i; // 确保显示当前输入
  85. } else if (k(w)) {
  86. c = u, i = "0", o = "", f = w;
  87. l = i; // 确保显示当前输入
  88. } else if (N(w)) {
  89. // 修复问题:在初始状态下按等号直接显示结果
  90. l = s.toString();
  91. }
  92. b = "";
  93. break;
  94. case t:
  95. b = "";
  96. if (h(w)) {
  97. i = p(i) ? w : m(i, w);
  98. l = i;
  99. } else if (g(w)) {
  100. c = r, i = "" == i ? "0" : m(i, ".");
  101. l = i;
  102. } else if (x(w)) {
  103. v(), i.indexOf(".") < 0 && (c = t);
  104. l = i; // 显示删除后的数字
  105. } else if (k(w)) {
  106. c = u, o = "", b = f = w;
  107. l = i; // 保持显示第一个数字
  108. } else if (N(w)) {
  109. // 修复问题:在数字后直接按等号
  110. s = parseFloat(i);
  111. l = s.toString();
  112. c = n;
  113. }
  114. break;
  115. case r:
  116. b = "";
  117. if (h(w)) {
  118. i = m(i, w);
  119. l = i;
  120. } else if (x(w)) {
  121. v(), i.indexOf(".") < 0 && (c = t);
  122. l = i;
  123. } else if (k(w)) {
  124. c = u, o = "", b = f = w;
  125. l = i; // 保持显示第一个数字
  126. }
  127. break;
  128. case u:
  129. b = "";
  130. if (h(w)) {
  131. o = p(o) ? w : m(o, w);
  132. l = o;
  133. } else if (g(w)) {
  134. c = a, o = "" == o ? "0" : m(o, ".");
  135. l = o;
  136. } else if (x(w)) {
  137. v(), o.indexOf(".") < 0 && (c = u);
  138. l = o;
  139. } else if (k(w)) {
  140. if ("" != o) {
  141. O();
  142. c = u;
  143. i = s;
  144. o = "";
  145. l = s;
  146. }
  147. b = f = w;
  148. } else if (N(w)) {
  149. // 修复问题:正确处理等号操作符
  150. if (o === "") o = i; // 当第二个操作数为空时使用第一个操作数
  151. if (o !== "") O();
  152. l = s.toString();
  153. c = n;
  154. }
  155. break;
  156. case a:
  157. b = "";
  158. if (h(w)) {
  159. o = m(o, w);
  160. l = o;
  161. } else if (x(w)) {
  162. v(), o.indexOf(".") < 0 && (c = u);
  163. l = o;
  164. } else if (k(w)) {
  165. if ("" != o) {
  166. O();
  167. c = u;
  168. i = s;
  169. o = "";
  170. l = s;
  171. }
  172. b = f = w;
  173. } else if (N(w)) {
  174. // 修复问题:正确处理等号操作符
  175. if (o === "") o = i; // 当第二个操作数为空时使用第一个操作数
  176. if (o !== "") O();
  177. l = s.toString();
  178. c = n;
  179. }
  180. }
  181. // =号操作符的特殊显示处理
  182. if (N(w)) {
  183. b = function (e) {
  184. return "/" == e ? "÷" : "x" == e ? "×" : e;
  185. }(f) + " =";
  186. } else if ("c" == w) {
  187. d();
  188. } else {
  189. b = function (e) {
  190. return "/" == e ? "÷" : "x" == e ? "×" : e;
  191. }(b);
  192. }
  193. },
  194. getVars: function () {
  195. return {
  196. curState: c,
  197. curResult: s,
  198. opNum1: i,
  199. opNum2: o,
  200. op: f,
  201. displayNum: l,
  202. displayOp: b
  203. };
  204. }
  205. };