@fnmain/number 1.0.0 → 1.2.0

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.
package/dist/index.d.ts CHANGED
@@ -1,10 +1,14 @@
1
1
  type Options = {
2
2
  fixed?: number;
3
+ trimEndZeros?: boolean;
3
4
  space?: string;
4
5
  };
5
- export declare function toWan(value: number, { fixed, space }?: Options): string;
6
- export declare function toYi(value: number, { fixed, space }?: Options): string;
7
- export declare function toWanYi(value: number, { fixed, space }?: Options): string;
8
- export declare function toAuto(value: number, { fixed, space }?: Options): string;
9
- export declare function toPercent(value: number, { fixed, space }?: Options): string;
6
+ export declare function trimTrailingZeros(numberString: string): string;
7
+ export declare function toWan(value: number, { fixed, trimEndZeros, space }?: Options): string;
8
+ export declare function toYi(value: number, { fixed, trimEndZeros, space }?: Options): string;
9
+ export declare function toWanYi(value: number, { fixed, trimEndZeros, space }?: Options): string;
10
+ export declare function toAuto(value: number, { fixed, trimEndZeros, space }?: Options): string;
11
+ export declare function toPercent(value: number, { fixed, trimEndZeros, space }?: Options): string;
12
+ export declare function parseNumber(input: string): number | null;
10
13
  export {};
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,KAAK,OAAO,GAAG;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAQ9D;AAED,wBAAgB,KAAK,CACnB,KAAK,EAAE,MAAM,EACb,EAAE,KAAS,EAAE,YAAoB,EAAE,KAAU,EAAE,GAAE,OAAY,GAC5D,MAAM,CAIR;AAED,wBAAgB,IAAI,CAClB,KAAK,EAAE,MAAM,EACb,EAAE,KAAS,EAAE,YAAoB,EAAE,KAAU,EAAE,GAAE,OAAY,GAC5D,MAAM,CAIR;AAED,wBAAgB,OAAO,CACrB,KAAK,EAAE,MAAM,EACb,EAAE,KAAS,EAAE,YAAoB,EAAE,KAAU,EAAE,GAAE,OAAY,GAC5D,MAAM,CAIR;AAED,wBAAgB,MAAM,CACpB,KAAK,EAAE,MAAM,EACb,EAAE,KAAS,EAAE,YAAoB,EAAE,KAAU,EAAE,GAAE,OAAY,GAC5D,MAAM,CAcR;AAED,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,EACb,EAAE,KAAS,EAAE,YAAoB,EAAE,KAAU,EAAE,GAAE,OAAY,UAK9D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA0CxD"}
package/dist/index.js CHANGED
@@ -1,33 +1,93 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toPercent = exports.toAuto = exports.toWanYi = exports.toYi = exports.toWan = void 0;
4
- function toWan(value, { fixed = 0, space = "" } = {}) {
5
- return (value / 10000).toFixed(fixed) + space + "万";
3
+ exports.parseNumber = exports.toPercent = exports.toAuto = exports.toWanYi = exports.toYi = exports.toWan = exports.trimTrailingZeros = void 0;
4
+ function trimTrailingZeros(numberString) {
5
+ // Check if the string contains a decimal point
6
+ if (numberString.includes(".")) {
7
+ // Remove trailing zeros after a decimal point and the decimal point if necessary
8
+ return numberString.replace(/(\.\d*?[1-9])0+$|\.0*$/, "$1");
9
+ }
10
+ // Return the original string if there is no decimal point
11
+ return numberString;
12
+ }
13
+ exports.trimTrailingZeros = trimTrailingZeros;
14
+ function toWan(value, { fixed = 2, trimEndZeros = false, space = "" } = {}) {
15
+ let ret = (value / 10000).toFixed(fixed);
16
+ ret = trimEndZeros ? trimTrailingZeros(ret) : ret;
17
+ return ret + space + "万";
6
18
  }
7
19
  exports.toWan = toWan;
8
- function toYi(value, { fixed = 0, space = "" } = {}) {
9
- return (value / 100000000).toFixed(fixed) + space + "亿";
20
+ function toYi(value, { fixed = 2, trimEndZeros = false, space = "" } = {}) {
21
+ let ret = (value / 100000000).toFixed(fixed);
22
+ ret = trimEndZeros ? trimTrailingZeros(ret) : ret;
23
+ return ret + space + "亿";
10
24
  }
11
25
  exports.toYi = toYi;
12
- function toWanYi(value, { fixed = 0, space = "" } = {}) {
13
- return (value / 1000000000000).toFixed(fixed) + space + "万亿";
26
+ function toWanYi(value, { fixed = 2, trimEndZeros = false, space = "" } = {}) {
27
+ let ret = (value / 1000000000000).toFixed(fixed);
28
+ ret = trimEndZeros ? trimTrailingZeros(ret) : ret;
29
+ return ret + space + "万亿";
14
30
  }
15
31
  exports.toWanYi = toWanYi;
16
- function toAuto(value, { fixed = 0, space = "" } = {}) {
32
+ function toAuto(value, { fixed = 2, trimEndZeros = false, space = "" } = {}) {
17
33
  const abs = Math.abs(value);
18
34
  if (abs < 10000) {
19
- return value.toString();
35
+ let ret = value.toString();
36
+ ret = trimEndZeros ? trimTrailingZeros(ret) : ret;
37
+ return ret;
20
38
  }
21
39
  if (abs < 100000000) {
22
- return toWan(value, { fixed, space });
40
+ return toWan(value, { fixed, trimEndZeros, space });
23
41
  }
24
42
  if (abs < 1000000000000) {
25
- return toYi(value, { fixed, space });
43
+ return toYi(value, { fixed, trimEndZeros, space });
26
44
  }
27
- return toWanYi(value, { fixed, space });
45
+ return toWanYi(value, { fixed, trimEndZeros, space });
28
46
  }
29
47
  exports.toAuto = toAuto;
30
- function toPercent(value, { fixed = 0, space = "" } = {}) {
31
- return (value * 100).toFixed(fixed) + space + "%";
48
+ function toPercent(value, { fixed = 2, trimEndZeros = false, space = "" } = {}) {
49
+ let ret = (value * 100).toFixed(fixed);
50
+ ret = trimEndZeros ? trimTrailingZeros(ret) : ret;
51
+ return ret + space + "%";
32
52
  }
33
53
  exports.toPercent = toPercent;
54
+ function parseNumber(input) {
55
+ // Remove whitespace
56
+ input = input.trim();
57
+ // Define a helper function to handle suffixes
58
+ const handleSuffix = (number, suffix) => {
59
+ switch (suffix.toLowerCase()) {
60
+ case "k":
61
+ return number * 1e3;
62
+ case "m":
63
+ return number * 1e6;
64
+ case "g":
65
+ return number * 1e9;
66
+ case "t":
67
+ return number * 1e12;
68
+ default:
69
+ return number;
70
+ }
71
+ };
72
+ // Check for percentage
73
+ if (input.endsWith("%")) {
74
+ const number = parseFloat(input.slice(0, -1));
75
+ return isNaN(number) ? null : number / 100;
76
+ }
77
+ // Check for per mille
78
+ if (input.endsWith("‰")) {
79
+ const number = parseFloat(input.slice(0, -1));
80
+ return isNaN(number) ? null : number / 1000;
81
+ }
82
+ // Check for suffixes (k, m, g, t)
83
+ const suffixMatch = input.match(/([kmgKMGtT])$/);
84
+ if (suffixMatch) {
85
+ const number = parseFloat(input.slice(0, -1));
86
+ return isNaN(number) ? null : handleSuffix(number, suffixMatch[0]);
87
+ }
88
+ // Check for scientific notation and other formats
89
+ const number = parseFloat(input);
90
+ return isNaN(number) ? null : number;
91
+ }
92
+ exports.parseNumber = parseNumber;
93
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/test.d.ts CHANGED
@@ -1 +1,2 @@
1
1
  export {};
2
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":""}
package/dist/test.js CHANGED
@@ -8,5 +8,18 @@ console.log((0, index_1.toAuto)(1234, { fixed: 1 }));
8
8
  console.log((0, index_1.toAuto)(12345, { fixed: 1 }));
9
9
  console.log((0, index_1.toAuto)(123456789, { fixed: 2, space: " " }));
10
10
  console.log((0, index_1.toAuto)(12.3 * 10000 * 10000 * 10000, { fixed: 1, space: " " }));
11
+ console.log((0, index_1.toAuto)(1.2, { fixed: 4, trimEndZeros: true }));
11
12
  console.log((0, index_1.toPercent)(0.1234, { fixed: 1, space: " " }));
12
- console.log((0, index_1.toPercent)(1.234));
13
+ console.log((0, index_1.toPercent)(1.23456, { trimEndZeros: true }));
14
+ console.log((0, index_1.toPercent)(1.9, { fixed: 4, trimEndZeros: true }));
15
+ // Example usage
16
+ console.log((0, index_1.parseNumber)("50%")); // 0.5
17
+ console.log((0, index_1.parseNumber)("1e3")); // 1000
18
+ console.log((0, index_1.parseNumber)(" 123 ")); // 123
19
+ console.log((0, index_1.parseNumber)("100‰")); // 0.1
20
+ console.log((0, index_1.parseNumber)("5k")); // 5000
21
+ console.log((0, index_1.parseNumber)("3M")); // 3000000
22
+ console.log((0, index_1.parseNumber)("2G")); // 2000000000
23
+ console.log((0, index_1.parseNumber)("1t")); // 1000000000000
24
+ console.log((0, index_1.parseNumber)("abc")); // null
25
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":";;AAAA,mCAAyD;AAEzD,OAAO,CAAC,GAAG,CAAC,IAAA,cAAM,EAAC,IAAI,CAAC,CAAC,CAAC;AAC1B,OAAO,CAAC,GAAG,CAAC,IAAA,cAAM,EAAC,KAAK,CAAC,CAAC,CAAC;AAC3B,OAAO,CAAC,GAAG,CAAC,IAAA,cAAM,EAAC,SAAS,CAAC,CAAC,CAAC;AAE/B,OAAO,CAAC,GAAG,CAAC,IAAA,cAAM,EAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACxC,OAAO,CAAC,GAAG,CAAC,IAAA,cAAM,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACzC,OAAO,CAAC,GAAG,CAAC,IAAA,cAAM,EAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AACzD,OAAO,CAAC,GAAG,CAAC,IAAA,cAAM,EAAC,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AAC5E,OAAO,CAAC,GAAG,CAAC,IAAA,cAAM,EAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAE3D,OAAO,CAAC,GAAG,CAAC,IAAA,iBAAS,EAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AACzD,OAAO,CAAC,GAAG,CAAC,IAAA,iBAAS,EAAC,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACxD,OAAO,CAAC,GAAG,CAAC,IAAA,iBAAS,EAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAE9D,gBAAgB;AAChB,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAW,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;AACvC,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAW,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO;AACxC,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAW,EAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM;AAC3C,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAW,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM;AACxC,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAW,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO;AACvC,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAW,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU;AAC1C,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAW,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa;AAC7C,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAW,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,gBAAgB;AAChD,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAW,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO"}
package/package.json CHANGED
@@ -1,15 +1,19 @@
1
1
  {
2
2
  "name": "@fnmain/number",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "number utils",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "scripts": {
8
8
  "build": "tsc",
9
- "test": "node dist/test.js"
9
+ "test": "tsc && node dist/test.js"
10
10
  },
11
11
  "author": "DC",
12
12
  "license": "MIT",
13
+ "files": [
14
+ "dist",
15
+ "src"
16
+ ],
13
17
  "devDependencies": {
14
18
  "@types/node": "^20.8.3",
15
19
  "typescript": "^5.2.2"
package/src/index.ts CHANGED
@@ -1,34 +1,114 @@
1
1
  type Options = {
2
2
  fixed?: number;
3
+ trimEndZeros?: boolean;
3
4
  space?: string;
4
5
  };
5
6
 
6
- export function toWan(value: number, { fixed = 0, space = "" }: Options = {}): string {
7
- return (value / 10000).toFixed(fixed) + space + "万";
7
+ export function trimTrailingZeros(numberString: string): string {
8
+ // Check if the string contains a decimal point
9
+ if (numberString.includes(".")) {
10
+ // Remove trailing zeros after a decimal point and the decimal point if necessary
11
+ return numberString.replace(/(\.\d*?[1-9])0+$|\.0*$/, "$1");
12
+ }
13
+ // Return the original string if there is no decimal point
14
+ return numberString;
15
+ }
16
+
17
+ export function toWan(
18
+ value: number,
19
+ { fixed = 2, trimEndZeros = false, space = "" }: Options = {}
20
+ ): string {
21
+ let ret = (value / 10000).toFixed(fixed);
22
+ ret = trimEndZeros ? trimTrailingZeros(ret) : ret;
23
+ return ret + space + "万";
8
24
  }
9
25
 
10
- export function toYi(value: number, { fixed = 0, space = "" }: Options = {}): string {
11
- return (value / 100000000).toFixed(fixed) + space + "亿";
26
+ export function toYi(
27
+ value: number,
28
+ { fixed = 2, trimEndZeros = false, space = "" }: Options = {}
29
+ ): string {
30
+ let ret = (value / 100000000).toFixed(fixed);
31
+ ret = trimEndZeros ? trimTrailingZeros(ret) : ret;
32
+ return ret + space + "亿";
12
33
  }
13
34
 
14
- export function toWanYi(value: number, { fixed = 0, space = "" }: Options = {}): string {
15
- return (value / 1000000000000).toFixed(fixed) + space + "万亿";
35
+ export function toWanYi(
36
+ value: number,
37
+ { fixed = 2, trimEndZeros = false, space = "" }: Options = {}
38
+ ): string {
39
+ let ret = (value / 1000000000000).toFixed(fixed);
40
+ ret = trimEndZeros ? trimTrailingZeros(ret) : ret;
41
+ return ret + space + "万亿";
16
42
  }
17
43
 
18
- export function toAuto(value: number, { fixed = 0, space = "" }: Options = {}): string {
44
+ export function toAuto(
45
+ value: number,
46
+ { fixed = 2, trimEndZeros = false, space = "" }: Options = {}
47
+ ): string {
19
48
  const abs = Math.abs(value);
20
49
  if (abs < 10000) {
21
- return value.toString();
50
+ let ret = value.toString();
51
+ ret = trimEndZeros ? trimTrailingZeros(ret) : ret;
52
+ return ret;
22
53
  }
23
54
  if (abs < 100000000) {
24
- return toWan(value, { fixed, space });
55
+ return toWan(value, { fixed, trimEndZeros, space });
25
56
  }
26
57
  if (abs < 1000000000000) {
27
- return toYi(value, { fixed, space });
58
+ return toYi(value, { fixed, trimEndZeros, space });
28
59
  }
29
- return toWanYi(value, { fixed, space });
60
+ return toWanYi(value, { fixed, trimEndZeros, space });
30
61
  }
31
62
 
32
- export function toPercent(value: number, { fixed = 0, space = "" }: Options = {}) {
33
- return (value * 100).toFixed(fixed) + space + "%";
63
+ export function toPercent(
64
+ value: number,
65
+ { fixed = 2, trimEndZeros = false, space = "" }: Options = {}
66
+ ) {
67
+ let ret = (value * 100).toFixed(fixed);
68
+ ret = trimEndZeros ? trimTrailingZeros(ret) : ret;
69
+ return ret + space + "%";
70
+ }
71
+
72
+ export function parseNumber(input: string): number | null {
73
+ // Remove whitespace
74
+ input = input.trim();
75
+
76
+ // Define a helper function to handle suffixes
77
+ const handleSuffix = (number: number, suffix: string): number => {
78
+ switch (suffix.toLowerCase()) {
79
+ case "k":
80
+ return number * 1e3;
81
+ case "m":
82
+ return number * 1e6;
83
+ case "g":
84
+ return number * 1e9;
85
+ case "t":
86
+ return number * 1e12;
87
+ default:
88
+ return number;
89
+ }
90
+ };
91
+
92
+ // Check for percentage
93
+ if (input.endsWith("%")) {
94
+ const number = parseFloat(input.slice(0, -1));
95
+ return isNaN(number) ? null : number / 100;
96
+ }
97
+
98
+ // Check for per mille
99
+ if (input.endsWith("‰")) {
100
+ const number = parseFloat(input.slice(0, -1));
101
+ return isNaN(number) ? null : number / 1000;
102
+ }
103
+
104
+ // Check for suffixes (k, m, g, t)
105
+ const suffixMatch = input.match(/([kmgKMGtT])$/);
106
+ if (suffixMatch) {
107
+ const number = parseFloat(input.slice(0, -1));
108
+ return isNaN(number) ? null : handleSuffix(number, suffixMatch[0]);
109
+ }
110
+
111
+ // Check for scientific notation and other formats
112
+ const number = parseFloat(input);
113
+ return isNaN(number) ? null : number;
34
114
  }
package/src/test.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { toAuto, toPercent } from "./index";
1
+ import { parseNumber, toAuto, toPercent } from "./index";
2
2
 
3
3
  console.log(toAuto(1234));
4
4
  console.log(toAuto(12345));
@@ -8,6 +8,19 @@ console.log(toAuto(1234, { fixed: 1 }));
8
8
  console.log(toAuto(12345, { fixed: 1 }));
9
9
  console.log(toAuto(123456789, { fixed: 2, space: " " }));
10
10
  console.log(toAuto(12.3 * 10000 * 10000 * 10000, { fixed: 1, space: " " }));
11
+ console.log(toAuto(1.2, { fixed: 4, trimEndZeros: true }));
11
12
 
12
13
  console.log(toPercent(0.1234, { fixed: 1, space: " " }));
13
- console.log(toPercent(1.234));
14
+ console.log(toPercent(1.23456, { trimEndZeros: true }));
15
+ console.log(toPercent(1.9, { fixed: 4, trimEndZeros: true }));
16
+
17
+ // Example usage
18
+ console.log(parseNumber("50%")); // 0.5
19
+ console.log(parseNumber("1e3")); // 1000
20
+ console.log(parseNumber(" 123 ")); // 123
21
+ console.log(parseNumber("100‰")); // 0.1
22
+ console.log(parseNumber("5k")); // 5000
23
+ console.log(parseNumber("3M")); // 3000000
24
+ console.log(parseNumber("2G")); // 2000000000
25
+ console.log(parseNumber("1t")); // 1000000000000
26
+ console.log(parseNumber("abc")); // null
package/tsconfig.json DELETED
@@ -1,14 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "es2016",
4
- "module": "commonjs",
5
- "outDir": "./dist",
6
- "strict": true,
7
- "esModuleInterop": true,
8
- "skipLibCheck": true,
9
- "forceConsistentCasingInFileNames": true,
10
- "declaration": true
11
- },
12
- "include": ["src/**/*.ts"],
13
- "exclude": ["node_modules"]
14
- }