Calculator.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. Namespace.register("U.Control.Calcu"); //注册控件命名空间
  2. /*
  3. The Calculator By:
  4. 赖杰辉
  5. 蔡旭升
  6. 金奕和
  7. */
  8. U.Control.Calcu.ACnCE = 0; //判断是否有计算结果,有计算结果值为1,否则为0
  9. U.Control.Calcu.Ans = 0; //Ans初始化,Ans为上一次运算的结果
  10. U.Control.Calcu.Result = "0"; //计算结果初始化
  11. U.Control.Calcu.RE = /0{1,6}/; //正则表达式
  12. U.Control.Calcu.ACBtn;//记录ac按钮
  13. //运算符键入状态初始化
  14. U.Control.Calcu.SymbolStatus = { LBracket: 0, RBracket: 0, Equal: 0, Dot: 0 };
  15. U.Control.Calcu.BtnTextList = [['(', ')', '%', 'AC'],
  16. ['7', '8', '9', '/'],
  17. ['4', '5', '6', '*'],
  18. ['1', '2', '3', '-'],
  19. ['0', '.', '=', '+']];
  20. //运算符集
  21. U.Control.Calcu.MathematicalSymbol = [')', '(', '.', '%', '/', '*',
  22. '-', '+', '=', 'ACnCE'];
  23. U.Control.Calcu.Number = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
  24. //页面初始化 调用 U.Control.Calcu.PageInitialization() 返回动态生成的计算器控件窗体
  25. U.Control.Calcu.PageInitialization = function () {
  26. // $(ParentNode).append('<div id="U_Cal_head"><div id="U_Cal_title_row">计算器</div><div id="U_Cal_switch_btn"></div><img src="IMG/1.jpg" id="U_Cal_switch_btn"><div id="U_Cal_process_output_row"></div><div id="U_Cal_result_output_row">0</div></div><div id="U_Cal_body"></div>');
  27. /*
  28. <div id="U_Cal_head">
  29. <div id="U_Cal_title_row">计算器</div>
  30. <div id="U_Cal_switch_btn"></div>
  31. <img src="IMG/1.jpg" id="U_Cal_switch_btn">
  32. <div id="U_Cal_process_output_row"></div>
  33. <div id="U_Cal_result_output_row">0</div>
  34. </div>
  35. <div id="U_Cal_body"></div>
  36. */
  37. var Calcu = $$('div', { "className": "U_Cal", "style": { "width": "228px"} });
  38. var CalcuHead = $$('div', { "id": "U_Cal_head" }, Calcu);
  39. var CalcuHeadTittle = $$('div', { "id": "U_Cal_title_row" }, CalcuHead);
  40. var CalcuHeadSwitchBtn = $$('div', { "id": "U_Cal_switch_btn" }, CalcuHead);
  41. var CalcuHeadImg = $$('img', { "id": "U_Cal_switch_btn", "src": "http://d.1473.cn/controls/pc/Calculator/IMG/1.jpg" }, CalcuHead);
  42. var CalcuHeadProcessOutRow = $$('div', { "id": "U_Cal_process_output_row" }, CalcuHead);
  43. var CalcuHeadResultOuRow = $$('div', { "id": "U_Cal_result_output_row" }, CalcuHead);
  44. var CalcuBody = $$('div', { "id": "U_Cal_body" }, Calcu);
  45. //传入生成的div
  46. U.Control.Calcu.CreateBtn(CalcuBody, CalcuHeadProcessOutRow, CalcuHeadResultOuRow);
  47. //返回动态生成的计算器控件窗体
  48. return Calcu;
  49. }
  50. //创建按钮,传入生成的div
  51. U.Control.Calcu.CreateBtn = function (CalcuBody, CalcuHeadProcessOutRow, CalcuHeadResultOuRow) {
  52. // $('#U_Cal_body')[0].innerHTML = '';
  53. //创建 Btn Column 后在 Btn Column 内创建Btn并添加点击事件
  54. U.Control.Calcu.BtnTextList.forEach(function (item, index, array) {
  55. var BtnColumn = $$('div', { "class": "U_Cal_btn_column" }, CalcuBody);
  56. item.forEach(function (item, index, array) {
  57. if (index == 0) {
  58. var Btn = $$('div', { "class": "U_Cal_btn", "style": { "border-left": "none"} }, BtnColumn);
  59. Btn.innerHTML = item;
  60. //添加点击事件
  61. Btn.addEventListener('click', function () {
  62. U.Control.Calcu.JudgmentBtn(item, CalcuHeadProcessOutRow, CalcuHeadResultOuRow);
  63. }, false);
  64. } else {
  65. if (item == "AC") {
  66. var ACBtn = $$('div', { "id": "U_Cal_ACnCE", "class": "U_Cal_btn U_Cal_btn_ACnCE" }, BtnColumn);
  67. U.Control.Calcu.ACBtn = ACBtn;
  68. } else if (item == "=") {
  69. var ACBtn = $$('div', { "id": "U_Cal_ACnCE", "class": "U_Cal_btn", "style": { "background-color": "#0e79cb"} }, BtnColumn);
  70. } else {
  71. var ACBtn = $$('div', { "class": "U_Cal_btn" }, BtnColumn);
  72. }
  73. ACBtn.innerHTML = item;
  74. ACBtn.onclick = function () {
  75. U.Control.Calcu.JudgmentBtn(item, CalcuHeadProcessOutRow, CalcuHeadResultOuRow)
  76. };
  77. //添加点击事件
  78. // Btn.addEventListener('click', function () {
  79. // U.Control.Calcu.JudgmentBtn(item);
  80. // }, false);
  81. }
  82. });
  83. });
  84. }
  85. //根据参数,判断点击按钮
  86. //核心模块待优化,写面条我认了,只求打我的时候轻点 QvQ
  87. U.Control.Calcu.JudgmentBtn = function (BtnText, CalcuHeadProcessOutRow, CalcuHeadResultOuRow) {
  88. //如果运算结果错误,键入任何内容都将初始化计算器
  89. if (CalcuHeadResultOuRow.innerHTML == "Error") {
  90. CalcuHeadResultOuRow.innerHTML = "0";
  91. }
  92. //更改ACnCE按钮状态
  93. if (!U.Control.Calcu.ACnCE) {
  94. U.Control.Calcu.ACBtn.innerHTML = "CE";
  95. }
  96. if (BtnText == "AC") {
  97. //如果键入的是AC则初始化计算器
  98. if (U.Control.Calcu.ACnCE) {
  99. CalcuHeadProcessOutRow.innerHTML = "Ans = " + U.Control.Calcu.Ans;
  100. U.Control.Calcu.Result = "0";
  101. CalcuHeadResultOuRow.innerHTML = "0";
  102. } else {
  103. //如果键入的是CE则删除上一次键入的内容
  104. if (U.Control.Calcu.Number.includes(CalcuHeadResultOuRow.innerHTML.slice(-1))) {
  105. U.Control.Calcu.Result = U.Control.Calcu.Result.slice(0, -1);
  106. CalcuHeadResultOuRow.innerHTML = CalcuHeadResultOuRow.innerHTML.slice(0, -1);
  107. } else {
  108. //判断删除的符号
  109. if (CalcuHeadResultOuRow.innerHTML.slice(-1) == "(") {
  110. U.Control.Calcu.SymbolStatus.LBracket = 0;
  111. U.Control.Calcu.SymbolStatus.RBracket = 0;
  112. U.Control.Calcu.Result = U.Control.Calcu.Result.slice(0, -1);
  113. CalcuHeadResultOuRow.innerHTML = CalcuHeadResultOuRow.innerHTML.slice(0, -1);
  114. } else if (CalcuHeadResultOuRow.innerHTML.slice(-1) == ")") {
  115. U.Control.Calcu.SymbolStatus.RBracket = 1;
  116. U.Control.Calcu.Result = U.Control.Calcu.Result.slice(0, -1);
  117. CalcuHeadResultOuRow.innerHTML = CalcuHeadResultOuRow.innerHTML.slice(0, -1);
  118. } else if (CalcuHeadResultOuRow.innerHTML.slice(-1) == ".") {
  119. U.Control.Calcu.SymbolStatus.Dot = 0;
  120. U.Control.Calcu.Result = U.Control.Calcu.Result.slice(0, -1);
  121. CalcuHeadResultOuRow.innerHTML = CalcuHeadResultOuRow.innerHTML.slice(0, -1);
  122. } else {
  123. U.Control.Calcu.Result = U.Control.Calcu.Result.slice(0, -1);
  124. CalcuHeadResultOuRow.innerHTML = CalcuHeadResultOuRow.innerHTML.slice(0, -3);
  125. }
  126. }
  127. }
  128. //如果键入的是运算符则执行下面的代码
  129. } else if (U.Control.Calcu.MathematicalSymbol[8] == BtnText) {
  130. if (U.Control.Calcu.SymbolStatus.RBracket) {
  131. if (eval(U.Control.Calcu.Result + ")") == Infinity) {
  132. CalcuHeadProcessOutRow.innerHTML = ""; //$("#U_Cal_result_output_row")[0].innerHTML + ")"
  133. CalcuHeadResultOuRow.innerHTML = "Error";
  134. U.Control.Calcu.Result = "0";
  135. U.Control.Calcu.Ans = 0;
  136. U.Control.Calcu.ACBtn.innerHTML = "AC";
  137. U.Control.Calcu.ACnCE = 1;
  138. } else {
  139. U.Control.Calcu.Result = eval(U.Control.Calcu.Result + ")").toString();
  140. CalcuHeadProcessOutRow.innerHTML = CalcuHeadResultOuRow.innerHTML + ")";
  141. if (U.Control.Calcu.Result.includes('.') && U.Control.Calcu.Result.length - U.Control.Calcu.Result.indexOf('.') - 1 > 6) {
  142. U.Control.Calcu.Result = U.Control.Calcu.Result.slice(0, U.Control.Calcu.Result.indexOf('.') + 7).replace(U.Control.Calcu.RE, '');
  143. }
  144. CalcuHeadResultOuRow.innerHTML = U.Control.Calcu.Result;
  145. U.Control.Calcu.Ans = U.Control.Calcu.Result;
  146. U.Control.Calcu.ACBtn.innerHTML = "AC";
  147. U.Control.Calcu.ACnCE = 1;
  148. }
  149. } else {
  150. if (eval(U.Control.Calcu.Result) == Infinity) {
  151. CalcuHeadProcessOutRow.innerHTML = ""; //$("#U_Cal_result_output_row")[0].innerHTML
  152. CalcuHeadResultOuRow.innerHTML = "Error";
  153. U.Control.Calcu.Result = "0";
  154. U.Control.Calcu.Ans = 0;
  155. U.Control.Calcu.ACBtn.innerHTML = "AC";
  156. U.Control.Calcu.ACnCE = 1;
  157. } else {
  158. CalcuHeadProcessOutRow.innerHTML = CalcuHeadResultOuRow.innerHTML;
  159. U.Control.Calcu.Result = eval(U.Control.Calcu.Result).toString();
  160. if (U.Control.Calcu.Result.includes('.') && U.Control.Calcu.Result.length - U.Control.Calcu.Result.indexOf('.') - 1 > 6) {
  161. U.Control.Calcu.Result = U.Control.Calcu.Result.slice(0, U.Control.Calcu.Result.indexOf('.') + 7).replace(U.Control.Calcu.RE, '');
  162. }
  163. CalcuHeadResultOuRow.innerHTML = U.Control.Calcu.Result;
  164. U.Control.Calcu.Ans = U.Control.Calcu.Result;
  165. U.Control.Calcu.ACBtn.innerHTML = "AC";
  166. U.Control.Calcu.ACnCE = 1;
  167. }
  168. }
  169. } else if (U.Control.Calcu.MathematicalSymbol.slice(0, 2).includes(BtnText)) {
  170. //判断括号闭合状态,如果需要键入右括号且上一个键入符非左括号则运行if内的语句
  171. if (BtnText == ")" && U.Control.Calcu.SymbolStatus.RBracket == 1 && U.Control.Calcu.Result.slice(-1) != "(") {
  172. //更改括号键入状态,需要键入右括号
  173. U.Control.Calcu.SymbolStatus.RBracket = 0;
  174. U.Control.Calcu.SymbolStatus.LBracket = 0;
  175. U.Control.Calcu.Result = U.Control.Calcu.Result + BtnText;
  176. CalcuHeadResultOuRow.innerHTML = CalcuHeadResultOuRow.innerHTML + BtnText;
  177. U.Control.Calcu.ACnCE = 0;
  178. U.Control.Calcu.ACBtn.innerHTML = "CE";
  179. } else if (BtnText == "(" && U.Control.Calcu.SymbolStatus.LBracket == 0 && U.Control.Calcu.Result.slice(-1) != ")") { //判断左括号键入状态
  180. if (U.Control.Calcu.Result == "0") {
  181. U.Control.Calcu.SymbolStatus.RBracket = 1;
  182. //更改括号键入状态,不允许键入多个左括号
  183. U.Control.Calcu.SymbolStatus.LBracket = 1;
  184. U.Control.Calcu.Result = "(";
  185. CalcuHeadResultOuRow.innerHTML = BtnText;
  186. U.Control.Calcu.ACnCE = 0;
  187. U.Control.Calcu.ACBtn.innerHTML = "CE";
  188. } else if (U.Control.Calcu.SymbolStatus.LBracket == 0 && !U.Control.Calcu.Number.includes(U.Control.Calcu.Result.slice(-1))) {
  189. U.Control.Calcu.SymbolStatus.RBracket = 1;
  190. U.Control.Calcu.SymbolStatus.LBracket = 1;
  191. U.Control.Calcu.Result = U.Control.Calcu.Result + BtnText;
  192. CalcuHeadResultOuRow.innerHTML = CalcuHeadResultOuRow.innerHTML + BtnText;
  193. U.Control.Calcu.ACnCE = 0;
  194. U.Control.Calcu.ACBtn.innerHTML = "CE";
  195. }
  196. }
  197. } else if (U.Control.Calcu.MathematicalSymbol.slice(3, 8).includes(BtnText) && !U.Control.Calcu.MathematicalSymbol.slice(1, 8).includes(U.Control.Calcu.Result.slice(-1))) {
  198. U.Control.Calcu.Result = U.Control.Calcu.Result + BtnText;
  199. U.Control.Calcu.SymbolStatus.Dot = 0;
  200. CalcuHeadResultOuRow.innerHTML = CalcuHeadResultOuRow.innerHTML + " " + BtnText + " ";
  201. U.Control.Calcu.ACnCE = 0;
  202. U.Control.Calcu.ACBtn.innerHTML = "CE";
  203. } else if (U.Control.Calcu.MathematicalSymbol[2] == BtnText && !U.Control.Calcu.MathematicalSymbol.slice(0, 8).includes(U.Control.Calcu.Result.slice(-1)) && U.Control.Calcu.SymbolStatus.Dot == 0) {
  204. U.Control.Calcu.Result = U.Control.Calcu.Result + BtnText;
  205. U.Control.Calcu.SymbolStatus.Dot = 1;
  206. U.Control.Calcu.ACnCE = 0;
  207. U.Control.Calcu.ACBtn.innerHTML = "CE";
  208. CalcuHeadResultOuRow.innerHTML = CalcuHeadResultOuRow.innerHTML + BtnText;
  209. } else if (U.Control.Calcu.Number.includes(BtnText) && U.Control.Calcu.Result != "0") {
  210. U.Control.Calcu.Result = U.Control.Calcu.Result + BtnText;
  211. U.Control.Calcu.ACnCE = 0;
  212. U.Control.Calcu.ACBtn.innerHTML = "CE";
  213. CalcuHeadResultOuRow.innerHTML = CalcuHeadResultOuRow.innerHTML + BtnText;
  214. } else if (U.Control.Calcu.Number.includes(BtnText)) {
  215. U.Control.Calcu.Result = BtnText;
  216. CalcuHeadResultOuRow.innerHTML = BtnText;
  217. U.Control.Calcu.ACnCE = 0;
  218. U.Control.Calcu.ACBtn.innerHTML = "CE";
  219. }
  220. }
  221. //Sample
  222. // window.onload = function () {
  223. // $('body').append(U.Control.Calcu.PageInitialization());
  224. // }