Skip to content

Commit 0c911f9

Browse files
committed
feat: toStringNumber
1 parent 4e7214f commit 0c911f9

5 files changed

Lines changed: 249 additions & 28 deletions

File tree

__tests__/convert.test.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,45 @@ test("parseNumber with max", () => {
6363
"100",
6464
);
6565
});
66+
67+
test("Negative number", () => {
68+
expect(starkString("-48g39 d").toNumber({ negative: false })).toBe(4839);
69+
70+
expect(starkString("d -48g39 d").toStringNumber()).toBe("-4839");
71+
72+
expect(starkString("-48g39 d").toNumber()).toBe(-4839);
73+
expect(starkString("-48g-39 d").toNumber()).toBe(-4839);
74+
75+
expect(starkString("-").toStringNumber()).toBe("-");
76+
77+
expect(starkString("48g39 d").toStringNumber()).toBe("4839");
78+
});
79+
80+
test("Decimal number", () => {
81+
expect(
82+
starkString("-48g.39 d").toStringNumber({
83+
negative: false,
84+
decimal: false,
85+
}),
86+
).toBe("4839");
87+
88+
expect(starkString("d 48g34.9 d").toStringNumber({ decimal: true })).toBe(
89+
"4834.9",
90+
);
91+
92+
expect(starkString(".48g39 d").toStringNumber({ decimal: true })).toBe(
93+
"0.4839",
94+
);
95+
96+
expect(starkString("4.8g39 d").toStringNumber()).toBe("4.839");
97+
});
98+
99+
test("Decimal Negative number", () => {
100+
expect(starkString("-48g.39 d").toStringNumber()).toBe("-48.39");
101+
102+
expect(starkString("d 4-8g34.9 d").toStringNumber()).toBe("4834.9");
103+
104+
expect(starkString("-.48g39 d").toStringNumber()).toBe("-0.4839");
105+
106+
expect(starkString(" -4.8g39 d").toStringNumber()).toBe("-4.839");
107+
});

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,14 @@
3838
"eslint": "7.3.1",
3939
"eslint-plugin-prettier": "3.1.4",
4040
"jest": "26.0.1",
41-
"prettier": "2.0.5",
42-
"prettier-plugin-jsdoc": "^0.2.0",
41+
"prettier": "^2.3.2",
42+
"prettier-plugin-jsdoc": "^0.3.23",
4343
"ts-jest": "25.5.1",
44-
"typescript": "^4.0.3"
44+
"typescript": "^4.3.5"
4545
},
4646
"scripts": {
4747
"prepare": "yarn build",
4848
"build": "tsc",
4949
"test": "yarn build && jest"
5050
}
51-
}
51+
}

src/index.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
currency,
1313
security,
1414
parseNumber,
15+
toNumber,
1516
} from "./lib";
1617
import NativeString from "./NativeString";
1718

@@ -73,8 +74,7 @@ class StarkString extends NativeString {
7374

7475
/**
7576
* Used for decode Persian Characters in URL
76-
* https://fa.wikipedia.org/wiki/مدیاویکی:Gadget-Extra-Editbuttons-Functions.
77-
* s
77+
* https://fa.wikipedia.org/wiki/مدیاویکی:Gadget-Extra-Editbuttons-Functions.js
7878
*/
7979
fixURL(): StarkString {
8080
this._value = decodeURL(this._value);
@@ -83,8 +83,7 @@ class StarkString extends NativeString {
8383

8484
/**
8585
* Used for decode Persian Characters in URL
86-
* https://fa.wikipedia.org/wiki/مدیاویکی:Gadget-Extra-Editbuttons-Functions.
87-
* s
86+
* https://fa.wikipedia.org/wiki/مدیاویکی:Gadget-Extra-Editbuttons-Functions.js
8887
*/
8988
decodeURL(): StarkString {
9089
this._value = decodeURL(this._value);
@@ -142,8 +141,15 @@ class StarkString extends NativeString {
142141
return this;
143142
}
144143

145-
/** Convert to number by native Number function */
146-
toNumber(): number {
144+
/** Convert any string to number */
145+
toStringNumber(options?: Parameters<typeof toNumber>[1]): string {
146+
this._value = toNumber(this._value, options);
147+
return this._value;
148+
}
149+
150+
/** Convert any string to number */
151+
toNumber(options?: Parameters<typeof toNumber>[1]): number {
152+
this.toStringNumber(options);
147153
return Number(this._value);
148154
}
149155
}

src/lib.ts

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,14 +315,74 @@ function halfSpace(value: string): string {
315315
return value;
316316
}
317317

318-
/** Remove anything expect numbers */
318+
/** Remove anything expect numbers, this function will remove negative and decimal */
319319
function parseNumber(value: string): string {
320320
return englishNumber(value).replace(/\D/g, "");
321321
}
322322

323+
/**
324+
* Convert numbers to english number and remove anything expect integer or decimal
325+
* numbers
326+
*/
327+
function toNumber(
328+
value: string,
329+
{
330+
negative = true,
331+
decimal = true,
332+
max,
333+
min,
334+
}: {
335+
/** Default is true */
336+
negative?: boolean;
337+
/** Default is true */
338+
decimal?: boolean;
339+
max?: number;
340+
min?: number;
341+
} = {},
342+
): string {
343+
let num =
344+
englishNumber(value)
345+
.match(/(-?\.?\d?)+/g)
346+
?.join("") || "";
347+
348+
// if (options?.negative && options?.decimal) {
349+
350+
// }
351+
if (decimal && negative) {
352+
num = num.replace(/(^.+)(-)/g, "$1");
353+
num = num.replace(/^\./g, "0.");
354+
num = num.replace(/^-\./g, "-0.");
355+
num = num.match(/^-?\d*\.?\d*$/g)?.join("") || "";
356+
} else {
357+
if (negative) {
358+
num = num.replace(/(^.+)(-)/g, "$1");
359+
num = num.match(/^-?(\d?)+$/g)?.join("") || "";
360+
} else if (decimal) {
361+
num = num.replace(/^\./g, "0.");
362+
num = num.match(/\d*\.?\d*$/g)?.join("") || "";
363+
} else {
364+
num = num.replace(/\D/g, "");
365+
}
366+
}
367+
368+
if (typeof max === "number") {
369+
if (Number(num) > max) {
370+
num = String(max);
371+
}
372+
}
373+
374+
if (typeof min === "number") {
375+
if (Number(num) < min) {
376+
num = String(min);
377+
}
378+
}
379+
380+
return num;
381+
}
382+
323383
/** Used for validation integer number */
324384
function isInteger(value: string): boolean {
325-
return /^\d+$/.test(value);
385+
return Number.isInteger(Number(value));
326386
}
327387

328388
/**
@@ -392,4 +452,5 @@ export {
392452
currency,
393453
security,
394454
parseNumber,
455+
toNumber,
395456
};

0 commit comments

Comments
 (0)