BigNumber.ts 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474
  1. import { _decorator } from "cc";
  2. const { ccclass, property } = _decorator;
  3. @ccclass
  4. export default class BigNumber {
  5. private static aLetters: any = [
  6. "K",
  7. 3,
  8. "M",
  9. 6,
  10. "B",
  11. 9,
  12. "T",
  13. 12,
  14. "aa",
  15. 15,
  16. "bb",
  17. 18,
  18. "cc",
  19. 21,
  20. "dd",
  21. 24,
  22. "ee",
  23. 27,
  24. "ff",
  25. 30,
  26. "gg",
  27. 33,
  28. "hh",
  29. 36,
  30. "ii",
  31. 39,
  32. "jj",
  33. 42,
  34. "kk",
  35. 45,
  36. "ll",
  37. 48,
  38. "mm",
  39. 51,
  40. "nn",
  41. 54,
  42. "oo",
  43. 57,
  44. "pp",
  45. 60,
  46. "qq",
  47. 63,
  48. "rr",
  49. 66,
  50. "ss",
  51. 69,
  52. "tt",
  53. 72,
  54. "uu",
  55. 75,
  56. "vv",
  57. 78,
  58. "ww",
  59. 81,
  60. "xx",
  61. 84,
  62. "yy",
  63. 87,
  64. "zz",
  65. 90,
  66. "aaa",
  67. 93,
  68. "bbb",
  69. 96,
  70. "ccc",
  71. 99,
  72. "ddd",
  73. 102,
  74. "eee",
  75. 105,
  76. "fff",
  77. 108,
  78. "ggg",
  79. 111,
  80. "hhh",
  81. 114,
  82. "iii",
  83. 117,
  84. "jjj",
  85. 120,
  86. "kkk",
  87. 123,
  88. "lll",
  89. 126,
  90. "mmm",
  91. 129,
  92. "nnn",
  93. 132,
  94. "ooo",
  95. 135,
  96. "ppp",
  97. 138,
  98. "qqq",
  99. 141,
  100. "rrr",
  101. 144,
  102. "sss",
  103. 147,
  104. "ttt",
  105. 150,
  106. "uuu",
  107. 153,
  108. "vvv",
  109. 156,
  110. "www",
  111. 159,
  112. "xxx",
  113. 162,
  114. "yyy",
  115. 165,
  116. "zzz",
  117. 168,
  118. "aaaa",
  119. 171,
  120. "bbbb",
  121. 174,
  122. "cccc",
  123. 177,
  124. "dddd",
  125. 180,
  126. "eeee",
  127. 183,
  128. "ffff",
  129. 186,
  130. "gggg",
  131. 189,
  132. "hhhh",
  133. 192,
  134. "iiii",
  135. 195,
  136. "jjjj",
  137. 198,
  138. "kkkk",
  139. 201,
  140. "llll",
  141. 204,
  142. "mmmm",
  143. 207,
  144. "nnnn",
  145. 210,
  146. "oooo",
  147. 213,
  148. "pppp",
  149. 216,
  150. "qqqq",
  151. 219,
  152. "rrrr",
  153. 222,
  154. "ssss",
  155. 225,
  156. "tttt",
  157. 228,
  158. "uuuu",
  159. 231,
  160. "vvvv",
  161. 234,
  162. "wwww",
  163. 237,
  164. "xxxx",
  165. 240,
  166. "yyyy",
  167. 243,
  168. "zzzz",
  169. 246,
  170. "aaaaa",
  171. 249,
  172. "bbbbb",
  173. 252,
  174. "ccccc",
  175. 255,
  176. "ddddd",
  177. 258,
  178. "eeeee",
  179. 261,
  180. "fffff",
  181. 264,
  182. "ggggg",
  183. 267,
  184. "hhhhh",
  185. 270,
  186. "iiiii",
  187. 273,
  188. "jjjjj",
  189. 276,
  190. "kkkkk",
  191. 279,
  192. "lllll",
  193. 282,
  194. "mmmmm",
  195. 285,
  196. "nnnnn",
  197. 288,
  198. "ooooo",
  199. 291,
  200. "ppppp",
  201. 294,
  202. "qqqqq",
  203. 297,
  204. "rrrrr",
  205. 300,
  206. "sssss",
  207. 303,
  208. "ttttt",
  209. 306,
  210. "uuuuu",
  211. 309,
  212. "vvvvv",
  213. 312,
  214. "wwwww",
  215. 315,
  216. "xxxxx",
  217. 318,
  218. "yyyyy",
  219. 321,
  220. "zzzzz",
  221. 324,
  222. ];
  223. public static getN(param1: string): Number {
  224. var _loc_2: number = 0;
  225. while (_loc_2 < BigNumber.aLetters.length) {
  226. if (BigNumber.aLetters[_loc_2] == param1) {
  227. return Math.pow(10, BigNumber.aLetters[_loc_2 + 1]);
  228. }
  229. _loc_2 = _loc_2 + 2;
  230. }
  231. return 0;
  232. } // end function
  233. public static getLargeString(
  234. param1: number,
  235. param2: string = "K",
  236. param3: Boolean = true
  237. ): string {
  238. if (param1 == 0) return param1 + "";
  239. // console.log("param1", param1);
  240. // console.log("isNaN(param1)", isNaN(param1));
  241. // console.log("!isFinite(param1)", !isFinite(param1));
  242. if (isNaN(param1) || !isFinite(param1)) return "0";
  243. // Handle extremely large numbers
  244. if (param1 > 1e324) {
  245. return "MAX";
  246. }
  247. var _loc_8: string = null;
  248. var _loc_11: number = NaN;
  249. var _loc_4: any = Math.round(param1 / Math.abs(param1));
  250. param1 = Math.abs(param1);
  251. var _loc_5: any = param1;
  252. var _loc_6: number = 0;
  253. var _loc_7: number = 0;
  254. var _loc_9: number = 0;
  255. var _loc_10: number = 0;
  256. while (_loc_10 < BigNumber.aLetters.length) {
  257. if (BigNumber.aLetters[_loc_10] == param2) {
  258. _loc_7 = _loc_10;
  259. break;
  260. }
  261. _loc_10 = _loc_10 + 2;
  262. }
  263. if (param1 < Math.pow(10, BigNumber.aLetters[_loc_7 + 1])) {
  264. _loc_6 = -1;
  265. } else {
  266. _loc_11 = Math.pow(10, BigNumber.aLetters[_loc_7 + 1]);
  267. _loc_6 = _loc_7 / 2;
  268. while (_loc_5 / 1000 >= _loc_11) {
  269. _loc_5 = _loc_5 / 1000;
  270. _loc_6++;
  271. }
  272. while (_loc_5 / 1000 >= 1000) {
  273. _loc_5 = _loc_5 / 1000;
  274. }
  275. }
  276. if (_loc_6 == -1) {
  277. return BigNumber.addSeparators(
  278. Math.round((param1 - 0.5) * _loc_4).toString()
  279. );
  280. }
  281. if (_loc_5 / 1000 < 10) {
  282. _loc_9 = 2;
  283. } else if (_loc_5 / 1000 < 100) {
  284. _loc_9 = 1;
  285. }
  286. _loc_5 = _loc_5 / Math.pow(10, 3 - _loc_9);
  287. _loc_5 = parseInt(_loc_5);
  288. _loc_5 = _loc_5 / Math.pow(10, _loc_9);
  289. // Handle very large numbers
  290. // if (_loc_6 * 2 >= BigNumber.aLetters.length) {
  291. // return "MAX";
  292. // }
  293. if (param3)
  294. return (_loc_5 * _loc_4).toFixed(1) + "" + BigNumber.aLetters[_loc_6 * 2];
  295. else
  296. return (_loc_5 * _loc_4).toString() + "" + BigNumber.aLetters[_loc_6 * 2];
  297. } // end function
  298. public static addSeparators(param1: string, param2: string = ","): string {
  299. var _loc_3: any = param1.charAt(0) == "-";
  300. if (_loc_3) {
  301. param1 = param1.substr(1);
  302. }
  303. var _loc_4: string = "";
  304. var _loc_5: string = "";
  305. var _loc_6: number = 0;
  306. var _loc_7: any = param1.length - 1;
  307. while (_loc_7 > 0) {
  308. _loc_4 = param1.charAt(_loc_7) + _loc_4;
  309. _loc_6++;
  310. if (_loc_6 % 3 == 0) {
  311. _loc_4 = param2 + _loc_4;
  312. }
  313. _loc_7 = _loc_7 - 1;
  314. }
  315. _loc_4 = param1.charAt(0) + _loc_4;
  316. if (_loc_3) {
  317. _loc_4 = "-" + _loc_4;
  318. }
  319. return _loc_4;
  320. } // end function
  321. public static convertToLargeString(param1: number): string {
  322. return BigNumber.getStringOfNumber(param1);
  323. } // end function
  324. public static getStringOfNumber(
  325. param1: number,
  326. param2: Boolean = false,
  327. param3: Boolean = false,
  328. param4: Boolean = false
  329. ): string {
  330. var _loc_5: number = 1;
  331. if (param4) {
  332. _loc_5 = 10;
  333. }
  334. var _loc_6: any = Math.round(param1);
  335. if (Math.round(param1) >= 1000000 && _loc_6 < 1000000000 && param2) {
  336. return (
  337. (Math.round(_loc_6 / 1000 / _loc_5) / (1000 / _loc_5)).toString() + " M"
  338. );
  339. }
  340. if (_loc_6 >= 1000000000 && _loc_6 < 1000000000000) {
  341. return (
  342. (Math.round(_loc_6 / 1000000 / _loc_5) / (1000 / _loc_5)).toString() +
  343. " B"
  344. );
  345. }
  346. if (_loc_6 >= 1000000000000 && _loc_6 < 1000000000000000) {
  347. return (
  348. (
  349. Math.round(_loc_6 / 1000000000 / _loc_5) /
  350. (1000 / _loc_5)
  351. ).toString() + " T"
  352. );
  353. }
  354. if (_loc_6 >= 1000000000000000 && _loc_6 < 1000000000000000000) {
  355. return (
  356. (
  357. Math.round(_loc_6 / 1000000000000 / _loc_5) /
  358. (1000 / _loc_5)
  359. ).toString() + " q"
  360. );
  361. }
  362. if (_loc_6 >= 1000000000000000000 && _loc_6 < 1000000000000000000000) {
  363. return (
  364. (
  365. Math.round(_loc_6 / 1000000000000000 / _loc_5) /
  366. (1000 / _loc_5)
  367. ).toString() + " Qq"
  368. );
  369. }
  370. if (_loc_6 >= 1000000000000000000000 && _loc_6 < 999999999999999980000000) {
  371. return (
  372. (
  373. Math.round(_loc_6 / 1000000000000000000 / _loc_5) /
  374. (1000 / _loc_5)
  375. ).toString() + " s"
  376. );
  377. }
  378. if (
  379. _loc_6 >= 999999999999999980000000 &&
  380. _loc_6 < 1000000000000000000000000000
  381. ) {
  382. return (
  383. (
  384. Math.round(_loc_6 / 1000000000000000000000 / _loc_5) /
  385. (1000 / _loc_5)
  386. ).toString() + " Ss"
  387. );
  388. }
  389. if (
  390. _loc_6 >= 1000000000000000000000000000 &&
  391. _loc_6 < 1000000000000000000000000000000
  392. ) {
  393. return (
  394. (
  395. Math.round(_loc_6 / 999999999999999980000000 / _loc_5) /
  396. (1000 / _loc_5)
  397. ).toString() + " O"
  398. );
  399. }
  400. if (
  401. _loc_6 >= 1000000000000000000000000000000 &&
  402. _loc_6 < 999999999999999950000000000000000
  403. ) {
  404. return (
  405. (
  406. Math.round(_loc_6 / 1000000000000000000000000000 / _loc_5) /
  407. (1000 / _loc_5)
  408. ).toString() + " N"
  409. );
  410. }
  411. if (
  412. _loc_6 >= 999999999999999950000000000000000 &&
  413. _loc_6 < 100000000000000000000000000
  414. ) {
  415. return (
  416. (
  417. Math.round(_loc_6 / 1000000000000000000000000000000 / _loc_5) /
  418. (1000 / _loc_5)
  419. ).toString() + " d"
  420. );
  421. }
  422. if (
  423. _loc_6 >= 100000000000000000000000000 &&
  424. _loc_6 < 99999999999999991000000000000
  425. ) {
  426. return (
  427. (
  428. Math.round(_loc_6 / 999999999999999950000000000000000 / _loc_5) /
  429. (1000 / _loc_5)
  430. ).toString() + " U"
  431. );
  432. }
  433. if (
  434. _loc_6 >= 99999999999999991000000000000 &&
  435. _loc_6 < 100000000000000010000000000000000
  436. ) {
  437. return (
  438. (
  439. Math.round(_loc_6 / 100000000000000000000000000 / _loc_5) /
  440. (1000 / _loc_5)
  441. ).toString() + " Dd"
  442. );
  443. }
  444. var _loc_7: string = " ";
  445. if (param3) {
  446. _loc_7 = ",";
  447. }
  448. var _loc_8: string = "";
  449. var _loc_9: any = String(Math.round(param1));
  450. var _loc_10: any = String(Math.round(param1)).length - 1;
  451. while (_loc_10 >= 0) {
  452. _loc_8 = _loc_9.charAt(_loc_10) + _loc_8;
  453. if (_loc_8.length == 3 && _loc_10 != 0) {
  454. _loc_8 = _loc_7 + _loc_8;
  455. }
  456. if (_loc_8.length == 7 && _loc_10 != 0) {
  457. _loc_8 = _loc_7 + _loc_8;
  458. }
  459. _loc_10 = _loc_10 - 1;
  460. }
  461. return _loc_8;
  462. } // end function
  463. }