NumberDecimal.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
  2. import _createClass from "@babel/runtime/helpers/esm/createClass";
  3. import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
  4. import { getNumberPrecision, isEmpty, num2str } from "./numberUtil";
  5. /**
  6. * We can remove this when IE not support anymore
  7. */
  8. var NumberDecimal = /*#__PURE__*/function () {
  9. function NumberDecimal(value) {
  10. _classCallCheck(this, NumberDecimal);
  11. _defineProperty(this, "origin", '');
  12. _defineProperty(this, "number", void 0);
  13. _defineProperty(this, "empty", void 0);
  14. if (isEmpty(value)) {
  15. this.empty = true;
  16. return;
  17. }
  18. this.origin = String(value);
  19. this.number = Number(value);
  20. }
  21. _createClass(NumberDecimal, [{
  22. key: "negate",
  23. value: function negate() {
  24. return new NumberDecimal(-this.toNumber());
  25. }
  26. }, {
  27. key: "add",
  28. value: function add(value) {
  29. if (this.isInvalidate()) {
  30. return new NumberDecimal(value);
  31. }
  32. var target = Number(value);
  33. if (Number.isNaN(target)) {
  34. return this;
  35. }
  36. var number = this.number + target;
  37. // [Legacy] Back to safe integer
  38. if (number > Number.MAX_SAFE_INTEGER) {
  39. return new NumberDecimal(Number.MAX_SAFE_INTEGER);
  40. }
  41. if (number < Number.MIN_SAFE_INTEGER) {
  42. return new NumberDecimal(Number.MIN_SAFE_INTEGER);
  43. }
  44. var maxPrecision = Math.max(getNumberPrecision(this.number), getNumberPrecision(target));
  45. return new NumberDecimal(number.toFixed(maxPrecision));
  46. }
  47. }, {
  48. key: "multi",
  49. value: function multi(value) {
  50. var target = Number(value);
  51. if (this.isInvalidate() || Number.isNaN(target)) {
  52. return new NumberDecimal(NaN);
  53. }
  54. var number = this.number * target;
  55. // [Legacy] Back to safe integer
  56. if (number > Number.MAX_SAFE_INTEGER) {
  57. return new NumberDecimal(Number.MAX_SAFE_INTEGER);
  58. }
  59. if (number < Number.MIN_SAFE_INTEGER) {
  60. return new NumberDecimal(Number.MIN_SAFE_INTEGER);
  61. }
  62. var maxPrecision = Math.max(getNumberPrecision(this.number), getNumberPrecision(target));
  63. return new NumberDecimal(number.toFixed(maxPrecision));
  64. }
  65. }, {
  66. key: "isEmpty",
  67. value: function isEmpty() {
  68. return this.empty;
  69. }
  70. }, {
  71. key: "isNaN",
  72. value: function isNaN() {
  73. return Number.isNaN(this.number);
  74. }
  75. }, {
  76. key: "isInvalidate",
  77. value: function isInvalidate() {
  78. return this.isEmpty() || this.isNaN();
  79. }
  80. }, {
  81. key: "equals",
  82. value: function equals(target) {
  83. return this.toNumber() === (target === null || target === void 0 ? void 0 : target.toNumber());
  84. }
  85. }, {
  86. key: "lessEquals",
  87. value: function lessEquals(target) {
  88. return this.add(target.negate().toString()).toNumber() <= 0;
  89. }
  90. }, {
  91. key: "toNumber",
  92. value: function toNumber() {
  93. return this.number;
  94. }
  95. }, {
  96. key: "toString",
  97. value: function toString() {
  98. var safe = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
  99. if (!safe) {
  100. return this.origin;
  101. }
  102. if (this.isInvalidate()) {
  103. return '';
  104. }
  105. return num2str(this.number);
  106. }
  107. }]);
  108. return NumberDecimal;
  109. }();
  110. export { NumberDecimal as default };