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 ADDED
@@ -0,0 +1,458 @@
1
+ # ورودی اعداد فارسی و عربی
2
+
3
+ یک کتابخانه React سبک و قدرتمند برای مدیریت ورودی اعداد فارسی و عربی با تبدیل خودکار ارقام، فرمت‌دهی و پشتیبانی از چند زبان.
4
+
5
+ [![نسخه npm](https://img.shields.io/npm/v/persian-number-input.svg)](https://www.npmjs.com/package/persian-number-input)
6
+ [![دانلودهای npm](https://img.shields.io/npm/dm/persian-number-input.svg)](https://www.npmjs.com/package/persian-number-input)
7
+ [![حجم باندل](https://img.shields.io/bundlephobia/minzip/persian-number-input)](https://bundlephobia.com/package/persian-number-input)
8
+ [![مجوز](https://img.shields.io/npm/l/persian-number-input.svg)](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
+ ![مقایسه حجم باندل](./public/size.png)
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
+ **ساخته شده با ❤️ برای جامعه توسعه‌دهندگان فارسی و عربی‌زبان**