@sheinx/hooks 3.8.0-beta.3 → 3.8.0-beta.4

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 +1 @@
1
- {"version":3,"file":"use-input-format.d.ts","sourceRoot":"","sources":["use-input-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAM3D,QAAA,MAAM,cAAc,UAAW,gBAAgB;kBAsBP,MAAM,GAAG,SAAS;gBAoCpB,gBAAgB,CAAC,gBAAgB,CAAC;iBAgDhC,gBAAgB,CAAC,gBAAgB,CAAC;;;CAyBzE,CAAC;AAEF,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"use-input-format.d.ts","sourceRoot":"","sources":["use-input-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAO3D,QAAA,MAAM,cAAc,UAAW,gBAAgB;kBAsBP,MAAM,GAAG,SAAS;gBAoCpB,gBAAgB,CAAC,gBAAgB,CAAC;iBAgDhC,gBAAgB,CAAC,gBAAgB,CAAC;;;CAyBzE,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = void 0;
7
7
  var _react = _interopRequireDefault(require("react"));
8
8
  var _usePersistFn = _interopRequireDefault(require("../../common/use-persist-fn"));
9
+ var _number = require("../../utils/number");
9
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
11
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
11
12
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -96,7 +97,7 @@ var useInputFormat = function useInputFormat(props) {
96
97
  if (numType === 'positive' && Number(value) <= 0) value = '';
97
98
  if (digits !== undefined && autoFix) {
98
99
  if (digits > 0) {
99
- value = parseFloat(value).toFixed(digits);
100
+ value = (0, _number.preciseString)(value, digits);
100
101
  } else if (digits === 0) {
101
102
  value = parseInt(value, 10).toString();
102
103
  }
@@ -5,4 +5,14 @@ export declare function isE(number: unknown): boolean;
5
5
  export declare function getNumberPrecision(number: unknown): number;
6
6
  export declare function sub(num1: number, num2: number): number;
7
7
  export declare function toNum(v: number | string | undefined): number;
8
+ /**
9
+ * 格式化数字字符串到指定小数位
10
+ * @param {string} value 数字字符串
11
+ * @param {number} precision 小数位数
12
+ * @returns {string} 格式化后的字符串
13
+ * @example
14
+ * console.log(preciseString('111111111111111.888', 2)) // "111111111111111.89"
15
+ * console.log(preciseString('9.999', 2)) // "10.00"
16
+ */
17
+ export declare const preciseString: (value: string, precision?: number) => string;
8
18
  //# sourceMappingURL=number.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"number.d.ts","sourceRoot":"","sources":["number.ts"],"names":[],"mappings":"AAEA,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAI,YAM3C;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,SAAK,UAEtD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,WAgB1C;AACD,wBAAgB,GAAG,CAAC,MAAM,EAAE,OAAO,WAIlC;AACD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,UAgBjD;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAY7C;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAe5D"}
1
+ {"version":3,"file":"number.d.ts","sourceRoot":"","sources":["number.ts"],"names":[],"mappings":"AAEA,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAI,YAM3C;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,SAAK,UAEtD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,WAgB1C;AACD,wBAAgB,GAAG,CAAC,MAAM,EAAE,OAAO,WAIlC;AACD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,UAgBjD;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAY7C;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAe5D;AAmED;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,UAAW,MAAM,+BAwB1C,CAAA"}
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.getNumberPrecision = getNumberPrecision;
7
7
  exports.isE = isE;
8
+ exports.preciseString = void 0;
8
9
  exports.range = range;
9
10
  exports.sub = sub;
10
11
  exports.toNum = toNum;
@@ -85,4 +86,101 @@ function toNum(v) {
85
86
  return isNaN(parsedValue) ? 0 : parsedValue;
86
87
  }
87
88
  return 0;
88
- }
89
+ }
90
+
91
+ /**
92
+ * 在字符串层面实现四舍五入
93
+ * @param {string} numStr 数字字符串
94
+ * @param {number} precision 精度
95
+ * @returns {string} 四舍五入后的字符串
96
+ */
97
+ function roundString(numStr, precision) {
98
+ if (precision < 0) return numStr;
99
+ var parts = numStr.split('.');
100
+ var intPart = parts[0];
101
+ var decimalPart = parts[1] || '';
102
+ if (decimalPart.length <= precision) {
103
+ return intPart + (decimalPart ? ".".concat(decimalPart.padEnd(precision, '0')) : '');
104
+ }
105
+
106
+ // 需要进行四舍五入
107
+ var roundPos = precision;
108
+ var carry = 0;
109
+
110
+ // 确定是否需要进位
111
+ if (parseInt(decimalPart[roundPos], 10) >= 5) carry = 1;
112
+
113
+ // 如果不需要进位,直接截断
114
+ if (carry === 0) {
115
+ return intPart + (precision > 0 ? ".".concat(decimalPart.slice(0, precision)) : '');
116
+ }
117
+
118
+ // 处理进位
119
+ var digits = (intPart + (decimalPart ? ".".concat(decimalPart) : '')).replace('.', '').split('');
120
+ var dotPos = intPart.length;
121
+
122
+ // 从小数位开始向前进位
123
+ var i = dotPos + precision - 1;
124
+ while (carry > 0 && i >= 0) {
125
+ // 跳过小数点
126
+ if (i === dotPos - 1) {
127
+ i -= 1;
128
+ continue;
129
+ }
130
+ var d = parseInt(digits[i], 10) + carry;
131
+ digits[i] = (d % 10).toString();
132
+ carry = Math.floor(d / 10);
133
+ i -= 1;
134
+ }
135
+
136
+ // 处理最高位进位
137
+ var result = '';
138
+ if (carry > 0) result = '1';
139
+
140
+ // 重建数字字符串
141
+ for (var j = 0; j < digits.length; j++) {
142
+ // 插入小数点
143
+ if (j === dotPos && precision > 0) result += '.';
144
+ // 只添加到所需精度
145
+ if (j < dotPos || j < dotPos + precision) {
146
+ result += digits[j];
147
+ }
148
+ }
149
+ return result;
150
+ }
151
+
152
+ /**
153
+ * 格式化数字字符串到指定小数位
154
+ * @param {string} value 数字字符串
155
+ * @param {number} precision 小数位数
156
+ * @returns {string} 格式化后的字符串
157
+ * @example
158
+ * console.log(preciseString('111111111111111.888', 2)) // "111111111111111.89"
159
+ * console.log(preciseString('9.999', 2)) // "10.00"
160
+ */
161
+ var preciseString = exports.preciseString = function preciseString(value) {
162
+ var precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;
163
+ // 如果不是数字字符串,则返回原值
164
+ if (!/^-?\d+(\.\d+)?$/.test(value)) {
165
+ return value;
166
+ }
167
+
168
+ // 如果不需要格式化精度,直接返回
169
+ if (precision < 0) return value;
170
+
171
+ // 分离整数和小数部分
172
+ var parts = value.split('.');
173
+ var intPart = parts[0];
174
+ var decimalPart = parts[1] || '';
175
+
176
+ // 截断或补零
177
+ if (decimalPart.length > precision) {
178
+ // 需要四舍五入
179
+ if (precision < decimalPart.length && parseInt(decimalPart[precision], 10) >= 5) {
180
+ // 手动实现字符串层面的四舍五入
181
+ return roundString("".concat(intPart, ".").concat(decimalPart), precision);
182
+ }
183
+ return intPart + (precision > 0 ? ".".concat(decimalPart.slice(0, precision)) : '');
184
+ }
185
+ return intPart + (precision > 0 ? ".".concat(decimalPart.padEnd(precision, '0')) : '');
186
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"use-input-format.d.ts","sourceRoot":"","sources":["use-input-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAM3D,QAAA,MAAM,cAAc,UAAW,gBAAgB;kBAsBP,MAAM,GAAG,SAAS;gBAoCpB,gBAAgB,CAAC,gBAAgB,CAAC;iBAgDhC,gBAAgB,CAAC,gBAAgB,CAAC;;;CAyBzE,CAAC;AAEF,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"use-input-format.d.ts","sourceRoot":"","sources":["use-input-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAO3D,QAAA,MAAM,cAAc,UAAW,gBAAgB;kBAsBP,MAAM,GAAG,SAAS;gBAoCpB,gBAAgB,CAAC,gBAAgB,CAAC;iBAgDhC,gBAAgB,CAAC,gBAAgB,CAAC;;;CAyBzE,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -6,6 +6,7 @@ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" !=
6
6
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
7
  import React from 'react';
8
8
  import usePersistFn from "../../common/use-persist-fn";
9
+ import { preciseString } from "../../utils/number";
9
10
  function regLength(size) {
10
11
  return /\d+/.test(String(size)) && size > 0 ? "{0,".concat(size, "}") : '*';
11
12
  }
@@ -89,7 +90,7 @@ var useInputFormat = function useInputFormat(props) {
89
90
  if (numType === 'positive' && Number(value) <= 0) value = '';
90
91
  if (digits !== undefined && autoFix) {
91
92
  if (digits > 0) {
92
- value = parseFloat(value).toFixed(digits);
93
+ value = preciseString(value, digits);
93
94
  } else if (digits === 0) {
94
95
  value = parseInt(value, 10).toString();
95
96
  }
@@ -5,4 +5,14 @@ export declare function isE(number: unknown): boolean;
5
5
  export declare function getNumberPrecision(number: unknown): number;
6
6
  export declare function sub(num1: number, num2: number): number;
7
7
  export declare function toNum(v: number | string | undefined): number;
8
+ /**
9
+ * 格式化数字字符串到指定小数位
10
+ * @param {string} value 数字字符串
11
+ * @param {number} precision 小数位数
12
+ * @returns {string} 格式化后的字符串
13
+ * @example
14
+ * console.log(preciseString('111111111111111.888', 2)) // "111111111111111.89"
15
+ * console.log(preciseString('9.999', 2)) // "10.00"
16
+ */
17
+ export declare const preciseString: (value: string, precision?: number) => string;
8
18
  //# sourceMappingURL=number.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"number.d.ts","sourceRoot":"","sources":["number.ts"],"names":[],"mappings":"AAEA,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAI,YAM3C;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,SAAK,UAEtD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,WAgB1C;AACD,wBAAgB,GAAG,CAAC,MAAM,EAAE,OAAO,WAIlC;AACD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,UAgBjD;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAY7C;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAe5D"}
1
+ {"version":3,"file":"number.d.ts","sourceRoot":"","sources":["number.ts"],"names":[],"mappings":"AAEA,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAI,YAM3C;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,SAAK,UAEtD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,WAgB1C;AACD,wBAAgB,GAAG,CAAC,MAAM,EAAE,OAAO,WAIlC;AACD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,UAgBjD;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAY7C;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAe5D;AAmED;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,UAAW,MAAM,+BAwB1C,CAAA"}
@@ -73,4 +73,101 @@ export function toNum(v) {
73
73
  return isNaN(parsedValue) ? 0 : parsedValue;
74
74
  }
75
75
  return 0;
76
- }
76
+ }
77
+
78
+ /**
79
+ * 在字符串层面实现四舍五入
80
+ * @param {string} numStr 数字字符串
81
+ * @param {number} precision 精度
82
+ * @returns {string} 四舍五入后的字符串
83
+ */
84
+ function roundString(numStr, precision) {
85
+ if (precision < 0) return numStr;
86
+ var parts = numStr.split('.');
87
+ var intPart = parts[0];
88
+ var decimalPart = parts[1] || '';
89
+ if (decimalPart.length <= precision) {
90
+ return intPart + (decimalPart ? ".".concat(decimalPart.padEnd(precision, '0')) : '');
91
+ }
92
+
93
+ // 需要进行四舍五入
94
+ var roundPos = precision;
95
+ var carry = 0;
96
+
97
+ // 确定是否需要进位
98
+ if (parseInt(decimalPart[roundPos], 10) >= 5) carry = 1;
99
+
100
+ // 如果不需要进位,直接截断
101
+ if (carry === 0) {
102
+ return intPart + (precision > 0 ? ".".concat(decimalPart.slice(0, precision)) : '');
103
+ }
104
+
105
+ // 处理进位
106
+ var digits = (intPart + (decimalPart ? ".".concat(decimalPart) : '')).replace('.', '').split('');
107
+ var dotPos = intPart.length;
108
+
109
+ // 从小数位开始向前进位
110
+ var i = dotPos + precision - 1;
111
+ while (carry > 0 && i >= 0) {
112
+ // 跳过小数点
113
+ if (i === dotPos - 1) {
114
+ i -= 1;
115
+ continue;
116
+ }
117
+ var d = parseInt(digits[i], 10) + carry;
118
+ digits[i] = (d % 10).toString();
119
+ carry = Math.floor(d / 10);
120
+ i -= 1;
121
+ }
122
+
123
+ // 处理最高位进位
124
+ var result = '';
125
+ if (carry > 0) result = '1';
126
+
127
+ // 重建数字字符串
128
+ for (var j = 0; j < digits.length; j++) {
129
+ // 插入小数点
130
+ if (j === dotPos && precision > 0) result += '.';
131
+ // 只添加到所需精度
132
+ if (j < dotPos || j < dotPos + precision) {
133
+ result += digits[j];
134
+ }
135
+ }
136
+ return result;
137
+ }
138
+
139
+ /**
140
+ * 格式化数字字符串到指定小数位
141
+ * @param {string} value 数字字符串
142
+ * @param {number} precision 小数位数
143
+ * @returns {string} 格式化后的字符串
144
+ * @example
145
+ * console.log(preciseString('111111111111111.888', 2)) // "111111111111111.89"
146
+ * console.log(preciseString('9.999', 2)) // "10.00"
147
+ */
148
+ export var preciseString = function preciseString(value) {
149
+ var precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;
150
+ // 如果不是数字字符串,则返回原值
151
+ if (!/^-?\d+(\.\d+)?$/.test(value)) {
152
+ return value;
153
+ }
154
+
155
+ // 如果不需要格式化精度,直接返回
156
+ if (precision < 0) return value;
157
+
158
+ // 分离整数和小数部分
159
+ var parts = value.split('.');
160
+ var intPart = parts[0];
161
+ var decimalPart = parts[1] || '';
162
+
163
+ // 截断或补零
164
+ if (decimalPart.length > precision) {
165
+ // 需要四舍五入
166
+ if (precision < decimalPart.length && parseInt(decimalPart[precision], 10) >= 5) {
167
+ // 手动实现字符串层面的四舍五入
168
+ return roundString("".concat(intPart, ".").concat(decimalPart), precision);
169
+ }
170
+ return intPart + (precision > 0 ? ".".concat(decimalPart.slice(0, precision)) : '');
171
+ }
172
+ return intPart + (precision > 0 ? ".".concat(decimalPart.padEnd(precision, '0')) : '');
173
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sheinx/hooks",
3
- "version": "3.8.0-beta.3",
3
+ "version": "3.8.0-beta.4",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "license": "MIT",