big steppy
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

274 lines
11 KiB

  1. function round(number,precision=3) {
  2. return Math.round(number*Math.pow(10,precision)) / Math.pow(10,precision);
  3. }
  4. function number(value, type="full", precision=3) {
  5. var val = parseFloat(value);
  6. switch(type) {
  7. case "full": return val.toString();
  8. case "scientific": return val.toExponential(precision).toString();
  9. case "words": return number_words_repeated(val);
  10. case "prefix": return number_prefix(val);
  11. }
  12. }
  13. function number_words(value) {
  14. var scale = Math.floor(Math.log(value) / Math.log(1000));
  15. switch(scale) {
  16. case 0: return value.toString();
  17. case 1: return Math.round(value / 1e3).toString() + " thousand";
  18. case 2: return Math.round(value / 1e6).toString() + " million";
  19. case 3: return Math.round(value / 1e9).toString() + " billion";
  20. case 4: return Math.round(value / 1e12).toString() + " trillion";
  21. case 5: return Math.round(value / 1e15).toString() + " quadrillion";
  22. case 6: return Math.round(value / 1e18).toString() + " quintillion";
  23. case 7: return Math.round(value / 1e21).toString() + " sextillion";
  24. case 8: return Math.round(value / 1e24).toString() + " septillion";
  25. case 9: return Math.round(value / 1e27).toString() + " octillion";
  26. case 10: return Math.round(value / 1e30).toString() + " nonillion";
  27. case 11: return Math.round(value / 1e33).toString() + " decillion";
  28. case 12: return Math.round(value / 1e36).toString() + " undecillion";
  29. case 13: return Math.round(value / 1e39).toString() + " duodecillion";
  30. case 14: return Math.round(value / 1e42).toString() + " tredecillion";
  31. case 15: return Math.round(value / 1e45).toString() + " quattuordecillion";
  32. case 16: return Math.round(value / 1e48).toString() + " quindecillion";
  33. case 17: return Math.round(value / 1e51).toString() + " sexdecillion";
  34. case 18: return Math.round(value / 1e54).toString() + " septendecillion";
  35. case 19: return Math.round(value / 1e57).toString() + " octodecillion";
  36. case 20: return Math.round(value / 1e60).toString() + " novemdecillion";
  37. default: return Math.round(value / 1e63).toString() + " vigintillion";
  38. }
  39. }
  40. function number_words_repeated(value) {
  41. var scale = Math.floor(Math.log(value) / Math.log(1000));
  42. if (value == Infinity)
  43. return "a lot of";
  44. switch(scale) {
  45. case 0: return value.toString();
  46. case 1: return Math.round(value / 1e3).toString() + " thousand";
  47. case 2: return Math.round(value / 1e6).toString() + " million";
  48. case 3: return Math.round(value / 1e9).toString() + " billion";
  49. case 4: return Math.round(value / 1e12).toString() + " trillion";
  50. case 5: return Math.round(value / 1e15).toString() + " quadrillion";
  51. case 6: return Math.round(value / 1e18).toString() + " quintillion";
  52. default: return number_words_repeated(value / 1e18) + " quintillion";
  53. }
  54. }
  55. function number_prefix(value) {
  56. var scale = Math.floor(Math.log(value) / Math.log(1000));
  57. switch(scale) {
  58. case 0: return value.toString();
  59. case 1: return Math.round(value / 1e3).toString() + "K";
  60. case 2: return Math.round(value / 1e6).toString() + "M";
  61. case 3: return Math.round(value / 1e9).toString() + "G";
  62. case 4: return Math.round(value / 1e12).toString() + "T";
  63. case 5: return Math.round(value / 1e15).toString() + "P";
  64. case 6: return Math.round(value / 1e18).toString() + "E";
  65. case 7: return Math.round(value / 1e21).toString() + "Z";
  66. default: return Math.round(value / 1e24).toString() + "Y";
  67. }
  68. }
  69. function mass(kg, type="metric", singular=false) {
  70. switch(type) {
  71. case "metric": return metricMass(kg, singular); break;
  72. case "customary": return customaryMass(kg, singular); break;
  73. case "approx": return approxMass(kg, singular); break;
  74. }
  75. }
  76. function length(m, type="metric", singular=false) {
  77. switch(type) {
  78. case "metric": return metricLength(m, singular); break;
  79. case "customary": return customaryLength(m, singular); break;
  80. case "approx": return approxLength(m, singular); break;
  81. }
  82. }
  83. function volume(m3, type="metric", singular=false) {
  84. switch(type) {
  85. case "metric": return metricVolume(m3, singular); break;
  86. case "customary": return customaryVolume(m3, singular); break;
  87. case "approx": return approxVolume(m3, singular); break;
  88. }
  89. }
  90. function metricMass(kg, singular=false) {
  91. if (kg < 1/1000) {
  92. var mass = round(kg * 1e6,0);
  93. return mass + (singular || mass == 1 ? " milligram" : " milligrams");
  94. } else if (kg < 1) {
  95. var mass = round(kg * 1000,0);
  96. return mass + (singular || mass == 1 ? " gram" : " grams");
  97. } else if (kg < 5000) {
  98. var mass = round(kg,0);
  99. return mass + (singular || mass == 1 ? " kilogram" : " kilograms");
  100. } else if (kg < 5000000) {
  101. var mass = round(kg / 1000,1);
  102. return mass + (singular || mass == 1 ? " metric ton" : " metric tons");
  103. } else if (kg < 5000000000) {
  104. var mass = round(kg / 1000000,1);
  105. return mass + (singular || mass == 1 ? " kiloton" : " kilotons");
  106. } else if (kg < 5000000000000) {
  107. var mass = round(kg / 1000000000,1);
  108. return mass + (singular || mass == 1 ? " megaton" : " megatons");
  109. } else {
  110. var mass = round(kg / 1000000000000,1);
  111. return mass + (singular || mass == 1 ? " gigaton" : " gigatons");
  112. }
  113. }
  114. function customaryMass(kg, singular=false) {
  115. var lbs = kg * 2.2;
  116. if (lbs < 1) {
  117. var mass = round(lbs * 16,0);
  118. return mass + (singular || mass == 1 ? " ounce" : " ounces");
  119. } else if (lbs < 2000) {
  120. var mass = round(lbs,0);
  121. return mass + (singular || mass == 1 ? " pound" : " pounds");
  122. } else {
  123. var mass = round(lbs / 2000,1);
  124. return mass + (singular || mass == 1 ? "ton" : " tons");
  125. }
  126. }
  127. function approxMass(kg, singular=false) {
  128. if (kg < 10000) {
  129. var mass = round(kg/1000,2);
  130. return (singular || mass == 1 ? "a car" : mass + " cars");
  131. } else if (kg < 100000) {
  132. var mass = round(kg/6000,2);
  133. return (singular || mass == 1 ? "an elephant" : mass + " elephants");
  134. } else if (kg < 1000000000) {
  135. var mass = round(kg/54431.1,2);
  136. return (singular || mass == 1 ? "a tank" : mass + " tanks");
  137. } else if (kg < 1e21) {
  138. var mass = round(kg/1.01605e8,2);
  139. return (singular || mass == 1 ? "an aircraft carrier" : mass + " aircraft carriers");
  140. } else {
  141. var mass = round(kg/5.972e24,4);
  142. return (singular || mass == 1 ? "the Earth" : mass + " Earths");
  143. }
  144. }
  145. function metricLength(m, singular=false) {
  146. if (m < 1/100) {
  147. var length = round(m * 1000,2);
  148. return length + (singular || length == 1 ? " millimeter" : " millimeters");
  149. } else if (m < 1) {
  150. var length = round(m * 100,0);
  151. return length + (singular || length == 1 ? " centimeter" : " centimeters");
  152. } else if (m < 500) {
  153. var length = round(m,2);
  154. return length + (singular || length == 1 ? " meter" : " meters");
  155. } else {
  156. var length = round(m / 1000,1);
  157. return length + (singular || length == 1 ? " kilometer" : " kilometers");
  158. }
  159. }
  160. function customaryLength(m, singular=false) {
  161. var ft = m * 3.28084;
  162. if (ft < 1) {
  163. var length = round(ft * 12,0);
  164. return length + (singular || length == 1 ? " inch" : " inches");
  165. } else if (ft < 5280) {
  166. var end = customaryLength((ft - Math.floor(ft))/3.28084, singular);
  167. var length = Math.floor(ft);
  168. return length + (singular || length == 1 ? " foot" : " feet") + " " + end;
  169. } else {
  170. var length = round(ft/5280,1);
  171. return length + (singular || length == 1 ? " mile" : " miles");
  172. }
  173. }
  174. function approxLength(m, singular=false) {
  175. if (m < 1000) {
  176. var length = round(m/49,1);
  177. return length + (singular || length == 1 ? " football field" : " football fields");
  178. } else if (m < 5000000) {
  179. var length = round(m/449,1);
  180. return length + (singular || length == 1 ? " Empire State Building" : " Empire State Buildings");
  181. } else if (m < 3474574*2) {
  182. var length = round(m/3474574,1);
  183. return length + (singular || length == 1 ? " moon" : " moons");
  184. } else if (m < 12.742e6*100) {
  185. var length = round(m/12.742e6,1);
  186. return length + (singular || length == 1 ? " earth" : " earths");
  187. } else if (m < 149.6e12) {
  188. var length = round(m/149.6e9,1);
  189. return length + (singular || length == 1 ? " AU" : " AUs");
  190. } else {
  191. var length = round(m/9.4607e15,4);
  192. return length + (singular || length == 1 ? " light year" : " light years");
  193. }
  194. }
  195. function metricVolume(m3, singular=false) {
  196. if (m3 < 1/1000) {
  197. var volume = round(m3*1e6, 0);
  198. return volume + (singular || volume == 1 ? " milliliter" : " milliliters");
  199. } else if (m3 < 1) {
  200. var volume = round(m3*1000, 1);
  201. return volume + (singular || volume == 1 ? " liter" : " liters");
  202. } else if (m3 < 1000000) {
  203. var volume = round(m3, 0);
  204. return volume + (singular || volume == 1 ? " cubic meter" : " cubic meters");
  205. } else if (m3 < 1e12){
  206. var volume = round(m3/1e9, 6);
  207. return volume + (singular || volume == 1 ? " cubic kilometer" : " cubic kilometers");
  208. } else {
  209. var volume = round(m3/1e9, 0);
  210. return volume + (singular || volume == 1 ? " cubic kilometer" : " cubic kilometers");
  211. }
  212. }
  213. function customaryVolume(m3, singular=false) {
  214. var gallons = m3 * 264.172;
  215. if (gallons < 1/16) {
  216. var volume = round(gallons*128,0);
  217. return volume + (singular || volume == 1 ? " fluid ounce" : " fluid ounces");
  218. } else if (gallons < 1/4) {
  219. var volume = round(gallons*16,1);
  220. return volume + (singular || volume == 1 ? " cup" : " cups");
  221. } else if (gallons < 1/2) {
  222. var volume = round(gallons*8,1);
  223. return volume + (singular || volume == 1 ? " pint" : " pints");
  224. } else if (gallons < 1) {
  225. var volume = round(gallons*4,1);
  226. return volume + (singular || volume == 1 ? " quart" : " quarts");
  227. } else if (gallons < 100) {
  228. var volume = round(gallons,1);
  229. return volume + (singular || volume == 1 ? " gallon" : " gallons");
  230. } else {
  231. var volume = round(gallons,0);
  232. return volume + (singular || volume == 1 ? " gallon" : " gallons");
  233. }
  234. }
  235. function approxVolume(m3, singular=false) {
  236. if (m3 < 1/10000) {
  237. var volume = round(m3*1e6,0);
  238. return (singular || volume == 1 ? "a shot" : volume + " shots");
  239. } else if (m3 < 1) {
  240. var volume = round(m3*2000,0);
  241. return (singular || volume == 1 ? "a glass" : volume + " glasses");
  242. } else if (m3 < 10) {
  243. var volume = round(m3*2.64,1);
  244. return(singular || volume == 1 ? "a bathtub" : volume + " bathtubs");
  245. } else if (m3 < 1e9) {
  246. var volume = round(m3/1000,2);
  247. return (singular || volume == 1 ? "an Olympic swimming pool" : volume + " Olympic swimming pools");
  248. } else if (m3 < 1e15) {
  249. var volume = round(m3/1.8919e10,3);
  250. return (singular || volume == 1 ? "a Great Salt Lake" : volume + " Great Salt Lakes");
  251. } else {
  252. var volume = round(m3/3.547e17, 3);
  253. return (singular || volume == 1 ? "an ocean" : volume + " oceans");
  254. }
  255. }