Skip to content

Commit f5793fb

Browse files
feat: add toNumberOrNull utility function for safe number conversion
1 parent 8eaac8d commit f5793fb

File tree

5 files changed

+46
-6
lines changed

5 files changed

+46
-6
lines changed

CHANGELOG.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# [Versions](https://github.com/Tracktor/react-utils/releases)
22

3-
## v1.27.1
4-
- **[fix]** : Enhance play function in useAudio hook to reset currentTime before playback
3+
## v1.28.0
4+
- **[FEAT]** : add toNumberOrNull utility function for safe number conversion

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@tracktor/react-utils",
33
"description": "React data table and react data grid",
4-
"version": "1.27.1",
4+
"version": "1.28.0",
55
"private": false,
66
"license": "ISC",
77
"type": "module",

src/main.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
// Hook
2-
31
export * from "@/hooks/useAudio/useAudio";
42
export { default as useAudio } from "@/hooks/useAudio/useAudio";
53
export * from "@/hooks/useDebounce/useDebounce";
@@ -52,14 +50,15 @@ export * from "@/utils/is/isRef";
5250
export { default as isRef } from "@/utils/is/isRef";
5351
export * from "@/utils/is/isString";
5452
export { default as isString } from "@/utils/is/isString";
53+
export * from "@/utils/number/toNumber/toNumberOrNull";
54+
export { default as toNumberOrNull } from "@/utils/number/toNumber/toNumberOrNull";
5555
export * from "@/utils/number/toNumber/toNumberOrZero";
5656
export { default as toNumberOrZero } from "@/utils/number/toNumber/toNumberOrZero";
5757
export * from "@/utils/object/getObjectValue/getObjectValue";
5858
export { default as getObjectValue } from "@/utils/object/getObjectValue/getObjectValue";
5959
export * from "@/utils/object/isDeepEqualObject";
6060
export { default as isDeepEqualObject } from "@/utils/object/isDeepEqualObject";
6161
export * from "@/utils/object/removeObjectProperty";
62-
// Utils
6362
export { default as removeObjectProperty } from "@/utils/object/removeObjectProperty";
6463
export * from "@/utils/string/capitalize";
6564
export { default as capitalize } from "@/utils/string/capitalize";
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { describe, expect, it } from "vitest";
2+
import toNumberOrNull from "./toNumberOrNull";
3+
4+
describe("toNumberOrNull", () => {
5+
it("devrait retourner un nombre pour les valeurs numériques", () => {
6+
expect(toNumberOrNull(42)).toBe(42);
7+
expect(toNumberOrNull("42")).toBe(42);
8+
expect(toNumberOrNull(0)).toBe(0);
9+
expect(toNumberOrNull("0")).toBe(0);
10+
expect(toNumberOrNull(-42)).toBe(-42);
11+
expect(toNumberOrNull("-42")).toBe(-42);
12+
expect(toNumberOrNull(3.14)).toBe(3.14);
13+
expect(toNumberOrNull("3.14")).toBe(3.14);
14+
});
15+
16+
it("devrait retourner null pour les valeurs non numériques", () => {
17+
expect(toNumberOrNull("abc")).toBeNull();
18+
expect(toNumberOrNull(null)).toBeNull();
19+
expect(toNumberOrNull(undefined)).toBeNull();
20+
expect(toNumberOrNull({})).toBeNull();
21+
expect(toNumberOrNull([])).toBeNull();
22+
expect(toNumberOrNull(NaN)).toBeNull();
23+
expect(toNumberOrNull(true)).toBeNull();
24+
expect(toNumberOrNull(false)).toBeNull();
25+
});
26+
});
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/**
2+
* Convert a value to a number or return null
3+
* This function avoid NaN values
4+
* @param value
5+
*/
6+
const toNumberOrNull = (value: unknown): number | null => {
7+
if (value === null || value === undefined || typeof value === "boolean" || typeof value === "object") {
8+
return null;
9+
}
10+
11+
const num = Number(value);
12+
return Number.isNaN(num) ? null : num;
13+
};
14+
15+
export default toNumberOrNull;

0 commit comments

Comments
 (0)