MiniDecimal.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. Object.defineProperty(exports, "BigIntDecimal", {
  7. enumerable: true,
  8. get: function get() {
  9. return _BigIntDecimal.default;
  10. }
  11. });
  12. Object.defineProperty(exports, "NumberDecimal", {
  13. enumerable: true,
  14. get: function get() {
  15. return _NumberDecimal.default;
  16. }
  17. });
  18. exports.default = getMiniDecimal;
  19. exports.toFixed = toFixed;
  20. var _BigIntDecimal = _interopRequireDefault(require("./BigIntDecimal"));
  21. var _NumberDecimal = _interopRequireDefault(require("./NumberDecimal"));
  22. var _numberUtil = require("./numberUtil");
  23. var _supportUtil = require("./supportUtil");
  24. /* eslint-disable max-classes-per-file */
  25. // Still support origin export
  26. function getMiniDecimal(value) {
  27. // We use BigInt here.
  28. // Will fallback to Number if not support.
  29. if ((0, _supportUtil.supportBigInt)()) {
  30. return new _BigIntDecimal.default(value);
  31. }
  32. return new _NumberDecimal.default(value);
  33. }
  34. /**
  35. * Align the logic of toFixed to around like 1.5 => 2.
  36. * If set `cutOnly`, will just remove the over decimal part.
  37. */
  38. function toFixed(numStr, separatorStr, precision) {
  39. var cutOnly = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
  40. if (numStr === '') {
  41. return '';
  42. }
  43. var _trimNumber = (0, _numberUtil.trimNumber)(numStr),
  44. negativeStr = _trimNumber.negativeStr,
  45. integerStr = _trimNumber.integerStr,
  46. decimalStr = _trimNumber.decimalStr;
  47. var precisionDecimalStr = "".concat(separatorStr).concat(decimalStr);
  48. var numberWithoutDecimal = "".concat(negativeStr).concat(integerStr);
  49. if (precision >= 0) {
  50. // We will get last + 1 number to check if need advanced number
  51. var advancedNum = Number(decimalStr[precision]);
  52. if (advancedNum >= 5 && !cutOnly) {
  53. var advancedDecimal = getMiniDecimal(numStr).add("".concat(negativeStr, "0.").concat('0'.repeat(precision)).concat(10 - advancedNum));
  54. return toFixed(advancedDecimal.toString(), separatorStr, precision, cutOnly);
  55. }
  56. if (precision === 0) {
  57. return numberWithoutDecimal;
  58. }
  59. return "".concat(numberWithoutDecimal).concat(separatorStr).concat(decimalStr.padEnd(precision, '0').slice(0, precision));
  60. }
  61. if (precisionDecimalStr === '.0') {
  62. return numberWithoutDecimal;
  63. }
  64. return "".concat(numberWithoutDecimal).concat(precisionDecimalStr);
  65. }