اعتبارسنج استاندارد دادههای فارسی در .NET — نسخه 2.0.0
فارسی | English
مجموعهای سبک، فوقالعاده سریع و بدون وابستگی خارجی برای اعتبارسنجی دادههای هویت ایرانی در .NET — همراه با خروجیهای ساختاریافته، پشتیبانی از چندزبانگی (Localization) و یکپارچگی کامل با ASP.NET Core و فریمورکهای رایج.
| اعتبارسنج | نوع ورودی | الگوریتم اعتبارسنجی |
|---|---|---|
| کد ملی | ۱۰ رقم | الگوریتم Checksum وزنی |
| شناسه ملی شرکت | ۱۱ رقم | الگوریتم Checksum با وزنهای قانونی اشخاص حقوقی |
| کد اقتصادی | ۱۲ رقم | الگوریتم Checksum با ضرایب [29,27,23,19,17,13,7,5,3,2,1] |
| شماره موبایل | ۱۱ رقم | بررسی پیششمارههای فعال 09XX (جدول ۴۲ دامنهای) |
| کد پستی | ۱۰ رقم | ساختار استاندارد پست ایران |
| شماره کارت بانکی | ۱۶ رقم | الگوریتم Luhn + اعتبارسنجی پیششماره BIN بانکها |
| شماره شبا (IBAN) | پیشوند IR | پویش تکگذر MOD-97 + اعتبارسنجی کد ۳ رقمی بانک |
| شماره پاسپورت | ۱ حرف + ۸ رقم (نسخه بیومتریک؛ فرمت ۸ رقمی قدیمی از ۱۴۰۵ منسوخ و با `PassportValidator.Instance` نامعتبر است — آرشیو با `PassportValidator.CreateArchiveValidator()`) | فرمت رسمی گذرنامه (بدون Checksum) |
| پلاک خودرو | فرمت استاندارد | ساختار رسمی پلاک + کد استان |
| تلفن ثابت | ۱۱ رقم | ۰ + کد استان ۲رقمی + شماره محلی ۸رقمی (شروع ۲–۹، ۳۱ کد استان) |
⚠️ توضیح مهم: این کتابخانه صرفاً ساختار، فرمت و صحت ریاضی Checksum ورودی را بررسی میکند و عدم مغایرت ساختاری به معنای استعلام فعال بودن یا وجود داشتن واقعی آن رکورد در سامانههای ثبتاحوال، بانکها یا اپراتورها نیست.
- ✅ طراحی مبتنی بر Span — بدون Regex؛ مسیر سریعِ بدون تخصیص (۰ بایت) روی ورودیهای نرمالشدهٔ رشتای
- ✅ نرمالسازی خودکار — تبدیل اعداد فارسی/عربی و حذف فاصله و خط تیره (ورودی
"0912-123 4567"معتبر است) - ✅ خروجی ساختاریافته — بازگرداندن ValidationResult شامل Success، NormalizedValue و ErrorCode
- ✅ پشتیبانی از چندزبانگی — پیامهای خطا به زبانهای فارسی و انگلیسی با امکان توسعه
- ✅ پشتیبانی از پلتفرمهای متنوع — قابل استفاده در
netstandard2.0،net8.0وnet10.0 - ✅ بدون وابستگی خارجی — هسته اصلی پروژه وابسته به هیچ پکیج جانبی نیست
- ✅ ایمن در محیطهای چندنخی — ساختار Stateless و Thread-Safe
- ✅ یکپارچگی آسان — پشتیبانی از DataAnnotations، FluentValidation، ASP.NET Core و Minimal APIs
using IranValidator.Core.Extensions;
// استفاده از Extension Methodها
bool isValidNationalCode = "0010350829".IsIranNationalCode(); // true
bool isValidMobile = "09121234567".IsIranMobile(); // true
bool isValidPostalCode = "1145687654".IsIranPostalCode(); // true
bool isValidIban = "IR820540102680020817909002".IsIranIban(); // true
// نرمالسازی خودکار ورودی
bool result = "۰۹۱۲-۱۲۳ ۴۵۶۷".IsIranMobile(); // trueusing IranValidator.Core.Validators;
var validator = NationalCodeValidator.Instance;
var result = validator.Validate("0010350829");
if (result.Success)
{
Console.WriteLine($"✅ معتبر — مقدار نرمالشده: {result.NormalizedValue}");
}// DataAnnotations
[NationalCode]
[IranMobile]
public string NationalCode { get; set; }
// FluentValidation
public class UserValidator : AbstractValidator<User>
{
public UserValidator() => RuleFor(x => x.NationalCode).IranNationalCode();
}
// ASP.NET Core
builder.Services.AddIranValidation();
app.UseIranValidation();
// استفاده از [IranValidate] روی اکشنها
// Minimal APIs
builder.Services.AddIranValidator();
app.MapPost("/users", (UserModel model, IranValidatorService validator) =>
validator.ValidateNationalCode(model.NationalCode).Success ? Results.Ok() : Results.BadRequest());راهنمای کامل: مستندات یکپارچهسازی
پیامهای خطا بر اساس فرهنگ درخواست (Request Culture) یا UI Culture برنامه به صورت خودکار به زبان فارسی یا انگلیسی ترجمه میشوند.
// Registering Custom Resolvers
IranDataAnnotationsLocalization.Configure(options =>
options.AddResolver(CultureInfo.GetCultureInfo("fa"), new MyPersianResolver()));مستندات کامل: راهنمای محلیسازی
اندازهگیریشده توسط BenchmarkDotNet (MediumRun) روی محیط GitHub Actions (ubuntu-latest) و داتنت 10.0.12 (نسخهٔ BenchmarkDotNet: v0.14.0). مقادیر کمتر نشاندهنده عملکرد بهتر هستند.
| اعتبارسنج | IranValidator | Persian.Plus | DNTPersianUtils |
|---|---|---|---|
| کد ملی | 23.14 | 156.70 | 116.33 |
| شناسه شرکت | 24.65 | 287.29 | 127.33 |
| موبایل | 26.67 | 95.16 | 125.06 |
| کد پستی | 11.89 | 69.64 | 108.90 |
| کارت بانکی | 42.68 | 458.16 | 359.72 |
| شبا | 138.85 | 343.26 | 207.37 |
| اعتبارسنج | IranValidator | Persian.Plus | DNTPersianUtils |
|---|---|---|---|
| کد ملی | 0 | 0 | 169 |
| شناسه شرکت | 0 | 0 | 192 |
| موبایل | 0 | 0 | 0 |
| کد پستی | 0 | 0 | 96 |
| کارت بانکی | 0 | 0 | 0 |
| شبا | 0 | 0 | 0 |
نکتههای مهم:
- تخصیص صفر مربوط به مسیر سریع است: ورودیهایی که از قبل نرمال هستند (
ASCIIخالص — حالت رایج) بدون کپی پردازش میشوند؛ ورودیهای فارسی/عربی نیز بهدرستی نرمالسازی و اعتبارسنجی میشوند. - برخلاف رقبا، IranValidator بهجای
bool، نتیجهٔ ساختاریافتهٔValidationResultبرمیگرداند (readonly struct— بدون هزینهٔheap) و اعداد فارسی/عربی را نرمالسازی میکند؛ Persian.Plus نرمالسازی نمیکند و ورودی غیر-ASCII را رد میکند.
جزئیات کامل: راهنمای بنچمارک
| پکیج | وضعیت | کاربرد |
|---|---|---|
| IranValidator.Core | ✅ | هسته اصلی اعتبارسنجی — بدون وابستگی |
| IranValidator.DataAnnotations | ✅ | ویژگیهای اعتبارسنجی بر پایهٔ ویژگیها |
| IranValidator.FluentValidation | ✅ | متدهای توسعه برای اعتبارسنجی روان |
| IranValidator.AspNetCore | ✅ | ثبت وابستگی، فیلتر اکشن و میدلور |
| IranValidator.MinimalApis | ✅ | سرویس تزریقپذیر برای برنامههای مینیمال |
| IranValidator.Localization | ✅ | پیامهای خطای دوزبانه |
- تعداد تستها: ۱۰۹۹ — همه سبز (
xunit v3+FluentAssertions) - پوشش کد: ۹۹.۷۱٪ خط / ۹۷.۸۵٪ شاخه (آستانهٔ CI: ۹۵٪)
| ماژول | Line | Branch | Method |
|---|---|---|---|
| Core | 99.86% | 99.26% | 99.24% |
| DataAnnotations | 100% | 100% | 100% |
| FluentValidation | 100% | 96.96% | 100% |
| AspNetCore | 100% | 78.57% | 100% |
| MinimalApis | 100% | 100% | 100% |
| Localization | 97.40% | 92.85% | 85.71% |
- فایل
ci.yml— بیلد + تست + گیت پوشش (آستانهٔ ۹۵٪) در هر push/PR - فایل
benchmarks.yml— اجرای ماهانهٔ بنچمارک (میانهٔ ۳ اجرا) + مقایسه با baseline (شکست در صورت افت واقعی عملکرد) + اجرا پیش از Release - فایل
release.yml— انتشار خودکار به NuGet.org و ساخت GitHub Release روی تگهایv*
این پروژه تحت لایسنس MIT منتشر شده است.