在线计算器

统计计算:可计算一系列数据的和,平均值 科学计算:可进行函数、对数运算,以及阶乘、幂运算

  1. // ==UserScript==
  2. // @name 在线计算器
  3. // @namespace police
  4. // @version 8.8.8
  5. // @description 统计计算:可计算一系列数据的和,平均值 科学计算:可进行函数、对数运算,以及阶乘、幂运算
  6. // @icon http://www.makepic.net/uploads/2021030701/2021030701383520.png
  7. // @match *://www.youtube.com/*
  8. // ==/UserScript==
  9. /*
  10. Calculator Original Design https://dribbble.com/shots/3467471-DailyUI-004-Calculator
  11.  
  12. Hey there, this time i made an easy basic calculator to practice my first meeting with JS, i am so excited to learn more about it.
  13.  
  14. ON DESKTOP: Click on the preview area to be able to use the keyboard and write faster.
  15.  
  16. I seriously wanted to include this boy below and others that could had been awesome, but the project was spreading more than i thought, maybe for a next time.
  17.  
  18. function thRootOf(n, x){
  19. if(n%2==0&&x<0){showingError=true; return 'InvalidInput'}
  20. if(x<0){x=-x; return Math.pow(x,1/n)*-1}
  21. return Math.pow(x,1/n);
  22. }
  23. */
  24. const panel = document.getElementsByClassName("mainPanel").item(0);
  25. const secondPanel = document.getElementsByClassName("secondPanel").item(0);
  26. const clearStorage = () => {mainArray=[]; secondPanel.innerHTML=''; specialExist=false; showingError=false}
  27. var mainArray = [];
  28. var showingResult = false, specialExist = false; showingError=false;
  29. function globalKey(event){
  30. switch(event.key){
  31. case '1': global(document.getElementsByClassName('numOne').item(0)); break;
  32. case '2': global(document.getElementsByClassName('numTwo').item(0)); break;
  33. case '3': global(document.getElementsByClassName('numThree').item(0)); break;
  34. case '4': global(document.getElementsByClassName('numFour').item(0)); break;
  35. case '5': global(document.getElementsByClassName('numFive').item(0)); break;
  36. case '6': global(document.getElementsByClassName('numSix').item(0)); break;
  37. case '7': global(document.getElementsByClassName('numSeven').item(0)); break;
  38. case '8': global(document.getElementsByClassName('numEight').item(0)); break;
  39. case '9': global(document.getElementsByClassName('numNine').item(0)); break;
  40. case '0': global(document.getElementsByClassName('numZero').item(0)); break;
  41. case '.': dotChecker(); break;
  42. case '+': operators('+'); break;
  43. case '-': operators('-'); break;
  44. case '*': operators('\u00D7'); break;
  45. case '/': operators('\u00F7'); break;
  46. case 'Enter': result(); break;
  47. case 'Backspace': delElement(); break;
  48. case 'c': clearPanels(); break;
  49. }
  50. }
  51.  
  52. function solver(){
  53. if(!specialExist){
  54. secondPanel.innerHTML+=panel.innerHTML;
  55. mainArray.push(panel.innerHTML);
  56. }
  57. specialExist=false;
  58. if(mainArray.length==1){return mainArray[0]}
  59. var result=0;
  60. while(mainArray.length!=1){
  61. var actualSign = mainArray[1];
  62. switch(actualSign){
  63. case '+':
  64. result=Number(mainArray[0])+Number(mainArray[2]); break;
  65. case '-':
  66. result=Number(mainArray[0])-Number(mainArray[2]); break;
  67. case '\u00D7':
  68. result=Number(mainArray[0])*Number(mainArray[2]); break;
  69. case '\u00F7':
  70. result=Number(mainArray[0])/Number(mainArray[2]); break;
  71. case 'Mod':
  72. result=Number(mainArray[0])%Number(mainArray[2]); break;
  73. default:
  74. showingError=true;
  75. result="NotAnOperator";
  76. }
  77. mainArray.splice(0, 3);
  78. mainArray.unshift(result);
  79. }
  80. return result;
  81. }
  82.  
  83. function voidDecimalChecker(){
  84. var tempArray = secondPanel.innerHTML.split(" ").map((value)=>{
  85. if(isNaN(Number(value))){return value;}
  86. return Number(value);
  87. })
  88. for(var i=1; i<tempArray.length; i+=2){
  89. tempArray.splice(i,0," ");
  90. }
  91. secondPanel.innerHTML=tempArray.toString().replace(/,/g,'');
  92. }
  93.  
  94. function clearPanels(){
  95. if(panel.innerHTML=='0'&&secondPanel!=''){clearStorage()}
  96. else{panel.innerHTML='0', showingError=false;}
  97. }
  98.  
  99. function delElement(){
  100. if(panel.innerHTML!='0'&&panel.innerHTML.length!=1){
  101. panel.innerHTML=panel.innerHTML.split('').slice(0, (panel.innerHTML.length - 1)).toString().replace(/,/g, '');
  102. }
  103. else if (panel.innerHTML!='0') {panel.innerHTML='0'}
  104. }
  105.  
  106. function dotChecker(){
  107. if(secondPanel.innerHTML.includes('=')){secondPanel.innerHTML=''}
  108. if(showingResult){clearPanels(); showingResult=false;}
  109. if(!panel.innerHTML.includes('.')){panel.innerHTML+='.'}
  110. }
  111.  
  112. function changeSign(){
  113. if(showingResult){clearStorage()}
  114. if(panel.innerHTML!='0'){
  115. panel.innerHTML=Number(panel.innerHTML)*-1;
  116. }
  117. }
  118.  
  119. function global(element){
  120. if(specialExist){secondPanel}
  121. if(secondPanel.innerHTML.includes('=')){secondPanel.innerHTML=''; mainArray=[]}
  122. if((element.innerHTML!='0'&&panel.innerHTML=='0')||showingResult==true){
  123. panel.innerHTML=element.innerHTML;
  124. showingResult=false;
  125. }
  126. else if(panel.innerHTML!='0'){
  127. panel.innerHTML+=element.innerHTML;
  128. }
  129. }
  130.  
  131. function result(){
  132. if(!secondPanel.innerHTML.includes('=')){
  133. panel.innerHTML=solver();
  134. secondPanel.innerHTML+=' = ';
  135. showingResult=true;
  136. }
  137. }
  138.  
  139. function operators(operator){
  140. if(showingError){clearPanels();}
  141. if(secondPanel.innerHTML!=''&&!secondPanel.innerHTML.includes('=')){
  142. panel.innerHTML=solver();
  143. secondPanel.innerHTML+=' '+operator+' ';
  144. mainArray.push(operator);
  145. showingResult=true;
  146. }
  147. else{
  148. mainArray=[]; mainArray.push(panel.innerHTML);
  149. secondPanel.innerHTML=panel.innerHTML;
  150. voidDecimalChecker();
  151. secondPanel.innerHTML+=' '+operator+' '
  152. mainArray.push(operator);
  153. panel.innerHTML='0';
  154. }
  155. }
  156.  
  157. function specialSolver(calc){
  158. if(!secondPanel.innerHTML.includes(' ')){clearStorage();}
  159. secondPanel.innerHTML.includes('=') ? (secondPanel.innerHTML=calc+'('+panel.innerHTML+')', mainArray=[]) : secondPanel.innerHTML+=calc+'('+panel.innerHTML+')';
  160. switch(calc){
  161. case 'fact':
  162. const fact = num => num<0||!Number.isSafeInteger(Number(num)) ? (showingError=true,"NotSupported") : num<=1 ? 1 : num*fact(num-1);
  163. panel.innerHTML = fact(panel.innerHTML);
  164. break;
  165. case '1/':
  166. const frac1x = num => 1/num;
  167. panel.innerHTML = frac1x(panel.innerHTML);
  168. break;
  169. case 'sqr':
  170. panel.innerHTML = Math.pow(panel.innerHTML, 2)
  171. break;
  172. case '√':
  173. panel.innerHTML = Math.sqrt(panel.innerHTML);
  174. break;
  175. default: panel.innerHTML="No_a_special_operator_detected"; showingError=true;
  176. }
  177. mainArray.push(panel.innerHTML);
  178. showingResult=true;
  179. specialExist=true;
  180. }