big steppy
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

289 linhas
11 KiB

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