@utiliread/primitives 1.0.0-106 → 1.0.0-108

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PrecisionNumber = void 0;
4
- const _1 = require(".");
5
4
  const number_formatter_1 = require("./number-formatter");
5
+ const _1 = require(".");
6
6
  class PrecisionNumber {
7
7
  constructor(value, precision) {
8
8
  this.value = value;
@@ -16,11 +16,34 @@ class PrecisionNumber {
16
16
  if (normalized.endsWith(_1.invariantDecimalSeparator)) {
17
17
  normalized += "0";
18
18
  }
19
- const precision = normalized
19
+ const value = parseFloat(normalized);
20
+ let precision = normalized
20
21
  .replace(".", "")
21
22
  .replace("+", "")
22
23
  .replace("-", "").length;
23
- return new PrecisionNumber(parseFloat(normalized), precision);
24
+ if (value > -1 && value < 1 && value !== 0 && precision > 1) {
25
+ precision--;
26
+ }
27
+ return new PrecisionNumber(value, precision);
28
+ }
29
+ plus(rhs) {
30
+ // The result should have the same number of decimal places as the minimum of the two inputs
31
+ const lhs = this;
32
+ const value = lhs.value + rhs.value;
33
+ const decimals = Math.min(getNumberOfDecimalDigits(lhs.value, lhs.precision), getNumberOfDecimalDigits(rhs.value, rhs.precision));
34
+ const precision = getPrecision(value, decimals);
35
+ return new PrecisionNumber(value, precision);
36
+ }
37
+ minus(rhs) {
38
+ // The result should have the same number of decimal places as the minimum of the two inputs
39
+ const lhs = this;
40
+ const value = lhs.value - rhs.value;
41
+ const decimals = Math.min(getNumberOfDecimalDigits(lhs.value, lhs.precision), getNumberOfDecimalDigits(rhs.value, rhs.precision));
42
+ const precision = getPrecision(value, decimals);
43
+ return new PrecisionNumber(value, precision);
44
+ }
45
+ valueOf() {
46
+ return this.value;
24
47
  }
25
48
  toString() {
26
49
  return this.value.toString();
@@ -39,4 +62,45 @@ class PrecisionNumber {
39
62
  }
40
63
  }
41
64
  exports.PrecisionNumber = PrecisionNumber;
65
+ function getPrecision(number, decimals) {
66
+ if (number == 0) {
67
+ return 1;
68
+ }
69
+ else if (number > -1 && number < 1) {
70
+ return decimals;
71
+ }
72
+ else {
73
+ return Math.max(getNumberOfIntegralDigits(number) + decimals, 1);
74
+ }
75
+ }
76
+ function getNumberOfDecimalDigits(number, precision) {
77
+ if (number > -1 && number < 1) {
78
+ return precision;
79
+ }
80
+ else {
81
+ return precision - getNumberOfIntegralDigits(number);
82
+ }
83
+ }
84
+ function getNumberOfIntegralDigits(number) {
85
+ const abs = Math.abs(number);
86
+ if (abs < 10)
87
+ return 1;
88
+ if (abs < 100)
89
+ return 2;
90
+ if (abs < 1000)
91
+ return 3;
92
+ if (abs < 10000)
93
+ return 4;
94
+ if (abs < 100000)
95
+ return 5;
96
+ if (abs < 1000000)
97
+ return 6;
98
+ if (abs < 10000000)
99
+ return 7;
100
+ if (abs < 100000000)
101
+ return 8;
102
+ if (abs < 1000000000)
103
+ return 9;
104
+ return Math.floor(Math.log10(abs) + 1);
105
+ }
42
106
  //# sourceMappingURL=precision-number.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"precision-number.js","sourceRoot":"","sources":["../../src/precision-number.ts"],"names":[],"mappings":";;;AAAA,wBAA8C;AAC9C,yDAA6E;AAE7E,MAAa,eAAe;IACxB,YACW,KAAa,EACb,SAAiB;QADjB,UAAK,GAAL,KAAK,CAAQ;QACb,cAAS,GAAT,SAAS,CAAQ;IACzB,CAAC;IAEJ,MAAM,CAAC,KAAK,CAAC,KAAa;QACtB,IAAI,UAAU,GAAG,KAAK;aACjB,IAAI,EAAE;aACN,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;aACjB,OAAO,CAAC,yCAAsB,EAAE,4BAAyB,CAAC,CAAC;QAChE,IAAI,UAAU,CAAC,QAAQ,CAAC,4BAAyB,CAAC,EAAE,CAAC;YACjD,UAAU,IAAI,GAAG,CAAC;QACtB,CAAC;QACD,MAAM,SAAS,GAAG,UAAU;aACvB,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;aAChB,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;aAChB,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;QAC7B,OAAO,IAAI,eAAe,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;IAClE,CAAC;IAED,QAAQ;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC;IAED,OAAO;QACH,OAAO,kCAAe,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/D,CAAC;IAED,WAAW;QACP,OAAO,kCAAe,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACnE,CAAC;IAED,aAAa;QACT,OAAO,kCAAe,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACrE,CAAC;IAED,iBAAiB;QACb,OAAO,kCAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACzE,CAAC;CACJ;AAxCD,0CAwCC"}
1
+ {"version":3,"file":"precision-number.js","sourceRoot":"","sources":["../../src/precision-number.ts"],"names":[],"mappings":"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"}
@@ -2,12 +2,17 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const precision_number_1 = require("./precision-number");
4
4
  const chai_1 = require("chai");
5
- describe("precision-number", () => {
5
+ describe("parse", () => {
6
6
  it("should not parse ''", () => {
7
7
  const number = precision_number_1.PrecisionNumber.parse("");
8
8
  (0, chai_1.expect)(Number.isNaN(number.value)).to.equal(true);
9
9
  (0, chai_1.expect)(number.precision).to.equal(0);
10
10
  });
11
+ it("should parse '0'", () => {
12
+ const number = precision_number_1.PrecisionNumber.parse("0");
13
+ (0, chai_1.expect)(number.value).to.equal(0);
14
+ (0, chai_1.expect)(number.precision).to.equal(1);
15
+ });
11
16
  it("should parse '1'", () => {
12
17
  const number = precision_number_1.PrecisionNumber.parse("1");
13
18
  (0, chai_1.expect)(number.value).to.equal(1);
@@ -23,5 +28,112 @@ describe("precision-number", () => {
23
28
  (0, chai_1.expect)(number.value).to.equal(1);
24
29
  (0, chai_1.expect)(number.precision).to.equal(2);
25
30
  });
31
+ it("should parse '0.6'", () => {
32
+ const number = precision_number_1.PrecisionNumber.parse("0.6");
33
+ (0, chai_1.expect)(number.value).to.equal(0.6);
34
+ (0, chai_1.expect)(number.precision).to.equal(1);
35
+ });
36
+ it("should parse '.6'", () => {
37
+ const number = precision_number_1.PrecisionNumber.parse(".6");
38
+ (0, chai_1.expect)(number.value).to.equal(0.6);
39
+ (0, chai_1.expect)(number.precision).to.equal(1);
40
+ });
41
+ });
42
+ describe("plus", () => {
43
+ const data = [
44
+ [
45
+ new precision_number_1.PrecisionNumber(2, 1),
46
+ new precision_number_1.PrecisionNumber(10, 2),
47
+ new precision_number_1.PrecisionNumber(12, 2),
48
+ ],
49
+ [
50
+ new precision_number_1.PrecisionNumber(2, 1),
51
+ new precision_number_1.PrecisionNumber(-10, 2),
52
+ new precision_number_1.PrecisionNumber(-8, 1),
53
+ ],
54
+ [
55
+ new precision_number_1.PrecisionNumber(-2, 1),
56
+ new precision_number_1.PrecisionNumber(10, 2),
57
+ new precision_number_1.PrecisionNumber(8, 1),
58
+ ],
59
+ [
60
+ new precision_number_1.PrecisionNumber(-2, 1),
61
+ new precision_number_1.PrecisionNumber(-10, 2),
62
+ new precision_number_1.PrecisionNumber(-12, 2),
63
+ ],
64
+ [
65
+ new precision_number_1.PrecisionNumber(2, 1),
66
+ new precision_number_1.PrecisionNumber(10, 3),
67
+ new precision_number_1.PrecisionNumber(12, 2),
68
+ ],
69
+ [
70
+ new precision_number_1.PrecisionNumber(2, 3),
71
+ new precision_number_1.PrecisionNumber(10, 3),
72
+ new precision_number_1.PrecisionNumber(12, 3),
73
+ ],
74
+ [
75
+ new precision_number_1.PrecisionNumber(0.12, 2),
76
+ new precision_number_1.PrecisionNumber(1, 2),
77
+ new precision_number_1.PrecisionNumber(1.12, 2),
78
+ ],
79
+ [
80
+ new precision_number_1.PrecisionNumber(0.12, 2),
81
+ new precision_number_1.PrecisionNumber(1, 3),
82
+ new precision_number_1.PrecisionNumber(1.12, 3),
83
+ ],
84
+ [
85
+ new precision_number_1.PrecisionNumber(123456, 6),
86
+ new precision_number_1.PrecisionNumber(1, 2),
87
+ new precision_number_1.PrecisionNumber(123457, 6),
88
+ ],
89
+ [
90
+ new precision_number_1.PrecisionNumber(1, 1),
91
+ new precision_number_1.PrecisionNumber(1024, 3),
92
+ new precision_number_1.PrecisionNumber(1025, 3),
93
+ ],
94
+ [
95
+ new precision_number_1.PrecisionNumber(0, 0),
96
+ new precision_number_1.PrecisionNumber(1024, 3),
97
+ new precision_number_1.PrecisionNumber(1024, 3),
98
+ ],
99
+ [
100
+ new precision_number_1.PrecisionNumber(0, 1),
101
+ new precision_number_1.PrecisionNumber(1024, 3),
102
+ new precision_number_1.PrecisionNumber(1024, 3),
103
+ ],
104
+ ];
105
+ it("should plus correctly", () => {
106
+ for (const [left, right, expected] of data) {
107
+ const result = left.plus(right);
108
+ (0, chai_1.expect)(result.value).to.equal(expected.value);
109
+ (0, chai_1.expect)(result.precision).to.equal(expected.precision);
110
+ }
111
+ });
112
+ });
113
+ describe("minus", () => {
114
+ const data = [
115
+ [
116
+ new precision_number_1.PrecisionNumber(132900, 4),
117
+ new precision_number_1.PrecisionNumber(132892, 6),
118
+ new precision_number_1.PrecisionNumber(8, 1),
119
+ ],
120
+ [
121
+ new precision_number_1.PrecisionNumber(123, 2),
122
+ new precision_number_1.PrecisionNumber(0, 0),
123
+ new precision_number_1.PrecisionNumber(123, 2),
124
+ ],
125
+ [
126
+ new precision_number_1.PrecisionNumber(123, 2),
127
+ new precision_number_1.PrecisionNumber(0, 1),
128
+ new precision_number_1.PrecisionNumber(123, 2),
129
+ ],
130
+ ];
131
+ it("should minus correctly", () => {
132
+ for (const [left, right, expected] of data) {
133
+ const result = left.minus(right);
134
+ (0, chai_1.expect)(result.value).to.equal(expected.value);
135
+ (0, chai_1.expect)(result.precision).to.equal(expected.precision);
136
+ }
137
+ });
26
138
  });
27
139
  //# sourceMappingURL=precision-number.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"precision-number.spec.js","sourceRoot":"","sources":["../../src/precision-number.spec.ts"],"names":[],"mappings":";;AAAA,yDAAqD;AACrD,+BAA8B;AAE9B,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC3B,MAAM,MAAM,GAAG,kCAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzC,IAAA,aAAM,EAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,IAAA,aAAM,EAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QACxB,MAAM,MAAM,GAAG,kCAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAA,aAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjC,IAAA,aAAM,EAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACzB,MAAM,MAAM,GAAG,kCAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAA,aAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjC,IAAA,aAAM,EAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC1B,MAAM,MAAM,GAAG,kCAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAA,aAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjC,IAAA,aAAM,EAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"precision-number.spec.js","sourceRoot":"","sources":["../../src/precision-number.spec.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,9 @@ export declare class PrecisionNumber {
3
3
  precision: number;
4
4
  constructor(value: number, precision: number);
5
5
  static parse(input: string): PrecisionNumber;
6
+ plus(rhs: PrecisionNumber): PrecisionNumber;
7
+ minus(rhs: PrecisionNumber): PrecisionNumber;
8
+ valueOf(): number;
6
9
  toString(): string;
7
10
  toFixed(): string;
8
11
  toPrecision(): string;
@@ -1,5 +1,5 @@
1
+ import { NumberFormatter, localeDecimalSeparator } from "./number-formatter";
1
2
  import { invariantDecimalSeparator } from ".";
2
- import { localeDecimalSeparator, NumberFormatter } from "./number-formatter";
3
3
  export class PrecisionNumber {
4
4
  constructor(value, precision) {
5
5
  this.value = value;
@@ -13,11 +13,34 @@ export class PrecisionNumber {
13
13
  if (normalized.endsWith(invariantDecimalSeparator)) {
14
14
  normalized += "0";
15
15
  }
16
- const precision = normalized
16
+ const value = parseFloat(normalized);
17
+ let precision = normalized
17
18
  .replace(".", "")
18
19
  .replace("+", "")
19
20
  .replace("-", "").length;
20
- return new PrecisionNumber(parseFloat(normalized), precision);
21
+ if (value > -1 && value < 1 && value !== 0 && precision > 1) {
22
+ precision--;
23
+ }
24
+ return new PrecisionNumber(value, precision);
25
+ }
26
+ plus(rhs) {
27
+ // The result should have the same number of decimal places as the minimum of the two inputs
28
+ const lhs = this;
29
+ const value = lhs.value + rhs.value;
30
+ const decimals = Math.min(getNumberOfDecimalDigits(lhs.value, lhs.precision), getNumberOfDecimalDigits(rhs.value, rhs.precision));
31
+ const precision = getPrecision(value, decimals);
32
+ return new PrecisionNumber(value, precision);
33
+ }
34
+ minus(rhs) {
35
+ // The result should have the same number of decimal places as the minimum of the two inputs
36
+ const lhs = this;
37
+ const value = lhs.value - rhs.value;
38
+ const decimals = Math.min(getNumberOfDecimalDigits(lhs.value, lhs.precision), getNumberOfDecimalDigits(rhs.value, rhs.precision));
39
+ const precision = getPrecision(value, decimals);
40
+ return new PrecisionNumber(value, precision);
41
+ }
42
+ valueOf() {
43
+ return this.value;
21
44
  }
22
45
  toString() {
23
46
  return this.value.toString();
@@ -35,4 +58,45 @@ export class PrecisionNumber {
35
58
  return NumberFormatter.toLocalePrecision(this.value, this.precision);
36
59
  }
37
60
  }
61
+ function getPrecision(number, decimals) {
62
+ if (number == 0) {
63
+ return 1;
64
+ }
65
+ else if (number > -1 && number < 1) {
66
+ return decimals;
67
+ }
68
+ else {
69
+ return Math.max(getNumberOfIntegralDigits(number) + decimals, 1);
70
+ }
71
+ }
72
+ function getNumberOfDecimalDigits(number, precision) {
73
+ if (number > -1 && number < 1) {
74
+ return precision;
75
+ }
76
+ else {
77
+ return precision - getNumberOfIntegralDigits(number);
78
+ }
79
+ }
80
+ function getNumberOfIntegralDigits(number) {
81
+ const abs = Math.abs(number);
82
+ if (abs < 10)
83
+ return 1;
84
+ if (abs < 100)
85
+ return 2;
86
+ if (abs < 1000)
87
+ return 3;
88
+ if (abs < 10000)
89
+ return 4;
90
+ if (abs < 100000)
91
+ return 5;
92
+ if (abs < 1000000)
93
+ return 6;
94
+ if (abs < 10000000)
95
+ return 7;
96
+ if (abs < 100000000)
97
+ return 8;
98
+ if (abs < 1000000000)
99
+ return 9;
100
+ return Math.floor(Math.log10(abs) + 1);
101
+ }
38
102
  //# sourceMappingURL=precision-number.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"precision-number.js","sourceRoot":"","sources":["../../src/precision-number.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,GAAG,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE7E,MAAM,OAAO,eAAe;IACxB,YACW,KAAa,EACb,SAAiB;QADjB,UAAK,GAAL,KAAK,CAAQ;QACb,cAAS,GAAT,SAAS,CAAQ;IACzB,CAAC;IAEJ,MAAM,CAAC,KAAK,CAAC,KAAa;QACtB,IAAI,UAAU,GAAG,KAAK;aACjB,IAAI,EAAE;aACN,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;aACjB,OAAO,CAAC,sBAAsB,EAAE,yBAAyB,CAAC,CAAC;QAChE,IAAI,UAAU,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,CAAC;YACjD,UAAU,IAAI,GAAG,CAAC;QACtB,CAAC;QACD,MAAM,SAAS,GAAG,UAAU;aACvB,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;aAChB,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;aAChB,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;QAC7B,OAAO,IAAI,eAAe,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;IAClE,CAAC;IAED,QAAQ;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC;IAED,OAAO;QACH,OAAO,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/D,CAAC;IAED,WAAW;QACP,OAAO,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACnE,CAAC;IAED,aAAa;QACT,OAAO,eAAe,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACrE,CAAC;IAED,iBAAiB;QACb,OAAO,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACzE,CAAC;CACJ"}
1
+ {"version":3,"file":"precision-number.js","sourceRoot":"","sources":["../../src/precision-number.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,16 @@
1
1
  import { PrecisionNumber } from "./precision-number";
2
2
  import { expect } from "chai";
3
- describe("precision-number", () => {
3
+ describe("parse", () => {
4
4
  it("should not parse ''", () => {
5
5
  const number = PrecisionNumber.parse("");
6
6
  expect(Number.isNaN(number.value)).to.equal(true);
7
7
  expect(number.precision).to.equal(0);
8
8
  });
9
+ it("should parse '0'", () => {
10
+ const number = PrecisionNumber.parse("0");
11
+ expect(number.value).to.equal(0);
12
+ expect(number.precision).to.equal(1);
13
+ });
9
14
  it("should parse '1'", () => {
10
15
  const number = PrecisionNumber.parse("1");
11
16
  expect(number.value).to.equal(1);
@@ -21,5 +26,112 @@ describe("precision-number", () => {
21
26
  expect(number.value).to.equal(1);
22
27
  expect(number.precision).to.equal(2);
23
28
  });
29
+ it("should parse '0.6'", () => {
30
+ const number = PrecisionNumber.parse("0.6");
31
+ expect(number.value).to.equal(0.6);
32
+ expect(number.precision).to.equal(1);
33
+ });
34
+ it("should parse '.6'", () => {
35
+ const number = PrecisionNumber.parse(".6");
36
+ expect(number.value).to.equal(0.6);
37
+ expect(number.precision).to.equal(1);
38
+ });
39
+ });
40
+ describe("plus", () => {
41
+ const data = [
42
+ [
43
+ new PrecisionNumber(2, 1),
44
+ new PrecisionNumber(10, 2),
45
+ new PrecisionNumber(12, 2),
46
+ ],
47
+ [
48
+ new PrecisionNumber(2, 1),
49
+ new PrecisionNumber(-10, 2),
50
+ new PrecisionNumber(-8, 1),
51
+ ],
52
+ [
53
+ new PrecisionNumber(-2, 1),
54
+ new PrecisionNumber(10, 2),
55
+ new PrecisionNumber(8, 1),
56
+ ],
57
+ [
58
+ new PrecisionNumber(-2, 1),
59
+ new PrecisionNumber(-10, 2),
60
+ new PrecisionNumber(-12, 2),
61
+ ],
62
+ [
63
+ new PrecisionNumber(2, 1),
64
+ new PrecisionNumber(10, 3),
65
+ new PrecisionNumber(12, 2),
66
+ ],
67
+ [
68
+ new PrecisionNumber(2, 3),
69
+ new PrecisionNumber(10, 3),
70
+ new PrecisionNumber(12, 3),
71
+ ],
72
+ [
73
+ new PrecisionNumber(0.12, 2),
74
+ new PrecisionNumber(1, 2),
75
+ new PrecisionNumber(1.12, 2),
76
+ ],
77
+ [
78
+ new PrecisionNumber(0.12, 2),
79
+ new PrecisionNumber(1, 3),
80
+ new PrecisionNumber(1.12, 3),
81
+ ],
82
+ [
83
+ new PrecisionNumber(123456, 6),
84
+ new PrecisionNumber(1, 2),
85
+ new PrecisionNumber(123457, 6),
86
+ ],
87
+ [
88
+ new PrecisionNumber(1, 1),
89
+ new PrecisionNumber(1024, 3),
90
+ new PrecisionNumber(1025, 3),
91
+ ],
92
+ [
93
+ new PrecisionNumber(0, 0),
94
+ new PrecisionNumber(1024, 3),
95
+ new PrecisionNumber(1024, 3),
96
+ ],
97
+ [
98
+ new PrecisionNumber(0, 1),
99
+ new PrecisionNumber(1024, 3),
100
+ new PrecisionNumber(1024, 3),
101
+ ],
102
+ ];
103
+ it("should plus correctly", () => {
104
+ for (const [left, right, expected] of data) {
105
+ const result = left.plus(right);
106
+ expect(result.value).to.equal(expected.value);
107
+ expect(result.precision).to.equal(expected.precision);
108
+ }
109
+ });
110
+ });
111
+ describe("minus", () => {
112
+ const data = [
113
+ [
114
+ new PrecisionNumber(132900, 4),
115
+ new PrecisionNumber(132892, 6),
116
+ new PrecisionNumber(8, 1),
117
+ ],
118
+ [
119
+ new PrecisionNumber(123, 2),
120
+ new PrecisionNumber(0, 0),
121
+ new PrecisionNumber(123, 2),
122
+ ],
123
+ [
124
+ new PrecisionNumber(123, 2),
125
+ new PrecisionNumber(0, 1),
126
+ new PrecisionNumber(123, 2),
127
+ ],
128
+ ];
129
+ it("should minus correctly", () => {
130
+ for (const [left, right, expected] of data) {
131
+ const result = left.minus(right);
132
+ expect(result.value).to.equal(expected.value);
133
+ expect(result.precision).to.equal(expected.precision);
134
+ }
135
+ });
24
136
  });
25
137
  //# sourceMappingURL=precision-number.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"precision-number.spec.js","sourceRoot":"","sources":["../../src/precision-number.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC3B,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QACxB,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACzB,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC1B,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"precision-number.spec.js","sourceRoot":"","sources":["../../src/precision-number.spec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@utiliread/primitives",
3
- "version": "1.0.0-106",
3
+ "version": "1.0.0-108",
4
4
  "main": "dist/cjs/index.js",
5
5
  "module": "dist/esm/index.js",
6
6
  "types": "dist/esm/index.d.ts",
@@ -1,13 +1,19 @@
1
1
  import { PrecisionNumber } from "./precision-number";
2
2
  import { expect } from "chai";
3
3
 
4
- describe("precision-number", () => {
4
+ describe("parse", () => {
5
5
  it("should not parse ''", () => {
6
6
  const number = PrecisionNumber.parse("");
7
7
  expect(Number.isNaN(number.value)).to.equal(true);
8
8
  expect(number.precision).to.equal(0);
9
9
  });
10
10
 
11
+ it("should parse '0'", () => {
12
+ const number = PrecisionNumber.parse("0");
13
+ expect(number.value).to.equal(0);
14
+ expect(number.precision).to.equal(1);
15
+ });
16
+
11
17
  it("should parse '1'", () => {
12
18
  const number = PrecisionNumber.parse("1");
13
19
  expect(number.value).to.equal(1);
@@ -25,4 +31,117 @@ describe("precision-number", () => {
25
31
  expect(number.value).to.equal(1);
26
32
  expect(number.precision).to.equal(2);
27
33
  });
34
+
35
+ it("should parse '0.6'", () => {
36
+ const number = PrecisionNumber.parse("0.6");
37
+ expect(number.value).to.equal(0.6);
38
+ expect(number.precision).to.equal(1);
39
+ });
40
+
41
+ it("should parse '.6'", () => {
42
+ const number = PrecisionNumber.parse(".6");
43
+ expect(number.value).to.equal(0.6);
44
+ expect(number.precision).to.equal(1);
45
+ });
46
+ });
47
+
48
+ describe("plus", () => {
49
+ const data = [
50
+ [
51
+ new PrecisionNumber(2, 1),
52
+ new PrecisionNumber(10, 2),
53
+ new PrecisionNumber(12, 2),
54
+ ],
55
+ [
56
+ new PrecisionNumber(2, 1),
57
+ new PrecisionNumber(-10, 2),
58
+ new PrecisionNumber(-8, 1),
59
+ ],
60
+ [
61
+ new PrecisionNumber(-2, 1),
62
+ new PrecisionNumber(10, 2),
63
+ new PrecisionNumber(8, 1),
64
+ ],
65
+ [
66
+ new PrecisionNumber(-2, 1),
67
+ new PrecisionNumber(-10, 2),
68
+ new PrecisionNumber(-12, 2),
69
+ ],
70
+ [
71
+ new PrecisionNumber(2, 1),
72
+ new PrecisionNumber(10, 3),
73
+ new PrecisionNumber(12, 2),
74
+ ],
75
+ [
76
+ new PrecisionNumber(2, 3),
77
+ new PrecisionNumber(10, 3),
78
+ new PrecisionNumber(12, 3),
79
+ ],
80
+ [
81
+ new PrecisionNumber(0.12, 2),
82
+ new PrecisionNumber(1, 2),
83
+ new PrecisionNumber(1.12, 2),
84
+ ],
85
+ [
86
+ new PrecisionNumber(0.12, 2),
87
+ new PrecisionNumber(1, 3),
88
+ new PrecisionNumber(1.12, 3),
89
+ ],
90
+ [
91
+ new PrecisionNumber(123456, 6),
92
+ new PrecisionNumber(1, 2),
93
+ new PrecisionNumber(123457, 6),
94
+ ],
95
+ [
96
+ new PrecisionNumber(1, 1),
97
+ new PrecisionNumber(1024, 3),
98
+ new PrecisionNumber(1025, 3),
99
+ ],
100
+ [
101
+ new PrecisionNumber(0, 0),
102
+ new PrecisionNumber(1024, 3),
103
+ new PrecisionNumber(1024, 3),
104
+ ],
105
+ [
106
+ new PrecisionNumber(0, 1),
107
+ new PrecisionNumber(1024, 3),
108
+ new PrecisionNumber(1024, 3),
109
+ ],
110
+ ];
111
+
112
+ it("should plus correctly", () => {
113
+ for (const [left, right, expected] of data) {
114
+ const result = left.plus(right);
115
+ expect(result.value).to.equal(expected.value);
116
+ expect(result.precision).to.equal(expected.precision);
117
+ }
118
+ });
119
+ });
120
+
121
+ describe("minus", () => {
122
+ const data = [
123
+ [
124
+ new PrecisionNumber(132900, 4),
125
+ new PrecisionNumber(132892, 6),
126
+ new PrecisionNumber(8, 1),
127
+ ],
128
+ [
129
+ new PrecisionNumber(123, 2),
130
+ new PrecisionNumber(0, 0),
131
+ new PrecisionNumber(123, 2),
132
+ ],
133
+ [
134
+ new PrecisionNumber(123, 2),
135
+ new PrecisionNumber(0, 1),
136
+ new PrecisionNumber(123, 2),
137
+ ],
138
+ ];
139
+
140
+ it("should minus correctly", () => {
141
+ for (const [left, right, expected] of data) {
142
+ const result = left.minus(right);
143
+ expect(result.value).to.equal(expected.value);
144
+ expect(result.precision).to.equal(expected.precision);
145
+ }
146
+ });
28
147
  });
@@ -1,5 +1,6 @@
1
+ import { NumberFormatter, localeDecimalSeparator } from "./number-formatter";
2
+
1
3
  import { invariantDecimalSeparator } from ".";
2
- import { localeDecimalSeparator, NumberFormatter } from "./number-formatter";
3
4
 
4
5
  export class PrecisionNumber {
5
6
  constructor(
@@ -15,11 +16,43 @@ export class PrecisionNumber {
15
16
  if (normalized.endsWith(invariantDecimalSeparator)) {
16
17
  normalized += "0";
17
18
  }
18
- const precision = normalized
19
+ const value = parseFloat(normalized);
20
+ let precision = normalized
19
21
  .replace(".", "")
20
22
  .replace("+", "")
21
23
  .replace("-", "").length;
22
- return new PrecisionNumber(parseFloat(normalized), precision);
24
+ if (value > -1 && value < 1 && value !== 0 && precision > 1) {
25
+ precision--;
26
+ }
27
+ return new PrecisionNumber(value, precision);
28
+ }
29
+
30
+ plus(rhs: PrecisionNumber) {
31
+ // The result should have the same number of decimal places as the minimum of the two inputs
32
+ const lhs = this;
33
+ const value = lhs.value + rhs.value;
34
+ const decimals = Math.min(
35
+ getNumberOfDecimalDigits(lhs.value, lhs.precision),
36
+ getNumberOfDecimalDigits(rhs.value, rhs.precision),
37
+ );
38
+ const precision = getPrecision(value, decimals);
39
+ return new PrecisionNumber(value, precision);
40
+ }
41
+
42
+ minus(rhs: PrecisionNumber) {
43
+ // The result should have the same number of decimal places as the minimum of the two inputs
44
+ const lhs = this;
45
+ const value = lhs.value - rhs.value;
46
+ const decimals = Math.min(
47
+ getNumberOfDecimalDigits(lhs.value, lhs.precision),
48
+ getNumberOfDecimalDigits(rhs.value, rhs.precision),
49
+ );
50
+ const precision = getPrecision(value, decimals);
51
+ return new PrecisionNumber(value, precision);
52
+ }
53
+
54
+ valueOf() {
55
+ return this.value;
23
56
  }
24
57
 
25
58
  toString() {
@@ -42,3 +75,35 @@ export class PrecisionNumber {
42
75
  return NumberFormatter.toLocalePrecision(this.value, this.precision);
43
76
  }
44
77
  }
78
+
79
+ function getPrecision(number: number, decimals: number) {
80
+ if (number == 0) {
81
+ return 1;
82
+ } else if (number > -1 && number < 1) {
83
+ return decimals;
84
+ } else {
85
+ return Math.max(getNumberOfIntegralDigits(number) + decimals, 1);
86
+ }
87
+ }
88
+
89
+ function getNumberOfDecimalDigits(number: number, precision: number) {
90
+ if (number > -1 && number < 1) {
91
+ return precision;
92
+ } else {
93
+ return precision - getNumberOfIntegralDigits(number);
94
+ }
95
+ }
96
+
97
+ function getNumberOfIntegralDigits(number: number) {
98
+ const abs = Math.abs(number);
99
+ if (abs < 10) return 1;
100
+ if (abs < 100) return 2;
101
+ if (abs < 1000) return 3;
102
+ if (abs < 10000) return 4;
103
+ if (abs < 100000) return 5;
104
+ if (abs < 1000000) return 6;
105
+ if (abs < 10000000) return 7;
106
+ if (abs < 100000000) return 8;
107
+ if (abs < 1000000000) return 9;
108
+ return Math.floor(Math.log10(abs) + 1);
109
+ }