big steppy
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 

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