persian-number-input 4.1.0 → 4.3.0
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/README.fa.md +458 -0
- package/README.md +342 -270
- package/dist/components/PersianNumberInput.d.ts.map +1 -1
- package/dist/components/PersianNumberInput.js +2 -1
- package/dist/components/PersianNumberInput.js.map +1 -1
- package/dist/components/PersianNumberInput.test.d.ts +2 -0
- package/dist/components/PersianNumberInput.test.d.ts.map +1 -0
- package/dist/components/PersianNumberInput.test.js +37 -0
- package/dist/components/PersianNumberInput.test.js.map +1 -0
- package/dist/hooks/usePersianNumberInput.d.ts.map +1 -1
- package/dist/hooks/usePersianNumberInput.js +4 -1
- package/dist/hooks/usePersianNumberInput.js.map +1 -1
- package/dist/setupTests.d.ts +2 -0
- package/dist/setupTests.d.ts.map +1 -0
- package/dist/setupTests.js +4 -0
- package/dist/setupTests.js.map +1 -0
- package/dist/utils/transformNumber.d.ts +1 -0
- package/dist/utils/transformNumber.d.ts.map +1 -1
- package/dist/utils/transformNumber.js +12 -3
- package/dist/utils/transformNumber.js.map +1 -1
- package/package.json +14 -3
package/README.fa.md
ADDED
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
# ورودی اعداد فارسی و عربی
|
|
2
|
+
|
|
3
|
+
یک کتابخانه React سبک و قدرتمند برای مدیریت ورودی اعداد فارسی و عربی با تبدیل خودکار ارقام، فرمتدهی و پشتیبانی از چند زبان.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/persian-number-input)
|
|
6
|
+
[](https://www.npmjs.com/package/persian-number-input)
|
|
7
|
+
[](https://bundlephobia.com/package/persian-number-input)
|
|
8
|
+
[](https://github.com/javadSharifi/persian-number-input/blob/main/LICENSE)
|
|
9
|
+
|
|
10
|
+
## 🚀 [دموی آنلاین](https://persian-number-input.netlify.app/)
|
|
11
|
+
|
|
12
|
+
کامپوننت را به صورت زنده تجربه کنید!
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 📊 حجم باندل
|
|
17
|
+
|
|
18
|
+
این کتابخانه فوقالعاده سبک است:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
persian-number-input: تنها ~1KB (فشرده شده)
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+

|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## ✨ امکانات
|
|
29
|
+
|
|
30
|
+
- 🔢 **تبدیل خودکار ارقام** - تبدیل یکپارچه ارقام فارسی (۰-۹) و عربی (٠-٩) به انگلیسی و بالعکس
|
|
31
|
+
- 🌍 **پشتیبانی چندزبانه** - پشتیبانی داخلی از فارسی (fa)، عربی (ar) و انگلیسی (en)
|
|
32
|
+
- 📊 **فرمتدهی اعداد** - جداکننده هزارگان خودکار با کاراکترهای قابل تنظیم
|
|
33
|
+
- 💰 **آماده برای ارز** - امکان افزودن پیشوند، پسوند و جداکننده اعشاری سفارشی
|
|
34
|
+
- ⚡ **سبک و سریع** - حجم بسیار کم با صفر وابستگی (به جز decimal.js برای دقت)
|
|
35
|
+
- 🎯 **Type-Safe** - پشتیبانی کامل TypeScript با تعاریف تایپ کامل
|
|
36
|
+
- ♿ **قابل دسترس** - پیروی از بهترین شیوههای دسترسیپذیری
|
|
37
|
+
- 🎨 **قابل سفارشیسازی** - گزینههای پیکربندی گسترده برای هر نیازی
|
|
38
|
+
- 🔄 **فرمتدهی لحظهای** - فرمت کردن اعداد همزمان با تایپ کاربر با حفظ موقعیت مکاننما
|
|
39
|
+
- ✅ **اعتبارسنجی** - کنترل داخلی مقادیر min/max و دقت اعشاری
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 📦 نصب
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npm install persian-number-input
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
yarn add persian-number-input
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
pnpm add persian-number-input
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## 🎯 شروع سریع
|
|
60
|
+
|
|
61
|
+
### استفاده ساده
|
|
62
|
+
|
|
63
|
+
```tsx
|
|
64
|
+
import { PersianNumberInput } from "persian-number-input";
|
|
65
|
+
|
|
66
|
+
function App() {
|
|
67
|
+
return (
|
|
68
|
+
<PersianNumberInput
|
|
69
|
+
initialValue={1234567}
|
|
70
|
+
locale="fa"
|
|
71
|
+
onValueChange={(value) => console.log(value)}
|
|
72
|
+
/>
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**خروجی:** `۱,۲۳۴,۵۶۷`
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 📚 نمونههای کاربردی
|
|
82
|
+
|
|
83
|
+
### ورودی مبلغ (تومان ایران)
|
|
84
|
+
|
|
85
|
+
```tsx
|
|
86
|
+
<PersianNumberInput
|
|
87
|
+
initialValue={5000000}
|
|
88
|
+
locale="fa"
|
|
89
|
+
suffix="تومان"
|
|
90
|
+
separatorCount={3}
|
|
91
|
+
separatorChar=","
|
|
92
|
+
onValueChange={(value) => console.log(value)}
|
|
93
|
+
/>
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**خروجی:** `۵,۰۰۰,۰۰۰ تومان`
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
### اعداد اعشاری با جداکننده سفارشی
|
|
101
|
+
|
|
102
|
+
```tsx
|
|
103
|
+
<PersianNumberInput
|
|
104
|
+
initialValue={1234.56}
|
|
105
|
+
locale="fa"
|
|
106
|
+
maxDecimals={2}
|
|
107
|
+
decimalChar="٫"
|
|
108
|
+
separatorChar=","
|
|
109
|
+
onValueChange={(value) => console.log(value)}
|
|
110
|
+
/>
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**خروجی:** `۱,۲۳۴٫۵۶`
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
### ورودی قیمت با اعتبارسنجی
|
|
118
|
+
|
|
119
|
+
```tsx
|
|
120
|
+
<PersianNumberInput
|
|
121
|
+
initialValue={0}
|
|
122
|
+
locale="fa"
|
|
123
|
+
min={0}
|
|
124
|
+
max={999999999}
|
|
125
|
+
suffix="ریال"
|
|
126
|
+
showZero={true}
|
|
127
|
+
onValueChange={(value) => console.log(value)}
|
|
128
|
+
/>
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**خروجی:** `۰ ریال`
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
### زبان عربی
|
|
136
|
+
|
|
137
|
+
```tsx
|
|
138
|
+
<PersianNumberInput
|
|
139
|
+
initialValue={987654}
|
|
140
|
+
locale="ar"
|
|
141
|
+
separatorChar=","
|
|
142
|
+
suffix="ر.س"
|
|
143
|
+
onValueChange={(value) => console.log(value)}
|
|
144
|
+
/>
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**خروجی:** `٩٨٧,٦٥٤ ر.س`
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
### استفاده از Hook (پیشرفته)
|
|
152
|
+
|
|
153
|
+
```tsx
|
|
154
|
+
import { usePersianNumberInput } from "persian-number-input";
|
|
155
|
+
|
|
156
|
+
function CustomInput() {
|
|
157
|
+
const { value, onChange, onBlur, rawValue } = usePersianNumberInput({
|
|
158
|
+
initialValue: 1000,
|
|
159
|
+
locale: "fa",
|
|
160
|
+
separatorCount: 3,
|
|
161
|
+
maxDecimals: 2,
|
|
162
|
+
min: 0,
|
|
163
|
+
max: 1000000,
|
|
164
|
+
onValueChange: (val) => {
|
|
165
|
+
console.log("مقدار خام:", val); // "1000"
|
|
166
|
+
console.log("مقدار نمایشی:", value); // "۱,۰۰۰"
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
return (
|
|
171
|
+
<input
|
|
172
|
+
type="text"
|
|
173
|
+
value={value}
|
|
174
|
+
onChange={onChange}
|
|
175
|
+
onBlur={onBlur}
|
|
176
|
+
className="custom-input"
|
|
177
|
+
/>
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## 🛠️ مرجع API
|
|
185
|
+
|
|
186
|
+
### Props کامپوننت PersianNumberInput
|
|
187
|
+
|
|
188
|
+
| ویژگی | نوع | پیشفرض | توضیحات |
|
|
189
|
+
| ---------------- | -------------------------------------- | ----------- | --------------------------------------------------------------- |
|
|
190
|
+
| `initialValue` | `number \| string` | `undefined` | مقدار اولیه ورودی |
|
|
191
|
+
| `locale` | `"fa" \| "ar" \| "en"` | `"fa"` | زبان برای تبدیل ارقام |
|
|
192
|
+
| `separatorCount` | `number` | `3` | تعداد ارقام بین جداکنندهها |
|
|
193
|
+
| `separatorChar` | `string` | `","` | کاراکتر جداکننده هزارگان |
|
|
194
|
+
| `decimalChar` | `string` | خودکار | کاراکتر جداکننده اعشار |
|
|
195
|
+
| `suffix` | `string` | `undefined` | متن پسوند (مثل واحد پول) |
|
|
196
|
+
| `maxDecimals` | `number` | `undefined` | حداکثر رقم اعشار مجاز |
|
|
197
|
+
| `min` | `number` | `undefined` | کمترین مقدار مجاز |
|
|
198
|
+
| `max` | `number` | `undefined` | بیشترین مقدار مجاز |
|
|
199
|
+
| `showZero` | `boolean` | `false` | نمایش صفر وقتی مقدار خالی است |
|
|
200
|
+
| `onValueChange` | `(value: string \| undefined) => void` | `undefined` | تابع فراخوانی هنگام تغییر مقدار (ارقام انگلیسی خام برمیگرداند) |
|
|
201
|
+
|
|
202
|
+
تمام props استاندارد HTML input نیز پشتیبانی میشوند.
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
### توابع کمکی
|
|
207
|
+
|
|
208
|
+
#### `transformNumber(rawValue, options)`
|
|
209
|
+
|
|
210
|
+
یک رشته عددی را بر اساس زبان و تنظیمات فرمت میکند.
|
|
211
|
+
|
|
212
|
+
```tsx
|
|
213
|
+
import { transformNumber } from "persian-number-input";
|
|
214
|
+
|
|
215
|
+
const formatted = transformNumber("1234567.89", {
|
|
216
|
+
locale: "fa",
|
|
217
|
+
separatorCount: 3,
|
|
218
|
+
separatorChar: ",",
|
|
219
|
+
maxDecimals: 2,
|
|
220
|
+
suffix: "تومان",
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
console.log(formatted); // "۱,۲۳۴,۵۶۷٫۸۹ تومان"
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
#### `toEnglishDigits(str, decimalChar?)`
|
|
227
|
+
|
|
228
|
+
ارقام فارسی/عربی را به انگلیسی تبدیل میکند.
|
|
229
|
+
|
|
230
|
+
```tsx
|
|
231
|
+
import { toEnglishDigits } from "persian-number-input";
|
|
232
|
+
|
|
233
|
+
console.log(toEnglishDigits("۱۲۳۴")); // "1234"
|
|
234
|
+
console.log(toEnglishDigits("٩٨٧٦")); // "9876"
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
#### `toLocalizedDigits(numStr, locale)`
|
|
238
|
+
|
|
239
|
+
ارقام انگلیسی را به ارقام محلی تبدیل میکند.
|
|
240
|
+
|
|
241
|
+
```tsx
|
|
242
|
+
import { toLocalizedDigits } from "persian-number-input";
|
|
243
|
+
|
|
244
|
+
console.log(toLocalizedDigits("1234", "fa")); // "۱۲۳۴"
|
|
245
|
+
console.log(toLocalizedDigits("5678", "ar")); // "٥٦٧٨"
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
#### `sanitizeNumericInput(value, maxDecimals?, decimalChar?)`
|
|
249
|
+
|
|
250
|
+
ورودی عددی را پاکسازی و اعتبارسنجی میکند.
|
|
251
|
+
|
|
252
|
+
```tsx
|
|
253
|
+
import { sanitizeNumericInput } from "persian-number-input";
|
|
254
|
+
|
|
255
|
+
console.log(sanitizeNumericInput("۱۲۳abc۴۵۶", 2)); // "123456"
|
|
256
|
+
console.log(sanitizeNumericInput("12.345.67", 2)); // "12.34"
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
## 🎨 استایلدهی
|
|
262
|
+
|
|
263
|
+
کامپوننت تمام props استاندارد input را میپذیرد، از جمله `className` و `style`:
|
|
264
|
+
|
|
265
|
+
```tsx
|
|
266
|
+
<PersianNumberInput
|
|
267
|
+
initialValue={1000}
|
|
268
|
+
locale="fa"
|
|
269
|
+
className="custom-input"
|
|
270
|
+
style={{
|
|
271
|
+
padding: "12px",
|
|
272
|
+
fontSize: "16px",
|
|
273
|
+
border: "2px solid #4F46E5",
|
|
274
|
+
borderRadius: "8px",
|
|
275
|
+
textAlign: "right",
|
|
276
|
+
}}
|
|
277
|
+
/>
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### با Tailwind CSS
|
|
281
|
+
|
|
282
|
+
```tsx
|
|
283
|
+
<PersianNumberInput
|
|
284
|
+
initialValue={1000}
|
|
285
|
+
locale="fa"
|
|
286
|
+
className="w-full px-4 py-3 text-lg border-2 border-indigo-500 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-600 text-right"
|
|
287
|
+
/>
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
## 🌟 مثالهای پیشرفته
|
|
293
|
+
|
|
294
|
+
### ماشین حساب مالی
|
|
295
|
+
|
|
296
|
+
```tsx
|
|
297
|
+
import { useState } from "react";
|
|
298
|
+
import { PersianNumberInput } from "persian-number-input";
|
|
299
|
+
|
|
300
|
+
function LoanCalculator() {
|
|
301
|
+
const [principal, setPrincipal] = useState<string>();
|
|
302
|
+
const [rate, setRate] = useState<string>();
|
|
303
|
+
const [years, setYears] = useState<string>();
|
|
304
|
+
|
|
305
|
+
const calculateMonthlyPayment = () => {
|
|
306
|
+
if (!principal || !rate || !years) return 0;
|
|
307
|
+
const p = parseFloat(principal);
|
|
308
|
+
const r = parseFloat(rate) / 100 / 12;
|
|
309
|
+
const n = parseFloat(years) * 12;
|
|
310
|
+
return (p * r * Math.pow(1 + r, n)) / (Math.pow(1 + r, n) - 1);
|
|
311
|
+
};
|
|
312
|
+
|
|
313
|
+
return (
|
|
314
|
+
<div className="space-y-4">
|
|
315
|
+
<div>
|
|
316
|
+
<label>مبلغ وام:</label>
|
|
317
|
+
<PersianNumberInput
|
|
318
|
+
locale="fa"
|
|
319
|
+
suffix="تومان"
|
|
320
|
+
onValueChange={setPrincipal}
|
|
321
|
+
min={0}
|
|
322
|
+
/>
|
|
323
|
+
</div>
|
|
324
|
+
<div>
|
|
325
|
+
<label>نرخ سود (٪):</label>
|
|
326
|
+
<PersianNumberInput
|
|
327
|
+
locale="fa"
|
|
328
|
+
maxDecimals={2}
|
|
329
|
+
onValueChange={setRate}
|
|
330
|
+
min={0}
|
|
331
|
+
max={100}
|
|
332
|
+
/>
|
|
333
|
+
</div>
|
|
334
|
+
<div>
|
|
335
|
+
<label>مدت زمان (سال):</label>
|
|
336
|
+
<PersianNumberInput
|
|
337
|
+
locale="fa"
|
|
338
|
+
onValueChange={setYears}
|
|
339
|
+
min={1}
|
|
340
|
+
max={30}
|
|
341
|
+
/>
|
|
342
|
+
</div>
|
|
343
|
+
<p>
|
|
344
|
+
پرداخت ماهیانه: {calculateMonthlyPayment().toLocaleString("fa-IR")}{" "}
|
|
345
|
+
تومان
|
|
346
|
+
</p>
|
|
347
|
+
</div>
|
|
348
|
+
);
|
|
349
|
+
}
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
---
|
|
353
|
+
|
|
354
|
+
### یکپارچگی با فرم
|
|
355
|
+
|
|
356
|
+
```tsx
|
|
357
|
+
import { useForm, Controller } from "react-hook-form";
|
|
358
|
+
import { PersianNumberInput } from "persian-number-input";
|
|
359
|
+
|
|
360
|
+
function ProductForm() {
|
|
361
|
+
const { control, handleSubmit } = useForm();
|
|
362
|
+
|
|
363
|
+
const onSubmit = (data) => {
|
|
364
|
+
console.log(data);
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
return (
|
|
368
|
+
<form onSubmit={handleSubmit(onSubmit)}>
|
|
369
|
+
<Controller
|
|
370
|
+
name="price"
|
|
371
|
+
control={control}
|
|
372
|
+
rules={{ required: true }}
|
|
373
|
+
render={({ field }) => (
|
|
374
|
+
<PersianNumberInput
|
|
375
|
+
locale="fa"
|
|
376
|
+
suffix="تومان"
|
|
377
|
+
onValueChange={field.onChange}
|
|
378
|
+
initialValue={field.value}
|
|
379
|
+
/>
|
|
380
|
+
)}
|
|
381
|
+
/>
|
|
382
|
+
<button type="submit">ثبت</button>
|
|
383
|
+
</form>
|
|
384
|
+
);
|
|
385
|
+
}
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
---
|
|
389
|
+
|
|
390
|
+
## 🔍 چرا ورودی اعداد فارسی؟
|
|
391
|
+
|
|
392
|
+
### مشکل
|
|
393
|
+
|
|
394
|
+
کار با ارقام فارسی و عربی در برنامههای وب چالشبرانگیز است:
|
|
395
|
+
|
|
396
|
+
- کاربران با ارقام بومی خود تایپ میکنند، اما فرمها ارقام انگلیسی انتظار دارند
|
|
397
|
+
- فرمتدهی اعداد در زبانهای مختلف متفاوت است
|
|
398
|
+
- حفظ موقعیت مکاننما هنگام فرمتدهی پیچیده است
|
|
399
|
+
- مدیریت دقت اعشاری نیاز به پیادهسازی دقیق دارد
|
|
400
|
+
|
|
401
|
+
### راهحل
|
|
402
|
+
|
|
403
|
+
ورودی اعداد فارسی تمام این پیچیدگیها را به صورت خودکار مدیریت میکند:
|
|
404
|
+
|
|
405
|
+
```tsx
|
|
406
|
+
// کاربر تایپ میکند: ۱۲۳۴۵۶۷
|
|
407
|
+
// کامپوننت نمایش میدهد: ۱,۲۳۴,۵۶۷
|
|
408
|
+
// فرم دریافت میکند: "1234567"
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
---
|
|
412
|
+
|
|
413
|
+
## 🏆 مقایسه
|
|
414
|
+
|
|
415
|
+
| امکانات | ورودی اعداد فارسی | Input معمولی | کتابخانههای دیگر |
|
|
416
|
+
| ------------------- | ----------------- | ------------ | ----------------- |
|
|
417
|
+
| تبدیل خودکار ارقام | ✅ | ❌ | ⚠️ جزئی |
|
|
418
|
+
| حفظ مکاننما | ✅ | ❌ | ⚠️ باگدار |
|
|
419
|
+
| پشتیبانی TypeScript | ✅ | ✅ | ⚠️ متغیر |
|
|
420
|
+
| چند زبانه | ✅ | ❌ | ❌ |
|
|
421
|
+
| حجم باندل | 🟢 کم | 🟢 - | 🔴 زیاد |
|
|
422
|
+
| دقت اعشاری | ✅ | ❌ | ⚠️ محدود |
|
|
423
|
+
|
|
424
|
+
---
|
|
425
|
+
|
|
426
|
+
## 🤝 مشارکت
|
|
427
|
+
|
|
428
|
+
مشارکت شما استقبال میشود! لطفاً از ارسال Pull Request دریغ نکنید.
|
|
429
|
+
|
|
430
|
+
1. مخزن را Fork کنید
|
|
431
|
+
2. شاخه ویژگی خود را ایجاد کنید (`git checkout -b feature/AmazingFeature`)
|
|
432
|
+
3. تغییرات خود را Commit کنید (`git commit -m 'Add some AmazingFeature'`)
|
|
433
|
+
4. به شاخه Push کنید (`git push origin feature/AmazingFeature`)
|
|
434
|
+
5. یک Pull Request باز کنید
|
|
435
|
+
|
|
436
|
+
---
|
|
437
|
+
|
|
438
|
+
## 📄 مجوز
|
|
439
|
+
|
|
440
|
+
MIT © [نام شما]
|
|
441
|
+
|
|
442
|
+
---
|
|
443
|
+
|
|
444
|
+
## 🙏 تشکرات
|
|
445
|
+
|
|
446
|
+
- ساخته شده با TypeScript و React
|
|
447
|
+
- استفاده از [decimal.js](https://github.com/MikeMcl/decimal.js/) برای محاسبات دقیق اعشاری
|
|
448
|
+
- الهامگرفته از نیازهای توسعهدهندگان فارسی و عربیزبان
|
|
449
|
+
|
|
450
|
+
---
|
|
451
|
+
|
|
452
|
+
## 📞 پشتیبانی
|
|
453
|
+
|
|
454
|
+
- 📧 ایمیل: your.email@example.com
|
|
455
|
+
- 🐛 [گزارش مشکلات](https://github.com/javadSharifi/persian-number-input/issues)
|
|
456
|
+
- 💬 [بحث و گفتگو](https://github.com/javadSharifi/persian-number-input/discussions)
|
|
457
|
+
|
|
458
|
+
**ساخته شده با ❤️ برای جامعه توسعهدهندگان فارسی و عربیزبان**
|