persian-number-input 4.0.7 → 4.0.9
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/LICENSE +21 -0
- package/README.md +389 -389
- package/dist/components/PersianNumberInput.d.ts +4 -12
- package/dist/components/PersianNumberInput.d.ts.map +1 -1
- package/dist/components/PersianNumberInput.js +9 -26
- package/dist/components/PersianNumberInput.js.map +1 -1
- package/dist/hooks/usePersianNumberInput.d.ts +9 -8
- package/dist/hooks/usePersianNumberInput.d.ts.map +1 -1
- package/dist/hooks/usePersianNumberInput.js +71 -93
- package/dist/hooks/usePersianNumberInput.js.map +1 -1
- package/dist/utils/digitUtils.d.ts +6 -32
- package/dist/utils/digitUtils.d.ts.map +1 -1
- package/dist/utils/digitUtils.js +65 -162
- package/dist/utils/digitUtils.js.map +1 -1
- package/dist/utils/transformNumber.d.ts +2 -11
- package/dist/utils/transformNumber.d.ts.map +1 -1
- package/dist/utils/transformNumber.js +16 -81
- package/dist/utils/transformNumber.js.map +1 -1
- package/package.json +48 -52
package/dist/utils/digitUtils.js
CHANGED
|
@@ -1,195 +1,98 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// utils/digitUtils.ts
|
|
3
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.roundToDecimals = exports.sanitizeNumericInput = exports.groupDigits = exports.localizeDecimalSeparator = exports.toLocalizedDigits = exports.convertToEnglishDigits = exports.decimalSeparatorMap = exports.digitsMap = void 0;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
exports.roundToDecimals = exports.sanitizeNumericInput = exports.groupDigits = exports.localizeDecimalSeparator = exports.toLocalizedDigits = exports.convertToEnglishDigits = exports.toEnglishDigits = exports.decimalSeparatorMap = exports.digitsMap = void 0;
|
|
4
|
+
const LOCAL_DIGITS_MAP = {
|
|
5
|
+
"۰": "0",
|
|
6
|
+
"۱": "1",
|
|
7
|
+
"۲": "2",
|
|
8
|
+
"۳": "3",
|
|
9
|
+
"۴": "4",
|
|
10
|
+
"۵": "5",
|
|
11
|
+
"۶": "6",
|
|
12
|
+
"۷": "7",
|
|
13
|
+
"۸": "8",
|
|
14
|
+
"۹": "9",
|
|
15
|
+
"٠": "0",
|
|
16
|
+
"١": "1",
|
|
17
|
+
"٢": "2",
|
|
18
|
+
"٣": "3",
|
|
19
|
+
"٤": "4",
|
|
20
|
+
"٥": "5",
|
|
21
|
+
"٦": "6",
|
|
22
|
+
"٧": "7",
|
|
23
|
+
"٨": "8",
|
|
24
|
+
"٩": "9",
|
|
25
|
+
"٫": ".",
|
|
26
|
+
"/": ".",
|
|
27
|
+
};
|
|
8
28
|
exports.digitsMap = {
|
|
9
29
|
fa: ["۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹"],
|
|
10
|
-
|
|
11
|
-
// ar: ["٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"],
|
|
30
|
+
ar: ["٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"],
|
|
12
31
|
};
|
|
13
|
-
/**
|
|
14
|
-
* نقشه جداکننده اعشار برای زبانهای مختلف (برای نمایش خروجی).
|
|
15
|
-
*/
|
|
16
32
|
exports.decimalSeparatorMap = {
|
|
17
33
|
fa: "٫",
|
|
18
|
-
|
|
34
|
+
ar: "٫",
|
|
19
35
|
};
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const conversionMap = {};
|
|
23
|
-
for (const locale in exports.digitsMap) {
|
|
24
|
-
exports.digitsMap[locale].forEach((digit, index) => {
|
|
25
|
-
conversionMap[digit] = index.toString();
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
const localizedDigitsRegex = new RegExp(`[${allLocalizedDigits}]`, 'g');
|
|
29
|
-
const convertToEnglishDigits = (str) => {
|
|
30
|
-
if (!str)
|
|
31
|
-
return "";
|
|
32
|
-
return str.replace(localizedDigitsRegex, (char) => conversionMap[char] || char);
|
|
36
|
+
const toEnglishDigits = (str) => {
|
|
37
|
+
return str.replace(/[۰-۹٠-٩٫\/]/g, (match) => LOCAL_DIGITS_MAP[match] || match);
|
|
33
38
|
};
|
|
34
|
-
exports.
|
|
39
|
+
exports.toEnglishDigits = toEnglishDigits;
|
|
40
|
+
exports.convertToEnglishDigits = exports.toEnglishDigits;
|
|
35
41
|
const toLocalizedDigits = (numStr, locale) => {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const localeDigits = exports.digitsMap[locale];
|
|
42
|
+
const targetLocale = exports.digitsMap[locale] ? locale : "fa";
|
|
43
|
+
const localeDigits = exports.digitsMap[targetLocale];
|
|
39
44
|
return numStr.replace(/\d/g, (digit) => localeDigits[parseInt(digit, 10)]);
|
|
40
45
|
};
|
|
41
46
|
exports.toLocalizedDigits = toLocalizedDigits;
|
|
42
47
|
const localizeDecimalSeparator = (numStr, locale) => {
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
48
|
+
const targetLocale = exports.decimalSeparatorMap[locale] ? locale : "fa";
|
|
49
|
+
const separator = exports.decimalSeparatorMap[targetLocale];
|
|
50
|
+
if (!separator || !numStr.includes("."))
|
|
51
|
+
return numStr;
|
|
52
|
+
return numStr.replace(".", separator);
|
|
47
53
|
};
|
|
48
54
|
exports.localizeDecimalSeparator = localizeDecimalSeparator;
|
|
49
|
-
const groupDigits = (numStr, separatorCount, separatorChar =
|
|
50
|
-
if (!numStr || separatorCount <= 0)
|
|
55
|
+
const groupDigits = (numStr, separatorCount, separatorChar = ",") => {
|
|
56
|
+
if (!numStr || separatorCount <= 0)
|
|
51
57
|
return numStr;
|
|
52
|
-
}
|
|
53
|
-
// فقط روی قسمت صحیح اعمال شود (اگر فقط قسمت صحیح داده شده)
|
|
54
|
-
const regex = new RegExp(`\\B(?=(\\d{${separatorCount}})+(?!\\d))`, 'g');
|
|
58
|
+
const regex = new RegExp(`\\B(?=(\\d{${separatorCount}})+(?!\\d))`, "g");
|
|
55
59
|
return numStr.replace(regex, separatorChar);
|
|
56
60
|
};
|
|
57
61
|
exports.groupDigits = groupDigits;
|
|
58
|
-
|
|
59
|
-
* پاکسازی ورودی عددی.
|
|
60
|
-
* ارقام محلی و جداکننده اعشار محلی (٫) و جداکننده دلخواه ورودی را به انگلیسی تبدیل میکند.
|
|
61
|
-
* کاراکترهای غیرمجاز را حذف میکند.
|
|
62
|
-
* فقط یک نقطه اعشار و یک علامت منفی در ابتدا را مجاز میداند.
|
|
63
|
-
*
|
|
64
|
-
* @param value رشته ورودی
|
|
65
|
-
* @param inputDecimalSeparator کاراکتر جداکننده اعشار که کاربر در ورودی استفاده میکند (پیشفرض '.')
|
|
66
|
-
* @returns رشته پاکشده با ارقام انگلیسی و نقطه استاندارد (.). میتواند شامل '-' یا '.' یا '-.' باشد.
|
|
67
|
-
*/
|
|
68
|
-
const sanitizeNumericInput = (value, inputDecimalSeparator = '.') => {
|
|
62
|
+
const sanitizeNumericInput = (value, maxDecimals) => {
|
|
69
63
|
if (value === null || value === undefined)
|
|
70
|
-
return
|
|
71
|
-
let str = String(value);
|
|
72
|
-
|
|
73
|
-
str = (0,
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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)
|
|
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
|
-
}
|
|
64
|
+
return "";
|
|
65
|
+
let str = (0, exports.toEnglishDigits)(String(value));
|
|
66
|
+
const isNegative = str.startsWith("-");
|
|
67
|
+
str = str.replace(/[^-0-9.]/g, "");
|
|
68
|
+
const parts = str.split(".");
|
|
69
|
+
if (parts.length > 2) {
|
|
70
|
+
str = parts[0] + "." + parts.slice(1).join("");
|
|
135
71
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
str = '-';
|
|
72
|
+
if (isNegative) {
|
|
73
|
+
str = "-" + str.replace(/-/g, "");
|
|
139
74
|
}
|
|
140
75
|
else {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
76
|
+
str = str.replace(/-/g, "");
|
|
77
|
+
}
|
|
78
|
+
if (str.includes(".")) {
|
|
79
|
+
const [intPart, fracPart] = str.split(".");
|
|
80
|
+
if (maxDecimals !== undefined) {
|
|
81
|
+
const truncatedFrac = maxDecimals > 0 ? fracPart.slice(0, maxDecimals) : "";
|
|
82
|
+
str = truncatedFrac ? `${intPart}.${truncatedFrac}` : intPart;
|
|
83
|
+
if (maxDecimals > 0 && String(value).endsWith(".")) {
|
|
84
|
+
str = str.includes(".") ? str : `${str}.`;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
150
87
|
}
|
|
151
88
|
return str;
|
|
152
89
|
};
|
|
153
90
|
exports.sanitizeNumericInput = sanitizeNumericInput;
|
|
154
|
-
/**
|
|
155
|
-
* گرد کردن یا محدود کردن تعداد ارقام اعشار یک رشته عددی (انگلیسی).
|
|
156
|
-
* مهم: این تابع نقطه انتهایی را حفظ میکند اگر ورودی با نقطه تمام شود و maxDecimals صفر نباشد.
|
|
157
|
-
* @param value رشته عددی با ارقام انگلیسی و نقطه استاندارد.
|
|
158
|
-
* @param maxDecimals حداکثر تعداد اعشار مجاز (undefined یعنی بدون محدودیت).
|
|
159
|
-
* @returns رشته گرد شده یا محدود شده.
|
|
160
|
-
*/
|
|
161
91
|
const roundToDecimals = (value, maxDecimals) => {
|
|
162
|
-
|
|
163
|
-
if (maxDecimals === undefined || !value || !value.includes('.')) {
|
|
92
|
+
if (maxDecimals === undefined || !value || !value.includes("."))
|
|
164
93
|
return value;
|
|
165
|
-
|
|
166
|
-
|
|
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
|
-
}
|
|
94
|
+
const [int, frac] = value.split(".");
|
|
95
|
+
return maxDecimals > 0 ? `${int}.${frac.slice(0, maxDecimals)}` : int;
|
|
193
96
|
};
|
|
194
97
|
exports.roundToDecimals = roundToDecimals;
|
|
195
98
|
//# sourceMappingURL=digitUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"digitUtils.js","sourceRoot":"","sources":["../../src/utils/digitUtils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"digitUtils.js","sourceRoot":"","sources":["../../src/utils/digitUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,9 @@
|
|
|
1
1
|
export interface TransformNumberOptions {
|
|
2
2
|
separatorCount?: number;
|
|
3
3
|
separatorChar?: string;
|
|
4
|
-
locale?:
|
|
4
|
+
locale?: "fa" | "en" | "ar" | string;
|
|
5
5
|
maxDecimals?: number;
|
|
6
6
|
showZero?: boolean;
|
|
7
7
|
}
|
|
8
|
-
|
|
9
|
-
* رشته عددی خام (انگلیسی، با نقطه استاندارد) را به فرمت نمایشی تبدیل میکند.
|
|
10
|
-
* فرض میشود ورودی از rawValue هوک آمده و قبلا sanitize و round شده است.
|
|
11
|
-
*
|
|
12
|
-
* @param rawValue رشته عددی خام (مثلا "1234.5", "15.", "-0.1", "-", ".") یا undefined.
|
|
13
|
-
* @param options تنظیمات قالب بندی.
|
|
14
|
-
* @returns رشته قالب بندی شده برای نمایش.
|
|
15
|
-
*/
|
|
16
|
-
export declare const transformNumber: (rawValue: string | undefined, // تغییر ورودی به string | undefined برای وضوح
|
|
17
|
-
options?: TransformNumberOptions) => string;
|
|
8
|
+
export declare const transformNumber: (rawValue: string | undefined, options?: TransformNumberOptions) => string;
|
|
18
9
|
//# 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":"AAMA,MAAM,WAAW,sBAAsB;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,GAAG,SAAS,EAC5B,UAAU,sBAAsB,KAC/B,MA0CF,CAAC"}
|
|
@@ -1,97 +1,32 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.transformNumber = void 0;
|
|
7
|
-
// utils/transformNumber.ts
|
|
8
4
|
const digitUtils_1 = require("./digitUtils");
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
* رشته عددی خام (انگلیسی، با نقطه استاندارد) را به فرمت نمایشی تبدیل میکند.
|
|
12
|
-
* فرض میشود ورودی از rawValue هوک آمده و قبلا sanitize و round شده است.
|
|
13
|
-
*
|
|
14
|
-
* @param rawValue رشته عددی خام (مثلا "1234.5", "15.", "-0.1", "-", ".") یا undefined.
|
|
15
|
-
* @param options تنظیمات قالب بندی.
|
|
16
|
-
* @returns رشته قالب بندی شده برای نمایش.
|
|
17
|
-
*/
|
|
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
|
|
5
|
+
const transformNumber = (rawValue, options) => {
|
|
6
|
+
const { separatorCount = 3, separatorChar = ",", locale = "fa", showZero = false, } = options || {};
|
|
23
7
|
if (rawValue === null || rawValue === undefined || rawValue === "") {
|
|
24
|
-
// نکته: تبدیل صفر به لوکال '۰' در صورت نیاز
|
|
25
8
|
return showZero ? (0, digitUtils_1.toLocalizedDigits)("0", locale) : "";
|
|
26
9
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
if (
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
return (0, digitUtils_1.toLocalizedDigits)(localizedDisplay, locale);
|
|
39
|
-
}
|
|
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) : "";
|
|
50
|
-
}
|
|
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();
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
catch ( /* خطا در تبدیل به Decimal نادیده گرفته شود */_a) { /* خطا در تبدیل به Decimal نادیده گرفته شود */ }
|
|
59
|
-
if (isEffectivelyZero && !showZero) {
|
|
60
|
-
// اگر مقدار صفر است و نباید نمایش داده شود
|
|
61
|
-
// مگر اینکه کاربر در حال تایپ نقطه بعد از صفر باشد (مثل '0.')
|
|
62
|
-
if (!rawValue.endsWith('.')) {
|
|
63
|
-
return "";
|
|
64
|
-
}
|
|
65
|
-
}
|
|
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. بازسازی رشته نهایی (با در نظر گرفتن نقطه انتهایی)
|
|
10
|
+
if (rawValue === "-")
|
|
11
|
+
return "-";
|
|
12
|
+
let [integerPart, fractionalPart] = rawValue.split(".");
|
|
13
|
+
const hasTrailingDot = rawValue.endsWith(".");
|
|
14
|
+
const sign = integerPart.startsWith("-") ? "-" : "";
|
|
15
|
+
const absIntPart = integerPart.replace(/^-/, "") ||
|
|
16
|
+
(hasTrailingDot || fractionalPart !== undefined ? "0" : "");
|
|
17
|
+
if (absIntPart === "" && !hasTrailingDot && fractionalPart === undefined) {
|
|
18
|
+
return sign === "-" ? "-" : showZero ? (0, digitUtils_1.toLocalizedDigits)("0", locale) : "";
|
|
19
|
+
}
|
|
20
|
+
const groupedInt = sign + (0, digitUtils_1.groupDigits)(absIntPart, separatorCount, separatorChar);
|
|
82
21
|
let finalStr = groupedInt;
|
|
83
|
-
if (fractionalPart !== undefined) {
|
|
22
|
+
if (fractionalPart !== undefined) {
|
|
84
23
|
finalStr = `${groupedInt}.${fractionalPart}`;
|
|
85
24
|
}
|
|
86
|
-
else if (hasTrailingDot) {
|
|
87
|
-
// اگر قسمت اعشاری وجود ندارد ولی رشته اصلی با نقطه تمام شده بود
|
|
25
|
+
else if (hasTrailingDot) {
|
|
88
26
|
finalStr = `${groupedInt}.`;
|
|
89
27
|
}
|
|
90
|
-
|
|
91
|
-
if (locale && locale !== 'en') {
|
|
92
|
-
// اول جداکننده نقطه را به محلی تبدیل کن
|
|
28
|
+
if (locale !== "en") {
|
|
93
29
|
finalStr = (0, digitUtils_1.localizeDecimalSeparator)(finalStr, locale);
|
|
94
|
-
// سپس ارقام انگلیسی را به محلی تبدیل کن
|
|
95
30
|
finalStr = (0, digitUtils_1.toLocalizedDigits)(finalStr, locale);
|
|
96
31
|
}
|
|
97
32
|
return finalStr;
|
|
@@ -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":";;;AAAA,6CAIsB;AAUf,MAAM,eAAe,GAAG,CAC7B,QAA4B,EAC5B,OAAgC,EACxB,EAAE;IACV,MAAM,EACJ,cAAc,GAAG,CAAC,EAClB,aAAa,GAAG,GAAG,EACnB,MAAM,GAAG,IAAI,EACb,QAAQ,GAAG,KAAK,GACjB,GAAG,OAAO,IAAI,EAAE,CAAC;IAElB,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;QACnE,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAA,8BAAiB,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,CAAC;IAED,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,GAAG,CAAC;IAEjC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAE9C,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,MAAM,UAAU,GACd,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAC7B,CAAC,cAAc,IAAI,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAE9D,IAAI,UAAU,KAAK,EAAE,IAAI,CAAC,cAAc,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACzE,OAAO,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAA,8BAAiB,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,CAAC;IAED,MAAM,UAAU,GACd,IAAI,GAAG,IAAA,wBAAW,EAAC,UAAU,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;IAEhE,IAAI,QAAQ,GAAG,UAAU,CAAC;IAC1B,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,QAAQ,GAAG,GAAG,UAAU,IAAI,cAAc,EAAE,CAAC;IAC/C,CAAC;SAAM,IAAI,cAAc,EAAE,CAAC;QAC1B,QAAQ,GAAG,GAAG,UAAU,GAAG,CAAC;IAC9B,CAAC;IAED,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,QAAQ,GAAG,IAAA,qCAAwB,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACtD,QAAQ,GAAG,IAAA,8BAAiB,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AA7CW,QAAA,eAAe,mBA6C1B"}
|
package/package.json
CHANGED
|
@@ -1,52 +1,48 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "persian-number-input",
|
|
3
|
-
"version": "4.0.
|
|
4
|
-
"description": "React component for Persian, Indic, or English localized number input with customizable digit grouping",
|
|
5
|
-
"main": "dist/index.js",
|
|
6
|
-
"module": "dist/index.js",
|
|
7
|
-
"types": "dist/index.d.ts",
|
|
8
|
-
"typings": "dist/index.d.ts",
|
|
9
|
-
"sideEffects": false,
|
|
10
|
-
"files": [
|
|
11
|
-
"dist"
|
|
12
|
-
],
|
|
13
|
-
"scripts": {
|
|
14
|
-
"build": "tsc",
|
|
15
|
-
"prepublishOnly": "npm run build"
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
|
|
30
|
-
"
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
"
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
"@types/
|
|
42
|
-
"@types/
|
|
43
|
-
"
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
"
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
"dependencies": {
|
|
50
|
-
"decimal.js": "^10.5.0"
|
|
51
|
-
}
|
|
52
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "persian-number-input",
|
|
3
|
+
"version": "4.0.9",
|
|
4
|
+
"description": "React component for Persian, Indic, or English localized number input with customizable digit grouping",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"typings": "dist/index.d.ts",
|
|
9
|
+
"sideEffects": false,
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"prepublishOnly": "npm run build"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"react",
|
|
19
|
+
"persian",
|
|
20
|
+
"indic",
|
|
21
|
+
"number",
|
|
22
|
+
"input",
|
|
23
|
+
"localization",
|
|
24
|
+
"digit-grouping"
|
|
25
|
+
],
|
|
26
|
+
"author": "Your Name",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "https://github.com/javadSharifi/persian-number-input"
|
|
31
|
+
},
|
|
32
|
+
"bugs": {
|
|
33
|
+
"url": "https://github.com/javadSharifi/persian-number-input/issues"
|
|
34
|
+
},
|
|
35
|
+
"homepage": "https://github.com/javadSharifi/persian-number-input#readme",
|
|
36
|
+
"peerDependencies": {
|
|
37
|
+
"react": "^16.8 || ^17 || ^18 || ^19"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@types/prop-types": "^15.7.15",
|
|
41
|
+
"@types/react": "^19.2.7",
|
|
42
|
+
"@types/react-dom": "^19.2.3",
|
|
43
|
+
"typescript": "^5.9.3"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"decimal.js": "^10.6.0"
|
|
47
|
+
}
|
|
48
|
+
}
|