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.
@@ -1,10 +1,19 @@
1
1
  import React from 'react';
2
2
  import type { TransformNumberOptions } from '../utils/transformNumber';
3
- interface PersianNumberInputProps extends TransformNumberOptions, Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'value'> {
4
- onValueChange?: (value: string | undefined) => void;
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":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGvE,UAAU,uBACN,SAAQ,sBAAsB,EAC9B,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;IAEvE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IACpD,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,QAAA,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAiDzD,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
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, maxDecimals, showZero, onValueChange, min, max } = _a,
20
- // بقیه پراپ ها (مثل className, style, placeholder, id و ...) به input اصلی منتقل می شوند
21
- restInputProps = __rest(_a, ["initialValue", "separatorCount", "separatorChar", "locale", "maxDecimals", "showZero", "onValueChange", "min", "max"]);
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, onChange, rawValue, // می توانید rawValue را هم برگردانید اگر لازم است
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" // یا "tel" هم گاهی استفاده می شود
43
- , inputMode: "decimal", dir: "ltr" // معمولا برای اعداد بهتر است
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":";;;;;;;;;;;;;;AACA,0EAAuE;AAcvE,MAAM,kBAAkB,GAAsC,CAAC,EAa9D,EAAE,EAAE;QAb0D;IAC3D,+CAA+C;IAC/C,YAAY,EACZ,cAAc,EACd,aAAa,EACb,MAAM,EACN,WAAW,EACX,QAAQ,EACR,aAAa,EACb,GAAG,EACH,GAAG,OAGN;IAFG,yFAAyF;IACtF,cAAc,cAZ0C,uHAa9D,CADoB;IAEjB,qBAAqB;IACrB,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;IAClD,CAAC;IAED,MAAM,EACF,KAAK,EAAE,cAAc,EACrB,QAAQ,EACR,QAAQ,EAAE,kDAAkD;MAC/D,GAAG,IAAA,6CAAqB,EAAC;QACtB,YAAY;QACZ,cAAc;QACd,aAAa;QACb,MAAM;QACN,WAAW;QACX,QAAQ;QACR,aAAa;QACb,GAAG;QACH,GAAG;KACN,CAAC,CAAC;IAEH,OAAO,CACH,gDACI,IAAI,EAAC,MAAM,CAAC,kCAAkC;UAC9C,SAAS,EAAC,SAAS,EACnB,GAAG,EAAC,KAAK,CAAC,6BAA6B;QACnC,cAAc,IAClB,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,QAAQ,IACpB,CACL,CAAC;AACN,CAAC,CAAC;AAEF,kBAAe,kBAAkB,CAAC"}
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, maxDecimals, showZero, onValueChange, min, max, }?: UsePersianNumberInputProps) => UsePersianNumberInputReturn;
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,KAAyC,MAAM,OAAO,CAAC;AAE9D,OAAO,EAAmB,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGnF,UAAU,0BAA2B,SAAQ,sBAAsB;IACjE,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;CACd;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;AAWD,eAAO,MAAM,qBAAqB,GAAI,2GAUnC,0BAA+B,KAAG,2BA4FpC,CAAC"}
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
- // اگر maxDecimals تعریف نشده باشد، اعشار حفظ می‌شود
13
- const roundToDecimals = (value, maxDecimals) => {
14
- if (!value || !value.includes('.') || maxDecimals == null)
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(initialValue));
28
- sanitized = roundToDecimals(sanitized, maxDecimals);
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
- if ((min !== undefined && numericValue.lt(min)) ||
33
- (max !== undefined && numericValue.gt(max))) {
34
- return undefined;
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
- console.warn(`Invalid initial value: ${sanitized}`, error);
39
- return undefined;
44
+ // اگر در تبدیل به Decimal خطا رخ داد (مثلا برای مقادیر بینابینی نامعتبر)
45
+ console.warn(`Error processing sanitized value: ${sanitized}`, error);
46
+ return undefined; // مقدار نامعتبر است
40
47
  }
41
48
  }
