Skip to content

Commit 4129b5f

Browse files
authored
Added clamp and roundPrecision utility functions (#43)
Closes #27
1 parent 677754e commit 4129b5f

File tree

4 files changed

+89
-0
lines changed

4 files changed

+89
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1414
### dependabot: \#41 Bump micromatch from 4.0.5 to 4.0.8
1515

1616
- added `parseBool` utility function
17+
- added `clamp` and `roundPrecision` utility functions
1718

1819
## [0.6.0] - 2024-06-26
1920

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ export * from "./lib/date";
33
export * from "./lib/enum";
44
export * from "./lib/guid";
55
export * from "./lib/localStorage";
6+
export * from "./lib/number";
67
export * from "./lib/object";
78
export * from "./lib/string";

src/lib/number.spec.ts

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { clamp, roundPrecision } from "./number";
2+
3+
describe("number tests", () => {
4+
test.each([
5+
[null as unknown as number, null as unknown as number, null as unknown as number, 0],
6+
[null as unknown as number, null as unknown as number, 2, 0],
7+
[null as unknown as number, 1, 2, 1],
8+
[undefined as unknown as number, undefined as unknown as number, undefined as unknown as number, Number.NaN],
9+
[undefined as unknown as number, undefined as unknown as number, 2, Number.NaN],
10+
[undefined as unknown as number, 1, 2, Number.NaN],
11+
[1, undefined as unknown as number, undefined as unknown as number, Number.NaN],
12+
[1, undefined as unknown as number, 2, Number.NaN],
13+
[1, 1, undefined as unknown as number, Number.NaN],
14+
["test" as unknown as number, "test" as unknown as number, "test" as unknown as number, Number.NaN],
15+
["test" as unknown as number, 1, 2, Number.NaN],
16+
[1, "test" as unknown as number, "test" as unknown as number, Number.NaN],
17+
[-1, -1, 1, -1],
18+
[0, -1, 1, 0],
19+
[1, -1, 1, 1],
20+
[-2, -1, 1, -1],
21+
[2, -1, 1, 1],
22+
])("clamp", (value, min, max, expected) => {
23+
expect(clamp(value, min, max)).toBe(expected);
24+
});
25+
26+
test("clamp min greater than max", () => {
27+
expect(() => {
28+
clamp(0, 1, 0);
29+
}).toThrow("'1' cannot be greater than '0'.");
30+
});
31+
32+
test.each([
33+
[null as unknown as number, null as unknown as number, 0],
34+
[null as unknown as number, 2, 0],
35+
[2, null as unknown as number, 2],
36+
[undefined as unknown as number, undefined as unknown as number, Number.NaN],
37+
[undefined as unknown as number, 2, Number.NaN],
38+
[2, undefined as unknown as number, Number.NaN],
39+
[0, 0, 0],
40+
[0, 1, 0],
41+
[0, 2, 0],
42+
[0.4, 0, 0],
43+
[0.4, 1, 0.4],
44+
[0.4, 2, 0.4],
45+
[0.5, 0, 1],
46+
[0.5, 1, 0.5],
47+
[0.5, 2, 0.5],
48+
[0.44, 0, 0],
49+
[0.44, 1, 0.4],
50+
[0.44, 2, 0.44],
51+
[0.45, 0, 0],
52+
[0.45, 1, 0.5],
53+
[0.45, 2, 0.45],
54+
[0.454, 0, 0],
55+
[0.454, 1, 0.5],
56+
[0.454, 2, 0.45],
57+
[0.455, 0, 0],
58+
[0.455, 1, 0.5],
59+
[0.455, 2, 0.46],
60+
])("roundPrecision", (value, precision, expected) => {
61+
expect(roundPrecision(value, precision)).toBe(expected);
62+
});
63+
});

src/lib/number.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* Returns a number whose value is limited to the given range
3+
* @param value The initial value
4+
* @param min The lower boundary
5+
* @param max The upper boundary
6+
* @returns A number in the range (min, max)
7+
*/
8+
export function clamp(value: number, min: number, max: number): number {
9+
if (min > max) {
10+
throw new Error(`'${min}' cannot be greater than '${max}'.`);
11+
}
12+
return Math.min(Math.max(value, min), max);
13+
}
14+
15+
/**
16+
* Round a number with the specified precision
17+
* @param value The number to round
18+
* @param precision The desired precision
19+
* @returns The number rounded with the specified precision
20+
*/
21+
export function roundPrecision(value: number, precision: number): number {
22+
const multiplier = Math.pow(10, precision);
23+
return Math.round(value * multiplier) / multiplier;
24+
}

0 commit comments

Comments
 (0)