persian-number-input 4.0.8 → 4.0.10
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 +64 -94
- 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 +61 -164
- 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 +10 -79
- package/dist/utils/transformNumber.js.map +1 -1
- package/package.json +48 -52
package/dist/utils/digitUtils.js
CHANGED
|
@@ -1,195 +1,92 @@
|
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
if (
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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 = '-';
|
|
64
|
+
return "";
|
|
65
|
+
let str = (0, exports.toEnglishDigits)(String(value));
|
|
66
|
+
str = str.replace(/[^0-9.]/g, "");
|
|
67
|
+
const parts = str.split(".");
|
|
68
|
+
if (parts.length > 2) {
|
|
69
|
+
str = parts[0] + "." + parts.slice(1).join("");
|
|
70
|
+
}
|
|
71
|
+
str = str.replace(/^0+(?!$|\.)/, "");
|
|
72
|
+
if (str.includes(".")) {
|
|
73
|
+
const [intPart, fracPart] = str.split(".");
|
|
74
|
+
if (maxDecimals !== undefined) {
|
|
75
|
+
const truncatedFrac = maxDecimals > 0 ? fracPart.slice(0, maxDecimals) : "";
|
|
76
|
+
str = truncatedFrac ? `${intPart}.${truncatedFrac}` : intPart;
|
|
77
|
+
if (maxDecimals > 0 && String(value).endsWith(".")) {
|
|
78
|
+
str = str.includes(".") ? str : `${str}.`;
|
|
79
|
+
}
|
|
134
80
|
}
|
|
135
81
|
}
|
|
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
82
|
return str;
|
|
152
83
|
};
|
|
153
84
|
exports.sanitizeNumericInput = sanitizeNumericInput;
|
|
154
|
-
/**
|
|
155
|
-
* گرد کردن یا محدود کردن تعداد ارقام اعشار یک رشته عددی (انگلیسی).
|
|
156
|
-
* مهم: این تابع نقطه انتهایی را حفظ میکند اگر ورودی با نقطه تمام شود و maxDecimals صفر نباشد.
|
|
157
|
-
* @param value رشته عددی با ارقام انگلیسی و نقطه استاندارد.
|
|
158
|
-
* @param maxDecimals حداکثر تعداد اعشار مجاز (undefined یعنی بدون محدودیت).
|
|
159
|
-
* @returns رشته گرد شده یا محدود شده.
|
|
160
|
-
*/
|
|
161
85
|
const roundToDecimals = (value, maxDecimals) => {
|
|
162
|
-
|
|
163
|
-
if (maxDecimals === undefined || !value || !value.includes('.')) {
|
|
86
|
+
if (maxDecimals === undefined || !value || !value.includes("."))
|
|
164
87
|
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
|
-
}
|
|
88
|
+
const [int, frac] = value.split(".");
|
|
89
|
+
return maxDecimals > 0 ? `${int}.${frac.slice(0, maxDecimals)}` : int;
|
|
193
90
|
};
|
|
194
91
|
exports.roundToDecimals = roundToDecimals;
|
|
195
92
|
//# 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,MAqCF,CAAC"}
|
|
@@ -1,97 +1,28 @@
|
|
|
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
|
-
return "-"; // یا بر اساس showZero تصمیم بگیرید
|
|
33
|
-
}
|
|
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);
|
|
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}"`);
|
|
10
|
+
let [integerPart, fractionalPart] = rawValue.split(".");
|
|
11
|
+
const hasTrailingDot = rawValue.endsWith(".");
|
|
12
|
+
const absIntPart = integerPart || (hasTrailingDot || fractionalPart !== undefined ? "0" : "");
|
|
13
|
+
if (absIntPart === "" && !hasTrailingDot && fractionalPart === undefined) {
|
|
49
14
|
return showZero ? (0, digitUtils_1.toLocalizedDigits)("0", locale) : "";
|
|
50
15
|
}
|
|
51
|
-
|
|
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. بازسازی رشته نهایی (با در نظر گرفتن نقطه انتهایی)
|
|
16
|
+
const groupedInt = (0, digitUtils_1.groupDigits)(absIntPart, separatorCount, separatorChar);
|
|
82
17
|
let finalStr = groupedInt;
|
|
83
|
-
if (fractionalPart !== undefined) {
|
|
18
|
+
if (fractionalPart !== undefined) {
|
|
84
19
|
finalStr = `${groupedInt}.${fractionalPart}`;
|
|
85
20
|
}
|
|
86
|
-
else if (hasTrailingDot) {
|
|
87
|
-
// اگر قسمت اعشاری وجود ندارد ولی رشته اصلی با نقطه تمام شده بود
|
|
21
|
+
else if (hasTrailingDot) {
|
|
88
22
|
finalStr = `${groupedInt}.`;
|
|
89
23
|
}
|
|
90
|
-
|
|
91
|
-
if (locale && locale !== 'en') {
|
|
92
|
-
// اول جداکننده نقطه را به محلی تبدیل کن
|
|
24
|
+
if (locale !== "en") {
|
|
93
25
|
finalStr = (0, digitUtils_1.localizeDecimalSeparator)(finalStr, locale);
|
|
94
|
-
// سپس ارقام انگلیسی را به محلی تبدیل کن
|
|
95
26
|
finalStr = (0, digitUtils_1.toLocalizedDigits)(finalStr, locale);
|
|
96
27
|
}
|
|
97
28
|
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,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,UAAU,GACd,WAAW,IAAI,CAAC,cAAc,IAAI,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAE7E,IAAI,UAAU,KAAK,EAAE,IAAI,CAAC,cAAc,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACzE,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAA,8BAAiB,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,CAAC;IAED,MAAM,UAAU,GAAG,IAAA,wBAAW,EAAC,UAAU,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;IAE1E,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;AAxCW,QAAA,eAAe,mBAwC1B"}
|
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.10",
|
|
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
|
+
}
|