42
- if (parseFloat(sanitized) === 0 && !showZero && sanitized !== '0') {
49
+ else {
50
+ // اگر sanitizeNumericInput رشته خالی برگرداند
43
51
  return undefined;
44
52
  }
45
- return sanitized || undefined;
46
- });
47
- const displayValue = (0, react_1.useMemo)(() => {
48
- const options = { separatorCount, separatorChar, locale, maxDecimals, showZero };
49
- if (rawValue === undefined) {
50
- return showZero ? (0, transformNumber_1.transformNumber)('0', options) : '';
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, maxDecimals, showZero]);
85
+ }, [rawValue, separatorCount, separatorChar, locale, showZero, maxDecimals]);
54
86
  const handleChange = (0, react_1.useCallback)((event) => {
55
87
  const inputValue = event.target.value;
56
- let sanitizedValue = (0, digitUtils_1.sanitizeNumericInput)(inputValue);
57
- if (sanitizedValue !== rawValue) {
58
- sanitizedValue = roundToDecimals(sanitizedValue, maxDecimals);
59
- let valueToSet = sanitizedValue;
60
- if (sanitizedValue) {
61
- try {
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
- }, [rawValue, onValueChange, showZero, min, max, maxDecimals]);
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
- if (newValue == null) {
83
- setRawValue(undefined);
84
- if (onValueChange)
85
- onValueChange(undefined);
86
- return;
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
- const valueToSet = parseFloat(sanitizedValue) === 0 && !showZero && sanitizedValue !== '0.'
104
- ? undefined
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":"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"}
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
- * @param numStr قسمت صحیح عدد (فقط ارقام انگلیسی)
36
- * @param separatorCount تعداد ارقام در هر گروه
37
- * @param separatorChar کاراکتر جداکننده
38
- * @returns رشته گروه‌بندی شده
18
+ * پاک‌سازی ورودی عددی.
19
+ * ارقام محلی و جداکننده اعشار محلی (٫) و جداکننده دلخواه ورودی را به انگلیسی تبدیل می‌کند.
20
+ * کاراکترهای غیرمجاز را حذف می‌کند.
21
+ * فقط یک نقطه اعشار و یک علامت منفی در ابتدا را مجاز می‌داند.
22
+ *
23
+ * @param value رشته ورودی
24
+ * @param inputDecimalSeparator کاراکتر جداکننده اعشار که کاربر در ورودی استفاده می‌کند (پیش‌فرض '.')
25
+ * @returns رشته پاک‌شده با ارقام انگلیسی و نقطه استاندارد (.). می‌تواند شامل '-' یا '.' یا '-.' باشد.
39
26
  */
40
- export declare const groupDigits: (numStr: string, separatorCount: number, separatorChar?: string) => string;
27
+ export declare const sanitizeNumericInput: (value: string | number | null | undefined, inputDecimalSeparator?: string) => string;
41
28
  /**
42
- * پاک‌سازی ورودی عددی برای اجازه دادن به کاراکترهای مجاز (اعداد، نقطه و منفی).
43
- * این نسخه جدید: ارقام فارسی و جداکننده اعشار فارسی را هم پشتیبانی می‌کند.
44
- * @param value - رشته ورودی
45
- * @returns رشته پاک‌شده
29
+ * گرد کردن یا محدود کردن تعداد ارقام اعشار یک رشته عددی (انگلیسی).
30
+ * مهم: این تابع نقطه انتهایی را حفظ می‌کند اگر ورودی با نقطه تمام شود و maxDecimals صفر نباشد.
31
+ * @param value رشته عددی با ارقام انگلیسی و نقطه استاندارد.
32
+ * @param maxDecimals حداکثر تعداد اعشار مجاز (undefined یعنی بدون محدودیت).
33
+ * @returns رشته گرد شده یا محدود شده.
46
34
  */
47
- export declare const sanitizeNumericInput: (value: string) => string;
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;AAgBF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GAAI,KAAK,MAAM,KAAG,MAGpD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,EAAE,QAAQ,MAAM,OAAO,SAAS,KAAG,MAIlF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,GAAI,QAAQ,MAAM,EAAE,QAAQ,MAAM,OAAO,mBAAmB,KAAG,MAInG,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GACtB,QAAQ,MAAM,EACd,gBAAgB,MAAM,EACtB,sBAAmB,KAClB,MAMF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAAI,OAAO,MAAM,KAAG,MAgCpD,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"}
@@ -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
- // in: ["", "", "", "", "", "", "", "", "", ""],
11
+ // ar: ["٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"],
12
12
  };
13
13
  /**
14
- * نقشه جداکننده اعشار برای زبان‌های مختلف.
14
+ * نقشه جداکننده اعشار برای زبان‌های مختلف (برای نمایش خروجی).
15
15
  */
16
16
  exports.decimalSeparatorMap = {
17
17
  fa: "٫",
18
- // en: ".",
18
+ // en: ".", // انگلیسی معمولا نقطه است
19
19
  };
20
- // همه ارقام محلی را به یک رشته واحد می‌چسبانیم تا regex بسازیم
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
- * @param value - رشته ورودی
87
- * @returns رشته پاک‌شده
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
- return sanitized;
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":"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"}
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 input عدد یا رشته ورودی. می تواند شامل ارقام محلی یا انگلیسی باشد.
12
+ * @param rawValue رشته عددی خام (مثلا "1234.5", "15.", "-0.1", "-", ".") یا undefined.
17
13
  * @param options تنظیمات قالب بندی.
18
- * @returns رشته قالب بندی شده یا رشته خالی اگر ورودی نامعتبر یا صفر (و showZero=false) باشد.
14
+ * @returns رشته قالب بندی شده برای نمایش.
19
15
  */
20
- export declare const transformNumber: (input: number | string | null | undefined, options?: TransformNumberOptions) => string;
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":"AASA,MAAM,WAAW,sBAAsB;IACrC,iFAAiF;IACjF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;IAC9B,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAC1B,OAAO,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EACzC,UAAU,sBAAsB,KAC/B,MA6EF,CAAC"}
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 input عدد یا رشته ورودی. می تواند شامل ارقام محلی یا انگلیسی باشد.
14
+ * @param rawValue رشته عددی خام (مثلا "1234.5", "15.", "-0.1", "-", ".") یا undefined.
10
15
  * @param options تنظیمات قالب بندی.
11
- * @returns رشته قالب بندی شده یا رشته خالی اگر ورودی نامعتبر یا صفر (و showZero=false) باشد.
16
+ * @returns رشته قالب بندی شده برای نمایش.
12
17
  */
13
- const transformNumber = (input, options) => {
14
- const { separatorCount = 3, // پیش فرض 3 برای هزارگان
15
- separatorChar = ',', locale = 'fa', maxDecimals = 0, showZero = false, // به طور پیش فرض صفر نمایش داده نشود مگر اینکه صریحا خواسته شود
16
- } = options || {};
17
- if (input === null || input === undefined || input === "") {
18
- return showZero ? (0, digitUtils_1.toLocalizedDigits)("0", locale) : ""; // اگر ورودی خالی است و showZero=false، خالی برگردان
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
- // تبدیل رشته خالی یا فقط "-" به صفر اگر showZero فعال باشد
33
- if ((str === "" || str === "-") && showZero) {
34
- str = "0";
27
+ // 2. مدیریت حالت‌های خاص که ممکن است rawValue باشند
28
+ if (rawValue === "-") {
29
+ // اگر فقط منفی است، و showZero فعال است، شاید بهتر باشد "-0" نمایش دهیم؟
30
+ // فعلا خود "-" را برمی‌گردانیم یا اگر showZero=false خالی؟ سازگاری مهم است.
31
+ // اجازه دهید نمایش "-" را بدهیم.
32
+ return "-"; // یا بر اساس showZero تصمیم بگیرید
35
33
  }
36
- else if (str === "" || str === "-") {
37
- return ""; // اگر ورودی فقط "-" بود یا خالی شد، خالی برگردان
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
- if (str === ".") {
41
- return showZero ? (0, digitUtils_1.toLocalizedDigits)("0", locale) : "۰"; // یا شاید "۰." ؟ تصمیم با شماست. نمایش صفر منطقی تر است.
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
- // 3. محدود کردن تعداد ارقام اعشار
44
- let [integerPart, fractionalPart] = str.split('.');
45
- integerPart = integerPart || "0"; // اگر ورودی مثل ".5" بود
46
- if (fractionalPart !== undefined) {
47
- if (maxDecimals > 0) {
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
- else {
53
- // اگر maxDecimals صفر است، قسمت اعشار را حذف کن
54
- str = integerPart;
57
+ }
58
+ catch ( /* خطا در تبدیل به Decimal نادیده گرفته شود */_a) { /* خطا در تبدیل به Decimal نادیده گرفته شود */ }
59
+ if (isEffectivelyZero && !showZero) {
60
+ // اگر مقدار صفر است و نباید نمایش داده شود
61
+ // مگر اینکه کاربر در حال تایپ نقطه بعد از صفر باشد (مثل '0.')
62
+ if (!rawValue.endsWith('.')) {
63
+ return "";
55
64
  }
56
65
  }
57
- else {
58
- str = integerPart; // قسمت اعشاری وجود نداشت
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
- // 4. جداسازی ارقام قسمت صحیح
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
- // 6.1 جایگزینی جداکننده اعشار انگلیسی با محلی (قبل از تبدیل ارقام)
92
+ // اول جداکننده نقطه را به محلی تبدیل کن
70
93
  finalStr = (0, digitUtils_1.localizeDecimalSeparator)(finalStr, locale);
71
- // 6.2 تبدیل ارقام انگلیسی به محلی
72
- finalStr = (0, digitUtils_1.toLocalizedDigits)(finalStr, locale); // cast لازم است چون locale ممکن است string باشد
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":"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"}
1
+ {"version":3,"file":"transformNumber.js","sourceRoot":"","sources":["../../src/utils/transformNumber.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "persian-number-input",
3
- "version": "4.0.5",
3
+ "version": "4.0.7",
4
4
  "description": "React component for Persian, Indic, or English localized number input with customizable digit grouping",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",