persian-number-input 4.0.5 → 4.0.7
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/components/PersianNumberInput.d.ts +11 -2
- package/dist/components/PersianNumberInput.d.ts.map +1 -1
- package/dist/components/PersianNumberInput.js +16 -10
- package/dist/components/PersianNumberInput.js.map +1 -1
- package/dist/hooks/usePersianNumberInput.d.ts +4 -2
- package/dist/hooks/usePersianNumberInput.d.ts.map +1 -1
- package/dist/hooks/usePersianNumberInput.js +81 -79
- package/dist/hooks/usePersianNumberInput.js.map +1 -1
- package/dist/utils/digitUtils.d.ts +17 -29
- package/dist/utils/digitUtils.d.ts.map +1 -1
- package/dist/utils/digitUtils.js +139 -61
- package/dist/utils/digitUtils.js.map +1 -1
- package/dist/utils/transformNumber.d.ts +6 -9
- package/dist/utils/transformNumber.d.ts.map +1 -1
- package/dist/utils/transformNumber.js +75 -52
- package/dist/utils/transformNumber.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { TransformNumberOptions } from '../utils/transformNumber';
|
|
3
|
-
interface PersianNumberInputProps extends
|
|
4
|
-
|
|
3
|
+
interface PersianNumberInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'value' | 'min' | 'max'>, // min/max از نوع input حذف شد چون خودمان هندل میکنیم
|
|
4
|
+
Omit<TransformNumberOptions, 'maxDecimals'> {
|
|
5
|
+
/** مقدار اولیه */
|
|
5
6
|
initialValue?: number | string;
|
|
7
|
+
/** تابعی که با تغییر مقدار خام (انگلیسی و بدون فرمت) فراخوانی میشود */
|
|
8
|
+
onValueChange?: (value: string | undefined) => void;
|
|
9
|
+
/** حداقل مقدار مجاز (اعشار پشتیبانی میشود) */
|
|
6
10
|
min?: number;
|
|
11
|
+
/** حداکثر مقدار مجاز (اعشار پشتیبانی میشود) */
|
|
7
12
|
max?: number;
|
|
13
|
+
/** حداکثر تعداد ارقام اعشار مجاز (undefined یعنی نامحدود) */
|
|
14
|
+
maxDecimals?: number;
|
|
15
|
+
/** کاراکتری که کاربر برای وارد کردن اعشار استفاده میکند (پیشفرض '.') */
|
|
16
|
+
inputDecimalSeparator?: string;
|
|
8
17
|
}
|
|
9
18
|
declare const PersianNumberInput: React.FC<PersianNumberInputProps>;
|
|
10
19
|
export default PersianNumberInput;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PersianNumberInput.d.ts","sourceRoot":"","sources":["../../src/components/PersianNumberInput.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PersianNumberInput.d.ts","sourceRoot":"","sources":["../../src/components/PersianNumberInput.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGvE,UAAU,uBACN,SAAQ,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,CAAC,EAAE,sDAAsD;AACvJ,IAAI,CAAC,sBAAsB,EAAE,aAAa,CAAC;IAE3C,kBAAkB;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,wEAAwE;IACxE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IACpD,+CAA+C;IAC/C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,QAAA,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAqDzD,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -15,32 +15,38 @@ const jsx_runtime_1 = require("react/jsx-runtime");
|
|
|
15
15
|
const usePersianNumberInput_1 = require("../hooks/usePersianNumberInput");
|
|
16
16
|
const PersianNumberInput = (_a) => {
|
|
17
17
|
var {
|
|
18
|
-
// جدا کردن آپشن های هوک از بقیه پراپ های input
|
|
19
|
-
initialValue, separatorCount, separatorChar, locale,
|
|
20
|
-
// بقیه پراپ ها (مثل className, style, placeholder, id و ...) به input اصلی منتقل می شوند
|
|
21
|
-
restInputProps = __rest(_a, ["initialValue", "separatorCount", "separatorChar", "locale", "
|
|
22
|
-
// اعتبارسنجی پراپها
|
|
18
|
+
// جدا کردن آپشن های هوک و نمایش از بقیه پراپ های input
|
|
19
|
+
initialValue, separatorCount, separatorChar, locale, showZero, onValueChange, min, max, maxDecimals, inputDecimalSeparator } = _a, // پراپ جدید
|
|
20
|
+
// بقیه پراپ ها (مثل className, style, placeholder, id, disabled و ...) به input اصلی منتقل می شوند
|
|
21
|
+
restInputProps = __rest(_a, ["initialValue", "separatorCount", "separatorChar", "locale", "showZero", "onValueChange", "min", "max", "maxDecimals", "inputDecimalSeparator"]);
|
|
22
|
+
// اعتبارسنجی پراپها (اختیاری ولی خوب)
|
|
23
23
|
if (maxDecimals !== undefined && maxDecimals < 0) {
|
|
24
24
|
console.warn('maxDecimals باید غیرمنفی باشد');
|
|
25
25
|
maxDecimals = 0;
|
|
26
26
|
}
|
|
27
27
|
if (min !== undefined && max !== undefined && min > max) {
|
|
28
28
|
console.warn('min نباید بزرگتر از max باشد');
|
|
29
|
+
// شاید بهتر باشد یکی را نادیده گرفت یا خطا داد؟ فعلا فقط هشدار.
|
|
29
30
|
}
|
|
30
|
-
const { value: formattedValue,
|
|
31
|
+
const { value: formattedValue, // مقدار فرمت شده برای نمایش
|
|
32
|
+
onChange, // تابع onChange برای input
|
|
33
|
+
// setValue, // اگر نیاز به تنظیم مقدار از بیرون دارید
|
|
34
|
+
// rawValue, // مقدار خام انگلیسی بدون فرمت (اگر لازم دارید)
|
|
31
35
|
} = (0, usePersianNumberInput_1.usePersianNumberInput)({
|
|
32
36
|
initialValue,
|
|
33
37
|
separatorCount,
|
|
34
38
|
separatorChar,
|
|
35
39
|
locale,
|
|
36
|
-
maxDecimals,
|
|
37
40
|
showZero,
|
|
38
41
|
onValueChange,
|
|
39
42
|
min,
|
|
40
|
-
max
|
|
43
|
+
max,
|
|
44
|
+
maxDecimals,
|
|
45
|
+
inputDecimalSeparator, // پاس دادن پراپ جدید به هوک
|
|
41
46
|
});
|
|
42
|
-
return ((0, jsx_runtime_1.jsx)("input", Object.assign({ type: "text" //
|
|
43
|
-
, inputMode: "decimal"
|
|
47
|
+
return ((0, jsx_runtime_1.jsx)("input", Object.assign({ type: "text" // استفاده از text به جای number برای کنترل کامل فرمت
|
|
48
|
+
, inputMode: "decimal" // کیبورد مناسب در موبایل را نشان میدهد
|
|
49
|
+
, dir: "ltr" // برای اعداد معمولا ltr بهتر است، حتی در متن فارسی
|
|
44
50
|
}, restInputProps, { value: formattedValue, onChange: onChange })));
|
|
45
51
|
};
|
|
46
52
|
exports.default = PersianNumberInput;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PersianNumberInput.js","sourceRoot":"","sources":["../../src/components/PersianNumberInput.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"PersianNumberInput.js","sourceRoot":"","sources":["../../src/components/PersianNumberInput.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;AAEA,0EAAuE;AAuBvE,MAAM,kBAAkB,GAAsC,CAAC,EAc9D,EAAE,EAAE;QAd0D;IAC3D,uDAAuD;IACvD,YAAY,EACZ,cAAc,EACd,aAAa,EACb,MAAM,EACN,QAAQ,EACR,aAAa,EACb,GAAG,EACH,GAAG,EACH,WAAW,EACX,qBAAqB,OAGxB,EAH0B,YAAY;IACnC,mGAAmG;IAChG,cAAc,cAb0C,gJAc9D,CADoB;IAEjB,uCAAuC;IACvC,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC9C,WAAW,GAAG,CAAC,CAAC;IACpB,CAAC;IACD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC9C,gEAAgE;IACpE,CAAC;IAED,MAAM,EACF,KAAK,EAAE,cAAc,EAAE,4BAA4B;IACnD,QAAQ,EAAc,2BAA2B;IACjD,+DAA+D;IAC/D,qEAAqE;MACxE,GAAG,IAAA,6CAAqB,EAAC;QACtB,YAAY;QACZ,cAAc;QACd,aAAa;QACb,MAAM;QACN,QAAQ;QACR,aAAa;QACb,GAAG;QACH,GAAG;QACH,WAAW;QACX,qBAAqB,EAAE,4BAA4B;KACtD,CAAC,CAAC;IAEH,OAAO,CACH,gDACI,IAAI,EAAC,MAAM,CAAC,qDAAqD;UACjE,SAAS,EAAC,SAAS,CAAC,wCAAwC;UAC5D,GAAG,EAAC,KAAK,CAAC,mDAAmD;QACzD,cAAc,IAClB,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,QAAQ,IACpB,CACL,CAAC;AACN,CAAC,CAAC;AAEF,kBAAe,kBAAkB,CAAC"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { TransformNumberOptions } from '../utils/transformNumber';
|
|
3
|
-
interface UsePersianNumberInputProps extends TransformNumberOptions {
|
|
3
|
+
interface UsePersianNumberInputProps extends Omit<TransformNumberOptions, 'maxDecimals'> {
|
|
4
4
|
initialValue?: number | string;
|
|
5
5
|
onValueChange?: (value: string | undefined) => void;
|
|
6
6
|
min?: number;
|
|
7
7
|
max?: number;
|
|
8
|
+
maxDecimals?: number;
|
|
9
|
+
inputDecimalSeparator?: string;
|
|
8
10
|
}
|
|
9
11
|
interface UsePersianNumberInputReturn {
|
|
10
12
|
value: string;
|
|
@@ -12,6 +14,6 @@ interface UsePersianNumberInputReturn {
|
|
|
12
14
|
setValue: (newValue: number | string | undefined) => void;
|
|
13
15
|
rawValue: string | undefined;
|
|
14
16
|
}
|
|
15
|
-
export declare const usePersianNumberInput: ({ initialValue, separatorCount, separatorChar, locale,
|
|
17
|
+
export declare const usePersianNumberInput: ({ initialValue, separatorCount, separatorChar, locale, showZero, onValueChange, min, max, maxDecimals, inputDecimalSeparator, }?: UsePersianNumberInputProps) => UsePersianNumberInputReturn;
|
|
16
18
|
export {};
|
|
17
19
|
//# sourceMappingURL=usePersianNumberInput.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePersianNumberInput.d.ts","sourceRoot":"","sources":["../../src/hooks/usePersianNumberInput.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"usePersianNumberInput.d.ts","sourceRoot":"","sources":["../../src/hooks/usePersianNumberInput.ts"],"names":[],"mappings":"AACA,OAAO,KAAoD,MAAM,OAAO,CAAC;AAEzE,OAAO,EAAmB,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGnF,UAAU,0BAA2B,SAAQ,IAAI,CAAC,sBAAsB,EAAE,aAAa,CAAC;IACtF,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IACpD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,UAAU,2BAA2B;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IAC/D,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAC1D,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,eAAO,MAAM,qBAAqB,GAAI,kIAWnC,0BAA+B,KAAG,2BAoHpC,CAAC"}
|
|
@@ -9,104 +9,106 @@ const react_1 = require("react");
|
|
|
9
9
|
const decimal_js_1 = __importDefault(require("decimal.js"));
|
|
10
10
|
const transformNumber_1 = require("../utils/transformNumber");
|
|
11
11
|
const digitUtils_1 = require("../utils/digitUtils");
|
|
12
|
-
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
return value;
|
|
16
|
-
const [integerPart, fractionalPart] = value.split('.');
|
|
17
|
-
if (maxDecimals === 0)
|
|
18
|
-
return integerPart;
|
|
19
|
-
const trimmedFractional = fractionalPart.slice(0, maxDecimals);
|
|
20
|
-
return trimmedFractional ? `${integerPart}.${trimmedFractional}` : integerPart;
|
|
21
|
-
};
|
|
22
|
-
const usePersianNumberInput = ({ initialValue, separatorCount = 3, separatorChar = ',', locale = 'fa', maxDecimals, // undefined یعنی نامحدود
|
|
23
|
-
showZero = false, onValueChange, min, max, } = {}) => {
|
|
24
|
-
const [rawValue, setRawValue] = (0, react_1.useState)(() => {
|
|
25
|
-
if (initialValue == null)
|
|
12
|
+
const usePersianNumberInput = ({ initialValue, separatorCount = 3, separatorChar = ',', locale = 'fa', showZero = false, onValueChange, min, max, maxDecimals, inputDecimalSeparator = '.', } = {}) => {
|
|
13
|
+
const getSanitizedAndRoundedValue = (0, react_1.useCallback)((val) => {
|
|
14
|
+
if (val === null || val === undefined)
|
|
26
15
|
return undefined;
|
|
27
|
-
let sanitized = (0, digitUtils_1.sanitizeNumericInput)(String(
|
|
28
|
-
|
|
29
|
-
if (sanitized) {
|
|
16
|
+
let sanitized = (0, digitUtils_1.sanitizeNumericInput)(String(val), inputDecimalSeparator);
|
|
17
|
+
// مقادیر بینابینی '-', '.', '-.' را فعلا نگه دار
|
|
18
|
+
if (sanitized === '-' || sanitized === '.' || sanitized === '-.') {
|
|
19
|
+
// این مقادیر نباید به عنوان مقدار نهایی باقی بمانند اگر showZero=false
|
|
20
|
+
// در انتها بررسی میشود
|
|
21
|
+
}
|
|
22
|
+
else if (sanitized) { // اگر رشته خالی یا فقط بینابینی نیست
|
|
30
23
|
try {
|
|
31
24
|
const numericValue = new decimal_js_1.default(sanitized);
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
25
|
+
// ****** اصلاح مشکل ۲: Clamp کردن مقدار ******
|
|
26
|
+
if (min !== undefined && numericValue.lt(min)) {
|
|
27
|
+
console.warn(`Value ${sanitized} is less than min ${min}. Clamping to min.`);
|
|
28
|
+
// مقدار را به min محدود کن: min را به رشته تبدیل، sanitize و round کن
|
|
29
|
+
const minStr = (0, digitUtils_1.sanitizeNumericInput)(String(min), '.'); // min را با نقطه استاندارد sanitize کن
|
|
30
|
+
sanitized = (0, digitUtils_1.roundToDecimals)(minStr, maxDecimals);
|
|
31
|
+
}
|
|
32
|
+
else if (max !== undefined && numericValue.gt(max)) {
|
|
33
|
+
console.warn(`Value ${sanitized} exceeds max ${max}. Clamping to max.`);
|
|
34
|
+
// مقدار را به max محدود کن: max را به رشته تبدیل، sanitize و round کن
|
|
35
|
+
const maxStr = (0, digitUtils_1.sanitizeNumericInput)(String(max), '.'); // max را با نقطه استاندارد sanitize کن
|
|
36
|
+
sanitized = (0, digitUtils_1.roundToDecimals)(maxStr, maxDecimals);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
// اگر در محدوده بود، فقط مقدار اصلی sanitize شده را گرد کن
|
|
40
|
+
sanitized = (0, digitUtils_1.roundToDecimals)(sanitized, maxDecimals);
|
|
35
41
|
}
|
|
36
42
|
}
|
|
37
43
|
catch (error) {
|
|
38
|
-
|
|
39
|
-
|
|
44
|
+
// اگر در تبدیل به Decimal خطا رخ داد (مثلا برای مقادیر بینابینی نامعتبر)
|
|
45
|
+
console.warn(`Error processing sanitized value: ${sanitized}`, error);
|
|
46
|
+
return undefined; // مقدار نامعتبر است
|
|
40
47
|
}
|
|
41
48
|
}
|
|
42
|
-
|
|
49
|
+
else {
|
|
50
|
+
// اگر sanitizeNumericInput رشته خالی برگرداند
|
|
43
51
|
return undefined;
|
|
44
52
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
53
|
+
// مدیریت showZero برای مقدار نهایی (بعد از clamp و round)
|
|
54
|
+
if (!showZero) {
|
|
55
|
+
// اگر مقادیر بینابینی هستند، آنها را به undefined تبدیل کن
|
|
56
|
+
if (sanitized === '-' || sanitized === '.' || sanitized === '-.') {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
// اگر مقدار عددی صفر است (و صرفا نقطه انتهایی ندارد)
|
|
60
|
+
try {
|
|
61
|
+
if (sanitized && new decimal_js_1.default(sanitized).isZero() && !sanitized.endsWith('.')) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch ( /* نادیده گرفتن خطا */_a) { /* نادیده گرفتن خطا */ }
|
|
66
|
+
}
|
|
67
|
+
// در نهایت، اگر رشته خالی شده، undefined برگردان
|
|
68
|
+
return sanitized === '' ? undefined : sanitized;
|
|
69
|
+
}, [inputDecimalSeparator, min, max, maxDecimals, showZero]);
|
|
70
|
+
const [rawValue, setRawValue] = (0, react_1.useState)(() => getSanitizedAndRoundedValue(initialValue));
|
|
71
|
+
(0, react_1.useEffect)(() => {
|
|
72
|
+
// فقط اگر initialValue واقعا تغییر کرده، rawValue را آپدیت کن
|
|
73
|
+
// این از بازنشانی ناخواسته جلوگیری میکند
|
|
74
|
+
const newSanitized = getSanitizedAndRoundedValue(initialValue);
|
|
75
|
+
// مقایسه دقیق لازم است
|
|
76
|
+
if (newSanitized !== rawValue) {
|
|
77
|
+
// setRawValue(newSanitized); // آیا این لازم است؟ شاید باعث رفتار ناخواسته شود
|
|
51
78
|
}
|
|
79
|
+
// TODO: بررسی دقیق رفتار useEffect با initialValue
|
|
80
|
+
}, [initialValue]); // getSanitizedAndRoundedValue را از وابستگی حذف کردیم تا از لوپ جلوگیری شود
|
|
81
|
+
const displayValue = (0, react_1.useMemo)(() => {
|
|
82
|
+
const options = { separatorCount, separatorChar, locale, showZero, maxDecimals };
|
|
83
|
+
// تابع transformNumber حالا باید بتواند rawValue های مختلف را به درستی نمایش دهد
|
|
52
84
|
return (0, transformNumber_1.transformNumber)(rawValue, options);
|
|
53
|
-
}, [rawValue, separatorCount, separatorChar, locale,
|
|
85
|
+
}, [rawValue, separatorCount, separatorChar, locale, showZero, maxDecimals]);
|
|
54
86
|
const handleChange = (0, react_1.useCallback)((event) => {
|
|
55
87
|
const inputValue = event.target.value;
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
if (
|
|
61
|
-
|
|
62
|
-
const numericValue = new decimal_js_1.default(sanitizedValue);
|
|
63
|
-
if ((min !== undefined && numericValue.lt(min)) ||
|
|
64
|
-
(max !== undefined && numericValue.gt(max))) {
|
|
65
|
-
return; // خارج از محدوده
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
catch (error) {
|
|
69
|
-
console.warn(`Invalid input value: ${sanitizedValue}`, error);
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
if (parseFloat(sanitizedValue) === 0 && !showZero && sanitizedValue !== '0.') {
|
|
74
|
-
valueToSet = undefined;
|
|
88
|
+
const newRawValue = getSanitizedAndRoundedValue(inputValue);
|
|
89
|
+
// فقط اگر مقدار خام جدید با مقدار قبلی متفاوت است، آپدیت کن
|
|
90
|
+
if (newRawValue !== rawValue) {
|
|
91
|
+
setRawValue(newRawValue);
|
|
92
|
+
if (onValueChange) {
|
|
93
|
+
onValueChange(newRawValue);
|
|
75
94
|
}
|
|
76
|
-
setRawValue(valueToSet);
|
|
77
|
-
if (onValueChange)
|
|
78
|
-
onValueChange(valueToSet);
|
|
79
95
|
}
|
|
80
|
-
|
|
96
|
+
// نکته: اگر کاربر کاراکتری وارد کند که باعث clamp شدن شود (مثلا در max)،
|
|
97
|
+
// newRawValue ممکن است با rawValue قبلی *متفاوت* باشد (برابر با max)،
|
|
98
|
+
// ولی با چیزی که کاربر تایپ کرده متفاوت است. input باید آپدیت شود تا مقدار clamp شده را نشان دهد.
|
|
99
|
+
// منطق فعلی این کار را انجام میدهد.
|
|
100
|
+
}, [rawValue, getSanitizedAndRoundedValue, onValueChange] // getSanitizedAndRoundedValue اینجا لازم است
|
|
101
|
+
);
|
|
81
102
|
const handleSetValue = (0, react_1.useCallback)((newValue) => {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
let sanitizedValue = (0, digitUtils_1.sanitizeNumericInput)(String(newValue));
|
|
89
|
-
sanitizedValue = roundToDecimals(sanitizedValue, maxDecimals);
|
|
90
|
-
if (sanitizedValue) {
|
|
91
|
-
try {
|
|
92
|
-
const numericValue = new decimal_js_1.default(sanitizedValue);
|
|
93
|
-
if ((min !== undefined && numericValue.lt(min)) ||
|
|
94
|
-
(max !== undefined && numericValue.gt(max))) {
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
catch (error) {
|
|
99
|
-
console.warn(`Invalid set value: ${sanitizedValue}`, error);
|
|
100
|
-
return;
|
|
103
|
+
const newRawValue = getSanitizedAndRoundedValue(newValue);
|
|
104
|
+
if (newRawValue !== rawValue) {
|
|
105
|
+
setRawValue(newRawValue);
|
|
106
|
+
if (onValueChange) {
|
|
107
|
+
onValueChange(newRawValue);
|
|
101
108
|
}
|
|
102
109
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
: sanitizedValue;
|
|
106
|
-
setRawValue(valueToSet);
|
|
107
|
-
if (onValueChange)
|
|
108
|
-
onValueChange(valueToSet);
|
|
109
|
-
}, [onValueChange, showZero, min, max, maxDecimals]);
|
|
110
|
+
}, [rawValue, getSanitizedAndRoundedValue, onValueChange] // getSanitizedAndRoundedValue اینجا لازم است
|
|
111
|
+
);
|
|
110
112
|
return { value: displayValue, onChange: handleChange, setValue: handleSetValue, rawValue };
|
|
111
113
|
};
|
|
112
114
|
exports.usePersianNumberInput = usePersianNumberInput;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePersianNumberInput.js","sourceRoot":"","sources":["../../src/hooks/usePersianNumberInput.ts"],"names":[],"mappings":";;;;;;AAAA,iCAAiC;AACjC,
|
|
1
|
+
{"version":3,"file":"usePersianNumberInput.js","sourceRoot":"","sources":["../../src/hooks/usePersianNumberInput.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,44 +5,32 @@ export declare const digitsMap: {
|
|
|
5
5
|
[key: string]: ReadonlyArray<string>;
|
|
6
6
|
};
|
|
7
7
|
/**
|
|
8
|
-
* نقشه جداکننده اعشار برای زبانهای
|
|
8
|
+
* نقشه جداکننده اعشار برای زبانهای مختلف (برای نمایش خروجی).
|
|
9
9
|
*/
|
|
10
10
|
export declare const decimalSeparatorMap: {
|
|
11
11
|
[key: string]: string;
|
|
12
12
|
};
|
|
13
|
-
/**
|
|
14
|
-
* تبدیل رشته حاوی ارقام محلی (مانند فارسی) به رشته با ارقام انگلیسی (0-9).
|
|
15
|
-
* @param str رشته ورودی
|
|
16
|
-
* @returns رشته با ارقام انگلیسی
|
|
17
|
-
*/
|
|
18
13
|
export declare const convertToEnglishDigits: (str: string) => string;
|
|
19
|
-
/**
|
|
20
|
-
* تبدیل رشته حاوی ارقام انگلیسی (0-9) به رشته با ارقام محلی.
|
|
21
|
-
* @param numStr رشته با ارقام انگلیسی
|
|
22
|
-
* @param locale کد زبان ('fa', 'in', ...)
|
|
23
|
-
* @returns رشته با ارقام محلی
|
|
24
|
-
*/
|
|
25
14
|
export declare const toLocalizedDigits: (numStr: string, locale: keyof typeof digitsMap) => string;
|
|
26
|
-
/**
|
|
27
|
-
* جایگزینی جداکننده اعشار انگلیسی (.) با جداکننده محلی.
|
|
28
|
-
* @param numStr رشته با ارقام و جداکننده انگلیسی
|
|
29
|
-
* @param locale کد زبان
|
|
30
|
-
* @returns رشته با جداکننده اعشار محلی
|
|
31
|
-
*/
|
|
32
15
|
export declare const localizeDecimalSeparator: (numStr: string, locale: keyof typeof decimalSeparatorMap) => string;
|
|
16
|
+
export declare const groupDigits: (numStr: string, separatorCount: number, separatorChar?: string) => string;
|
|
33
17
|
/**
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
18
|
+
* پاکسازی ورودی عددی.
|
|
19
|
+
* ارقام محلی و جداکننده اعشار محلی (٫) و جداکننده دلخواه ورودی را به انگلیسی تبدیل میکند.
|
|
20
|
+
* کاراکترهای غیرمجاز را حذف میکند.
|
|
21
|
+
* فقط یک نقطه اعشار و یک علامت منفی در ابتدا را مجاز میداند.
|
|
22
|
+
*
|
|
23
|
+
* @param value رشته ورودی
|
|
24
|
+
* @param inputDecimalSeparator کاراکتر جداکننده اعشار که کاربر در ورودی استفاده میکند (پیشفرض '.')
|
|
25
|
+
* @returns رشته پاکشده با ارقام انگلیسی و نقطه استاندارد (.). میتواند شامل '-' یا '.' یا '-.' باشد.
|
|
39
26
|
*/
|
|
40
|
-
export declare const
|
|
27
|
+
export declare const sanitizeNumericInput: (value: string | number | null | undefined, inputDecimalSeparator?: string) => string;
|
|
41
28
|
/**
|
|
42
|
-
*
|
|
43
|
-
* این
|
|
44
|
-
* @param value
|
|
45
|
-
* @
|
|
29
|
+
* گرد کردن یا محدود کردن تعداد ارقام اعشار یک رشته عددی (انگلیسی).
|
|
30
|
+
* مهم: این تابع نقطه انتهایی را حفظ میکند اگر ورودی با نقطه تمام شود و maxDecimals صفر نباشد.
|
|
31
|
+
* @param value رشته عددی با ارقام انگلیسی و نقطه استاندارد.
|
|
32
|
+
* @param maxDecimals حداکثر تعداد اعشار مجاز (undefined یعنی بدون محدودیت).
|
|
33
|
+
* @returns رشته گرد شده یا محدود شده.
|
|
46
34
|
*/
|
|
47
|
-
export declare const
|
|
35
|
+
export declare const roundToDecimals: (value: string, maxDecimals?: number) => string;
|
|
48
36
|
//# sourceMappingURL=digitUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"digitUtils.d.ts","sourceRoot":"","sources":["../../src/utils/digitUtils.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;CAI7D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAGxD,CAAC;
|
|
1
|
+
{"version":3,"file":"digitUtils.d.ts","sourceRoot":"","sources":["../../src/utils/digitUtils.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;CAI7D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAGxD,CAAC;AAYF,eAAO,MAAM,sBAAsB,GAAI,KAAK,MAAM,KAAG,MAGpD,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,EAAE,QAAQ,MAAM,OAAO,SAAS,KAAG,MAIlF,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,QAAQ,MAAM,EAAE,QAAQ,MAAM,OAAO,mBAAmB,KAAG,MAInG,CAAC;AAEF,eAAO,MAAM,WAAW,GACtB,QAAQ,MAAM,EACd,gBAAgB,MAAM,EACtB,sBAAmB,KAClB,MAOF,CAAC;AAGF;;;;;;;;;GASG;AACH,eAAO,MAAM,oBAAoB,GAC7B,OAAO,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EACzC,wBAAuB,MAAY,KACpC,MA2FF,CAAC;AAGF;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,EAAE,cAAc,MAAM,KAAG,MAkCrE,CAAC"}
|
package/dist/utils/digitUtils.js
CHANGED
|
@@ -1,50 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// utils/digitUtils.ts
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.sanitizeNumericInput = exports.groupDigits = exports.localizeDecimalSeparator = exports.toLocalizedDigits = exports.convertToEnglishDigits = exports.decimalSeparatorMap = exports.digitsMap = void 0;
|
|
4
|
+
exports.roundToDecimals = exports.sanitizeNumericInput = exports.groupDigits = exports.localizeDecimalSeparator = exports.toLocalizedDigits = exports.convertToEnglishDigits = exports.decimalSeparatorMap = exports.digitsMap = void 0;
|
|
5
5
|
/**
|
|
6
6
|
* نقشه ارقام محلی برای زبانهای مختلف.
|
|
7
7
|
*/
|
|
8
8
|
exports.digitsMap = {
|
|
9
9
|
fa: ["۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹"],
|
|
10
10
|
// میتوانید زبانهای دیگر را اضافه کنید
|
|
11
|
-
//
|
|
11
|
+
// ar: ["٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"],
|
|
12
12
|
};
|
|
13
13
|
/**
|
|
14
|
-
* نقشه جداکننده اعشار برای زبانهای
|
|
14
|
+
* نقشه جداکننده اعشار برای زبانهای مختلف (برای نمایش خروجی).
|
|
15
15
|
*/
|
|
16
16
|
exports.decimalSeparatorMap = {
|
|
17
17
|
fa: "٫",
|
|
18
|
-
// en: ".",
|
|
18
|
+
// en: ".", // انگلیسی معمولا نقطه است
|
|
19
19
|
};
|
|
20
|
-
//
|
|
20
|
+
// --- توابع کمکی برای تبدیل ارقام ---
|
|
21
21
|
const allLocalizedDigits = Object.values(exports.digitsMap).flat().join("");
|
|
22
|
-
// مپ برای تبدیل رقم محلی به رقم انگلیسی
|
|
23
22
|
const conversionMap = {};
|
|
24
23
|
for (const locale in exports.digitsMap) {
|
|
25
24
|
exports.digitsMap[locale].forEach((digit, index) => {
|
|
26
25
|
conversionMap[digit] = index.toString();
|
|
27
26
|
});
|
|
28
27
|
}
|
|
29
|
-
// Regex برای پیدا کردن تمام ارقام محلی
|
|
30
28
|
const localizedDigitsRegex = new RegExp(`[${allLocalizedDigits}]`, 'g');
|
|
31
|
-
/**
|
|
32
|
-
* تبدیل رشته حاوی ارقام محلی (مانند فارسی) به رشته با ارقام انگلیسی (0-9).
|
|
33
|
-
* @param str رشته ورودی
|
|
34
|
-
* @returns رشته با ارقام انگلیسی
|
|
35
|
-
*/
|
|
36
29
|
const convertToEnglishDigits = (str) => {
|
|
37
30
|
if (!str)
|
|
38
31
|
return "";
|
|
39
32
|
return str.replace(localizedDigitsRegex, (char) => conversionMap[char] || char);
|
|
40
33
|
};
|
|
41
34
|
exports.convertToEnglishDigits = convertToEnglishDigits;
|
|
42
|
-
/**
|
|
43
|
-
* تبدیل رشته حاوی ارقام انگلیسی (0-9) به رشته با ارقام محلی.
|
|
44
|
-
* @param numStr رشته با ارقام انگلیسی
|
|
45
|
-
* @param locale کد زبان ('fa', 'in', ...)
|
|
46
|
-
* @returns رشته با ارقام محلی
|
|
47
|
-
*/
|
|
48
35
|
const toLocalizedDigits = (numStr, locale) => {
|
|
49
36
|
if (!numStr || !exports.digitsMap[locale])
|
|
50
37
|
return numStr;
|
|
@@ -52,66 +39,157 @@ const toLocalizedDigits = (numStr, locale) => {
|
|
|
52
39
|
return numStr.replace(/\d/g, (digit) => localeDigits[parseInt(digit, 10)]);
|
|
53
40
|
};
|
|
54
41
|
exports.toLocalizedDigits = toLocalizedDigits;
|
|
55
|
-
/**
|
|
56
|
-
* جایگزینی جداکننده اعشار انگلیسی (.) با جداکننده محلی.
|
|
57
|
-
* @param numStr رشته با ارقام و جداکننده انگلیسی
|
|
58
|
-
* @param locale کد زبان
|
|
59
|
-
* @returns رشته با جداکننده اعشار محلی
|
|
60
|
-
*/
|
|
61
42
|
const localizeDecimalSeparator = (numStr, locale) => {
|
|
62
43
|
const separator = exports.decimalSeparatorMap[locale];
|
|
63
|
-
if (!separator)
|
|
64
|
-
return numStr;
|
|
44
|
+
if (!separator || !numStr.includes('.'))
|
|
45
|
+
return numStr; // فقط اگر نقطه انگلیسی وجود داشت جایگزین کن
|
|
65
46
|
return numStr.replace('.', separator);
|
|
66
47
|
};
|
|
67
48
|
exports.localizeDecimalSeparator = localizeDecimalSeparator;
|
|
68
|
-
/**
|
|
69
|
-
* گروهبندی ارقام قسمت صحیح یک عدد با استفاده از جداکننده.
|
|
70
|
-
* @param numStr قسمت صحیح عدد (فقط ارقام انگلیسی)
|
|
71
|
-
* @param separatorCount تعداد ارقام در هر گروه
|
|
72
|
-
* @param separatorChar کاراکتر جداکننده
|
|
73
|
-
* @returns رشته گروهبندی شده
|
|
74
|
-
*/
|
|
75
49
|
const groupDigits = (numStr, separatorCount, separatorChar = ',') => {
|
|
76
50
|
if (!numStr || separatorCount <= 0) {
|
|
77
51
|
return numStr;
|
|
78
52
|
}
|
|
53
|
+
// فقط روی قسمت صحیح اعمال شود (اگر فقط قسمت صحیح داده شده)
|
|
79
54
|
const regex = new RegExp(`\\B(?=(\\d{${separatorCount}})+(?!\\d))`, 'g');
|
|
80
55
|
return numStr.replace(regex, separatorChar);
|
|
81
56
|
};
|
|
82
57
|
exports.groupDigits = groupDigits;
|
|
83
58
|
/**
|
|
84
|
-
* پاکسازی ورودی
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
59
|
+
* پاکسازی ورودی عددی.
|
|
60
|
+
* ارقام محلی و جداکننده اعشار محلی (٫) و جداکننده دلخواه ورودی را به انگلیسی تبدیل میکند.
|
|
61
|
+
* کاراکترهای غیرمجاز را حذف میکند.
|
|
62
|
+
* فقط یک نقطه اعشار و یک علامت منفی در ابتدا را مجاز میداند.
|
|
63
|
+
*
|
|
64
|
+
* @param value رشته ورودی
|
|
65
|
+
* @param inputDecimalSeparator کاراکتر جداکننده اعشار که کاربر در ورودی استفاده میکند (پیشفرض '.')
|
|
66
|
+
* @returns رشته پاکشده با ارقام انگلیسی و نقطه استاندارد (.). میتواند شامل '-' یا '.' یا '-.' باشد.
|
|
88
67
|
*/
|
|
89
|
-
const sanitizeNumericInput = (value) => {
|
|
90
|
-
|
|
91
|
-
let normalized = (0, exports.convertToEnglishDigits)(value);
|
|
92
|
-
// ۲) تبدیل جداکننده اعشار فارسی (٫) به نقطه
|
|
93
|
-
normalized = normalized.replace(/٫/g, '.');
|
|
94
|
-
// ۳) حذف کاراکترهای غیرمجاز
|
|
95
|
-
let sanitized = normalized.replace(/[^0-9.\-]/g, '');
|
|
96
|
-
// حذف صفرهای ابتدایی مگر در موارد اعشاری
|
|
97
|
-
if (sanitized.startsWith('0') && !sanitized.startsWith('0.') && sanitized.length > 1) {
|
|
98
|
-
sanitized = sanitized.replace(/^0+/, '');
|
|
99
|
-
}
|
|
100
|
-
// نگهداشتن فقط یک نقطه اعشار
|
|
101
|
-
const parts = sanitized.split('.');
|
|
102
|
-
if (parts.length > 2) {
|
|
103
|
-
sanitized = `${parts[0]}.${parts[1]}`;
|
|
104
|
-
}
|
|
105
|
-
// حذف منفیهای اضافه و اطمینان از جای صحیح آن
|
|
106
|
-
sanitized = sanitized.replace(/-+/g, '-');
|
|
107
|
-
if (sanitized.includes('-') && !sanitized.startsWith('-')) {
|
|
108
|
-
sanitized = sanitized.replace(/-/, '');
|
|
109
|
-
}
|
|
110
|
-
// اگر ورودی خالی یا فقط '-' یا '.' است، خالی برگردان
|
|
111
|
-
if (sanitized === '' || sanitized === '-' || sanitized === '.') {
|
|
68
|
+
const sanitizeNumericInput = (value, inputDecimalSeparator = '.') => {
|
|
69
|
+
if (value === null || value === undefined)
|
|
112
70
|
return '';
|
|
71
|
+
let str = String(value);
|
|
72
|
+
// 1. تبدیل ارقام محلی به انگلیسی
|
|
73
|
+
str = (0, exports.convertToEnglishDigits)(str);
|
|
74
|
+
// 2. تبدیل جداکننده اعشار فارسی (٫) به نقطه استاندارد (.)
|
|
75
|
+
str = str.replace(/٫/g, '.');
|
|
76
|
+
// 3. تبدیل جداکننده اعشار ورودی دلخواه (اگر با نقطه استاندارد فرق دارد) به نقطه استاندارد
|
|
77
|
+
const standardSeparator = '.';
|
|
78
|
+
if (inputDecimalSeparator && inputDecimalSeparator !== standardSeparator) {
|
|
79
|
+
// برای جلوگیری از خطای regex با کاراکترهای خاص، آن را escape میکنیم
|
|
80
|
+
const escapedSeparator = inputDecimalSeparator.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
|
|
81
|
+
const sepRegex = new RegExp(escapedSeparator, 'g');
|
|
82
|
+
str = str.replace(sepRegex, standardSeparator);
|
|
83
|
+
}
|
|
84
|
+
// 4. مدیریت علامت منفی: فقط یک منفی در ابتدا مجاز است
|
|
85
|
+
const negative = str.startsWith('-');
|
|
86
|
+
// تمام کاراکترهای غیر از عدد و نقطه استاندارد را حذف کن (منفی را جداگانه بررسی کردیم)
|
|
87
|
+
str = str.replace(/[^0-9.]/g, '');
|
|
88
|
+
// 5. مدیریت نقطه اعشار: فقط اولین نقطه مجاز است
|
|
89
|
+
const firstDotIndex = str.indexOf(standardSeparator);
|
|
90
|
+
if (firstDotIndex !== -1) {
|
|
91
|
+
const integerPart = str.substring(0, firstDotIndex);
|
|
92
|
+
// قسمت اعشاری شامل همه چیز بعد از نقطه اول است، و نقاط اضافی در آن حذف میشود
|
|
93
|
+
const fractionalPart = str.substring(firstDotIndex + 1).replace(/\./g, '');
|
|
94
|
+
str = `${integerPart}${standardSeparator}${fractionalPart}`;
|
|
95
|
+
}
|
|
96
|
+
// 6. بازگرداندن علامت منفی در صورت لزوم
|
|
97
|
+
// فقط اگر رشته خالی نباشد و فقط نقطه نباشد، منفی را اضافه کن
|
|
98
|
+
if (negative && str !== '' && str !== standardSeparator) {
|
|
99
|
+
str = `-${str}`;
|
|
100
|
+
}
|
|
101
|
+
// 7. مدیریت صفرهای پیشرو در قسمت صحیح (بعد از پردازش منفی و نقطه)
|
|
102
|
+
// مثال: "-005.1" -> "-5.1", "005" -> "5", "0.5" -> "0.5"
|
|
103
|
+
let sign = '';
|
|
104
|
+
let numericPart = str;
|
|
105
|
+
if (str.startsWith('-')) {
|
|
106
|
+
sign = '-';
|
|
107
|
+
numericPart = str.substring(1);
|
|
108
|
+
}
|
|
109
|
+
let [intPart, fracPart] = numericPart.split(standardSeparator);
|
|
110
|
+
if (intPart && intPart.length > 1 && intPart.startsWith('0')) {
|
|
111
|
+
intPart = intPart.replace(/^0+/, '');
|
|
112
|
+
if (intPart === '')
|
|
113
|
+
intPart = '0'; // اگر فقط صفر بود، 0 بماند (مثل 0.5)
|
|
113
114
|
}
|
|
114
|
-
|
|
115
|
+
else if (intPart === '') {
|
|
116
|
+
// اگر رشته با نقطه شروع شود (مثلا ".5")
|
|
117
|
+
if (fracPart !== undefined) {
|
|
118
|
+
intPart = '0';
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// بازسازی رشته نهایی
|
|
122
|
+
if (fracPart !== undefined) {
|
|
123
|
+
str = `${sign}${intPart}${standardSeparator}${fracPart}`;
|
|
124
|
+
}
|
|
125
|
+
else if (intPart !== undefined) {
|
|
126
|
+
str = `${sign}${intPart}`;
|
|
127
|
+
// اگر ورودی اصلی فقط جداکننده بود، خروجی باید '.' باشد
|
|
128
|
+
if (value === inputDecimalSeparator && sign === '') {
|
|
129
|
+
str = '.';
|
|
130
|
+
}
|
|
131
|
+
// اگر ورودی اصلی فقط '-' بود
|
|
132
|
+
if (value === '-' && sign === '-' && intPart === undefined) {
|
|
133
|
+
str = '-';
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
else if (sign === '-' && value === '-') {
|
|
137
|
+
// اگر ورودی فقط '-' بود و پردازشها آن را حذف کردند
|
|
138
|
+
str = '-';
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
// موارد دیگر که ممکن است خالی شوند
|
|
142
|
+
str = '';
|
|
143
|
+
}
|
|
144
|
+
// اجازه دادن به حالتهای بینابینی در تایپ
|
|
145
|
+
if (value === '-')
|
|
146
|
+
return '-';
|
|
147
|
+
if (String(value).endsWith(inputDecimalSeparator) && str === `${sign}${intPart}`) {
|
|
148
|
+
// اگر کاربر جداکننده را تایپ کرده ولی هنوز عددی بعدش نیامده
|
|
149
|
+
return `${str}${standardSeparator}`;
|
|
150
|
+
}
|
|
151
|
+
return str;
|
|
115
152
|
};
|
|
116
153
|
exports.sanitizeNumericInput = sanitizeNumericInput;
|
|
154
|
+
/**
|
|
155
|
+
* گرد کردن یا محدود کردن تعداد ارقام اعشار یک رشته عددی (انگلیسی).
|
|
156
|
+
* مهم: این تابع نقطه انتهایی را حفظ میکند اگر ورودی با نقطه تمام شود و maxDecimals صفر نباشد.
|
|
157
|
+
* @param value رشته عددی با ارقام انگلیسی و نقطه استاندارد.
|
|
158
|
+
* @param maxDecimals حداکثر تعداد اعشار مجاز (undefined یعنی بدون محدودیت).
|
|
159
|
+
* @returns رشته گرد شده یا محدود شده.
|
|
160
|
+
*/
|
|
161
|
+
const roundToDecimals = (value, maxDecimals) => {
|
|
162
|
+
// اگر مقدار نامعتبر، بدون نقطه یا بدون نیاز به گرد کردن است، همان را برگردان
|
|
163
|
+
if (maxDecimals === undefined || !value || !value.includes('.')) {
|
|
164
|
+
return value;
|
|
165
|
+
}
|
|
166
|
+
const standardSeparator = '.';
|
|
167
|
+
const endsWithSeparator = value.endsWith(standardSeparator);
|
|
168
|
+
let [integerPart, fractionalPart = ''] = value.split(standardSeparator);
|
|
169
|
+
// اگر maxDecimals صفر است، قسمت صحیح را برگردان
|
|
170
|
+
if (maxDecimals <= 0) {
|
|
171
|
+
// اگر قسمت صحیح خالی بود (مثلا در حالت '-.')، صفر را برگردان
|
|
172
|
+
return integerPart === '' && value.startsWith('-') ? "-0" : (integerPart || "0");
|
|
173
|
+
// بازگشت بهتر: فقط قسمت صحیح
|
|
174
|
+
return integerPart || "0";
|
|
175
|
+
}
|
|
176
|
+
// قسمت اعشار را به تعداد مجاز کوتاه کن
|
|
177
|
+
const trimmedFractional = fractionalPart.slice(0, maxDecimals);
|
|
178
|
+
// بازسازی رشته
|
|
179
|
+
if (trimmedFractional) {
|
|
180
|
+
return `${integerPart}${standardSeparator}${trimmedFractional}`;
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
// اگر قسمت اعشاری بعد از کوتاه کردن خالی شد
|
|
184
|
+
// اگر ورودی اصلی با نقطه تمام شده بود، نقطه را حفظ کن
|
|
185
|
+
if (endsWithSeparator) {
|
|
186
|
+
return `${integerPart}${standardSeparator}`;
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
// در غیر این صورت فقط قسمت صحیح را برگردان
|
|
190
|
+
return integerPart;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
exports.roundToDecimals = roundToDecimals;
|
|
117
195
|
//# sourceMappingURL=digitUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"digitUtils.js","sourceRoot":"","sources":["../../src/utils/digitUtils.ts"],"names":[],"mappings":";AAAA,sBAAsB;;;AAEtB;;GAEG;AACU,QAAA,SAAS,GAA6C;IACjE,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACtD,wCAAwC;IACxC,0DAA0D;CAC3D,CAAC;AAEF;;GAEG;AACU,QAAA,mBAAmB,GAA8B;IAC5D,EAAE,EAAE,GAAG;IACP,
|
|
1
|
+
{"version":3,"file":"digitUtils.js","sourceRoot":"","sources":["../../src/utils/digitUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +1,18 @@
|
|
|
1
1
|
export interface TransformNumberOptions {
|
|
2
|
-
/** تعداد ارقام در هر گروه برای جداسازی (مثلا 3). 0 یا کمتر یعنی بدون جداسازی. */
|
|
3
2
|
separatorCount?: number;
|
|
4
|
-
/** کاراکتر جداکننده گروه ها (پیش فرض ','). */
|
|
5
3
|
separatorChar?: string;
|
|
6
|
-
/** کد زبان برای نمایش ارقام ('fa', 'en', ...). پیش فرض 'fa'. */
|
|
7
4
|
locale?: 'fa' | 'en' | string;
|
|
8
|
-
/** حداکثر تعداد ارقام اعشار مجاز. 0 یعنی بدون اعشار. */
|
|
9
5
|
maxDecimals?: number;
|
|
10
|
-
/** اگر true باشد، حتی اگر مقدار ورودی 0 باشد، آن را نمایش بده. پیش فرض false */
|
|
11
6
|
showZero?: boolean;
|
|
12
7
|
}
|
|
13
8
|
/**
|
|
14
|
-
*
|
|
9
|
+
* رشته عددی خام (انگلیسی، با نقطه استاندارد) را به فرمت نمایشی تبدیل میکند.
|
|
10
|
+
* فرض میشود ورودی از rawValue هوک آمده و قبلا sanitize و round شده است.
|
|
15
11
|
*
|
|
16
|
-
* @param
|
|
12
|
+
* @param rawValue رشته عددی خام (مثلا "1234.5", "15.", "-0.1", "-", ".") یا undefined.
|
|
17
13
|
* @param options تنظیمات قالب بندی.
|
|
18
|
-
* @returns رشته قالب بندی شده
|
|
14
|
+
* @returns رشته قالب بندی شده برای نمایش.
|
|
19
15
|
*/
|
|
20
|
-
export declare const transformNumber: (
|
|
16
|
+
export declare const transformNumber: (rawValue: string | undefined, // تغییر ورودی به string | undefined برای وضوح
|
|
17
|
+
options?: TransformNumberOptions) => string;
|
|
21
18
|
//# sourceMappingURL=transformNumber.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformNumber.d.ts","sourceRoot":"","sources":["../../src/utils/transformNumber.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transformNumber.d.ts","sourceRoot":"","sources":["../../src/utils/transformNumber.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,sBAAsB;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,GAAG,SAAS,EAAE,8CAA8C;AAC5E,UAAU,sBAAsB,KAC/B,MA8FF,CAAC"}
|
|
@@ -1,75 +1,98 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.transformNumber = void 0;
|
|
4
7
|
// utils/transformNumber.ts
|
|
5
8
|
const digitUtils_1 = require("./digitUtils");
|
|
9
|
+
const decimal_js_1 = __importDefault(require("decimal.js")); // برای بررسی دقیق صفر
|
|
6
10
|
/**
|
|
7
|
-
*
|
|
11
|
+
* رشته عددی خام (انگلیسی، با نقطه استاندارد) را به فرمت نمایشی تبدیل میکند.
|
|
12
|
+
* فرض میشود ورودی از rawValue هوک آمده و قبلا sanitize و round شده است.
|
|
8
13
|
*
|
|
9
|
-
* @param
|
|
14
|
+
* @param rawValue رشته عددی خام (مثلا "1234.5", "15.", "-0.1", "-", ".") یا undefined.
|
|
10
15
|
* @param options تنظیمات قالب بندی.
|
|
11
|
-
* @returns رشته قالب بندی شده
|
|
16
|
+
* @returns رشته قالب بندی شده برای نمایش.
|
|
12
17
|
*/
|
|
13
|
-
const transformNumber = (
|
|
14
|
-
|
|
15
|
-
separatorChar = ',', locale = 'fa', maxDecimals
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
// 1. تبدیل ورودی به رشته و سپس به ارقام انگلیسی و پاکسازی اولیه
|
|
21
|
-
// توجه: در استفاده با input، بهتر است sanitizeNumericInput روی مقدار input *قبل* از پاس دادن به این تابع اجرا شود.
|
|
22
|
-
// اما برای اطمینان، اینجا هم یک تبدیل اولیه انجام می دهیم.
|
|
23
|
-
let str = (0, digitUtils_1.convertToEnglishDigits)(String(input));
|
|
24
|
-
// 2. بررسی اولیه برای معتبر بودن فرمت عددی (اختیاری اما مفید)
|
|
25
|
-
// این regex اجازه یک منفی در ابتدا و یک نقطه اعشار را می دهد.
|
|
26
|
-
if (!/^-?\d*(\.\d*)?$/.test(str)) {
|
|
27
|
-
// اگر فرمت پایه عددی نیست (بعد از تبدیل به انگلیسی)، یا خالی برگردان یا خود ورودی اصلی
|
|
28
|
-
// تصمیم: فعلا خالی بر میگردانیم یا صفر اگر showZero فعال باشد
|
|
29
|
-
console.warn(`Invalid numeric string after conversion: "${str}" from input: "${input}"`);
|
|
18
|
+
const transformNumber = (rawValue, // تغییر ورودی به string | undefined برای وضوح
|
|
19
|
+
options) => {
|
|
20
|
+
const { separatorCount = 3, separatorChar = ',', locale = 'fa', maxDecimals, // ممکن است برای نمایش لازم باشد (اگرچه round در هوک انجام شده)
|
|
21
|
+
showZero = false, } = options || {};
|
|
22
|
+
// 1. مدیریت ورودیهای null/undefined/empty
|
|
23
|
+
if (rawValue === null || rawValue === undefined || rawValue === "") {
|
|
24
|
+
// نکته: تبدیل صفر به لوکال '۰' در صورت نیاز
|
|
30
25
|
return showZero ? (0, digitUtils_1.toLocalizedDigits)("0", locale) : "";
|
|
31
26
|
}
|
|
32
|
-
//
|
|
33
|
-
if (
|
|
34
|
-
|
|
27
|
+
// 2. مدیریت حالتهای خاص که ممکن است rawValue باشند
|
|
28
|
+
if (rawValue === "-") {
|
|
29
|
+
// اگر فقط منفی است، و showZero فعال است، شاید بهتر باشد "-0" نمایش دهیم؟
|
|
30
|
+
// فعلا خود "-" را برمیگردانیم یا اگر showZero=false خالی؟ سازگاری مهم است.
|
|
31
|
+
// اجازه دهید نمایش "-" را بدهیم.
|
|
32
|
+
return "-"; // یا بر اساس showZero تصمیم بگیرید
|
|
35
33
|
}
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
if (rawValue === ".") {
|
|
35
|
+
// نمایش "۰٫" یا فقط "٫" ؟ نمایش "۰٫" خواناتر است.
|
|
36
|
+
const display = showZero ? "0." : ".";
|
|
37
|
+
const localizedDisplay = (0, digitUtils_1.localizeDecimalSeparator)(display, locale);
|
|
38
|
+
return (0, digitUtils_1.toLocalizedDigits)(localizedDisplay, locale);
|
|
38
39
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
if (rawValue === "-.") {
|
|
41
|
+
const display = showZero ? "-0." : "-.";
|
|
42
|
+
const localizedDisplay = (0, digitUtils_1.localizeDecimalSeparator)(display, locale);
|
|
43
|
+
return (0, digitUtils_1.toLocalizedDigits)(localizedDisplay, locale);
|
|
44
|
+
}
|
|
45
|
+
// 3. اطمینان از معتبر بودن فرمت (اختیاری، چون rawValue باید معتبر باشد)
|
|
46
|
+
// این regex نقطه انتهایی را هم قبول میکند
|
|
47
|
+
if (!/^-?\d*(\.\d*)?$/.test(rawValue)) {
|
|
48
|
+
console.warn(`Invalid rawValue passed to transformNumber: "${rawValue}"`);
|
|
49
|
+
return showZero ? (0, digitUtils_1.toLocalizedDigits)("0", locale) : "";
|
|
42
50
|
}
|
|
43
|
-
//
|
|
44
|
-
let
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
fractionalPart = fractionalPart.slice(0, maxDecimals);
|
|
49
|
-
// اگر بعد از بریدن، قسمت اعشاری خالی شد، آن را حذف کن
|
|
50
|
-
str = fractionalPart ? `${integerPart}.${fractionalPart}` : integerPart;
|
|
51
|
+
// 4. بررسی صفر بودن مقدار (با دقت Decimal.js)
|
|
52
|
+
let isEffectivelyZero = false;
|
|
53
|
+
try {
|
|
54
|
+
if (rawValue !== '-' && rawValue !== '.' && rawValue !== '-.') { // از Decimal با این مقادیر جلوگیری کن
|
|
55
|
+
isEffectivelyZero = new decimal_js_1.default(rawValue).isZero();
|
|
51
56
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
57
|
+
}
|
|
58
|
+
catch ( /* خطا در تبدیل به Decimal نادیده گرفته شود */_a) { /* خطا در تبدیل به Decimal نادیده گرفته شود */ }
|
|
59
|
+
if (isEffectivelyZero && !showZero) {
|
|
60
|
+
// اگر مقدار صفر است و نباید نمایش داده شود
|
|
61
|
+
// مگر اینکه کاربر در حال تایپ نقطه بعد از صفر باشد (مثل '0.')
|
|
62
|
+
if (!rawValue.endsWith('.')) {
|
|
63
|
+
return "";
|
|
55
64
|
}
|
|
56
65
|
}
|
|
57
|
-
|
|
58
|
-
|
|
66
|
+
// 5. جدا کردن قسمت صحیح و اعشاری
|
|
67
|
+
// rawValue باید از قبل round شده باشد، پس نیازی به roundToDecimals مجدد نیست.
|
|
68
|
+
let [integerPart, fractionalPart] = rawValue.split('.');
|
|
69
|
+
// بررسی وجود نقطه انتهایی (وقتی fractionalPart بعد از split کردن undefined است ولی نقطه در رشته بود)
|
|
70
|
+
const hasTrailingDot = rawValue.endsWith('.') && fractionalPart === undefined;
|
|
71
|
+
// رسیدگی به حالتهایی مثل ".5" که integerPart خالی است
|
|
72
|
+
if (integerPart === "" || integerPart === "-") {
|
|
73
|
+
// اگر فقط "-" بود یا خالی، با صفر جایگزین کن (اگر قرار است چیزی نمایش داده شود)
|
|
74
|
+
integerPart = rawValue.startsWith('-') ? "-0" : "0";
|
|
75
|
+
}
|
|
76
|
+
// 6. گروهبندی ارقام قسمت صحیح
|
|
77
|
+
const sign = integerPart.startsWith('-') ? '-' : '';
|
|
78
|
+
const absIntPart = integerPart.startsWith('-') ? integerPart.substring(1) : integerPart;
|
|
79
|
+
const groupedAbsInt = (0, digitUtils_1.groupDigits)(absIntPart, separatorCount, separatorChar);
|
|
80
|
+
const groupedInt = sign + groupedAbsInt;
|
|
81
|
+
// 7. بازسازی رشته نهایی (با در نظر گرفتن نقطه انتهایی)
|
|
82
|
+
let finalStr = groupedInt;
|
|
83
|
+
if (fractionalPart !== undefined) { // اگر قسمت اعشاری وجود دارد
|
|
84
|
+
finalStr = `${groupedInt}.${fractionalPart}`;
|
|
85
|
+
}
|
|
86
|
+
else if (hasTrailingDot) { // ****** این قسمت اصلاح شده ******
|
|
87
|
+
// اگر قسمت اعشاری وجود ندارد ولی رشته اصلی با نقطه تمام شده بود
|
|
88
|
+
finalStr = `${groupedInt}.`;
|
|
59
89
|
}
|
|
60
|
-
//
|
|
61
|
-
// دوباره استخراج بخش صحیح و اعشاری چون ممکن است در مرحله 3 تغییر کرده باشد
|
|
62
|
-
[integerPart, fractionalPart] = str.split('.');
|
|
63
|
-
integerPart = integerPart || "0"; // اطمینان مجدد برای حالت "."
|
|
64
|
-
const groupedInt = (0, digitUtils_1.groupDigits)(integerPart, separatorCount, separatorChar);
|
|
65
|
-
// 5. ترکیب مجدد قسمت صحیح و اعشاری (اگر وجود دارد)
|
|
66
|
-
let finalStr = fractionalPart !== undefined ? `${groupedInt}.${fractionalPart}` : groupedInt;
|
|
67
|
-
// 6. محلی سازی (اگر locale انگلیسی نیست)
|
|
90
|
+
// 8. محلی سازی (ارقام و جداکننده اعشار)
|
|
68
91
|
if (locale && locale !== 'en') {
|
|
69
|
-
//
|
|
92
|
+
// اول جداکننده نقطه را به محلی تبدیل کن
|
|
70
93
|
finalStr = (0, digitUtils_1.localizeDecimalSeparator)(finalStr, locale);
|
|
71
|
-
//
|
|
72
|
-
finalStr = (0, digitUtils_1.toLocalizedDigits)(finalStr, locale);
|
|
94
|
+
// سپس ارقام انگلیسی را به محلی تبدیل کن
|
|
95
|
+
finalStr = (0, digitUtils_1.toLocalizedDigits)(finalStr, locale);
|
|
73
96
|
}
|
|
74
97
|
return finalStr;
|
|
75
98
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformNumber.js","sourceRoot":"","sources":["../../src/utils/transformNumber.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transformNumber.js","sourceRoot":"","sources":["../../src/utils/transformNumber.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED