متدی برای بررسی صحت کد ملی وارد شده
نویسنده: صابر فتح الهی
تاریخ: ۱۳۹۱/۰۸/۱۹ ۱۵:۵۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
کد ملی شماره ای است 10 رقمی که از سمت چپ سه رقم کد شهرستان ، شش رقم بعدی کد منحصر به فرد برای فرد دارنده و رقم آخر آن هم یک رقم کنترل است که از روی 9 رقم سمت چپ بدست میآید. برای بررسی کنترل کد کافی است مجدد از روی 9 رقم سمت چپ رقم کنترل را محاسبه کنیم
از آنجایی که درسیستم کد ملی معمولا قبل از کد تعدادی
صفر وجود دارد.(رقم اول و رقم دوم از سمت چپ کد ملی ممکن است صفر باشد) و در
بسیاری از موارد ممکن است کاربر این صفرها را وارد نکرده باشد و یا نرم افزار
این صفرها را ذخیره نکرده باشد بهتر است قبل از هر کاری در صورتی که طول کد
بزرگتر مساوی 8 و کمتر از 10 باشد به تعداد لازم (یک تا دو تا صفر) به
سمت چپ عدد اضافه کنید. ساختار کد ملی در زیر نشان داده شده است.
۰۰۰۰۰۰۰۰۰۰ ۱۱۱۱۱۱۱۱۱۱ ۲۲۲۲۲۲۲۲۲۲ ۳۳۳۳۳۳۳۳۳۳ ۴۴۴۴۴۴۴۴۴۴ ۵۵۵۵۵۵۵۵۵۵ ۶۶۶۶۶۶۶۶۶۶ ۷۷۷۷۷۷۷۷۷۷ ۸۸۸۸۸۸۸۸۸۸ ۹۹۹۹۹۹۹۹۹۹
public static class Helpers
{
/// <summary>
/// تعیین معتبر بودن کد ملی
/// </summary>
/// <param name="nationalCode">کد ملی وارد شده</param>
/// <returns>
/// در صورتی که کد ملی صحیح باشد خروجی <c>true</c> و در صورتی که کد ملی اشتباه باشد خروجی <c>false</c> خواهد بود
/// </returns>
/// <exception cref="System.Exception"></exception>
public static Boolean IsValidNationalCode(this String nationalCode)
{
//در صورتی که کد ملی وارد شده تهی باشد
if (String.IsNullOrEmpty(nationalCode))
throw new Exception("لطفا کد ملی را صحیح وارد نمایید");
//در صورتی که کد ملی وارد شده طولش کمتر از 10 رقم باشد
if (nationalCode.Length != 10)
throw new Exception("طول کد ملی باید ده کاراکتر باشد");
//در صورتی که کد ملی ده رقم عددی نباشد
var regex = new Regex(@"\d{10}");
if (!regex.IsMatch(nationalCode))
throw new Exception("کد ملی تشکیل شده از ده رقم عددی میباشد؛ لطفا کد ملی را صحیح وارد نمایید");
//در صورتی که رقمهای کد ملی وارد شده یکسان باشد
var allDigitEqual = new[]{"0000000000","1111111111","2222222222","3333333333","4444444444","5555555555","6666666666","7777777777","8888888888","9999999999"};
if (allDigitEqual.Contains(nationalCode)) return false;
//عملیات شرح داده شده در بالا
var chArray = nationalCode.ToCharArray();
var num0 = Convert.ToInt32(chArray[0].ToString())*10;
var num2 = Convert.ToInt32(chArray[1].ToString())*9;
var num3 = Convert.ToInt32(chArray[2].ToString())*8;
var num4 = Convert.ToInt32(chArray[3].ToString())*7;
var num5 = Convert.ToInt32(chArray[4].ToString())*6;
var num6 = Convert.ToInt32(chArray[5].ToString())*5;
var num7 = Convert.ToInt32(chArray[6].ToString())*4;
var num8 = Convert.ToInt32(chArray[7].ToString())*3;
var num9 = Convert.ToInt32(chArray[8].ToString())*2;
var a = Convert.ToInt32(chArray[9].ToString());
var b = (((((((num0 + num2) + num3) + num4) + num5) + num6) + num7) + num8) + num9;
var c = b%11;
return (((c < 2) && (a == c)) || ((c >= 2) && ((11 - c) == a)));
}
}
if(TextBoxNationalCode.Text.IsValidNationalCode ())
//some code
//OR
if(Helpers.IsValidNationalCode (TextBoxNationalCode.Text))
//some code
var allDigitEqual = new[]{"0000000000","1111111111","2222222222","3333333333","4444444444","5555555555","6666666666","7777777777","8888888888","9999999999"};
if (allDigitEqual.Contains(nationalCode)) return false;
if (nationalCode == "1111111111" ||
nationalCode == "0000000000" ||
nationalCode == "2222222222" ||
nationalCode == "3333333333" ||
nationalCode == "4444444444" ||
nationalCode == "5555555555" ||
nationalCode == "6666666666" ||
nationalCode == "7777777777" ||
nationalCode == "8888888888" ||
nationalCode == "9999999999")
return false;
var chArray = nationalCode.ToCharArray(); var num0 = Convert.ToInt32(chArray[0].ToString())*10; var num2 = Convert.ToInt32(chArray[1].ToString())*9; var num3 = Convert.ToInt32(chArray[2].ToString())*8; var num4 = Convert.ToInt32(chArray[3].ToString())*7; var num5 = Convert.ToInt32(chArray[4].ToString())*6; var num6 = Convert.ToInt32(chArray[5].ToString())*5; var num7 = Convert.ToInt32(chArray[6].ToString())*4; var num8 = Convert.ToInt32(chArray[7].ToString())*3; var num9 = Convert.ToInt32(chArray[8].ToString())*2; var a = Convert.ToInt32(chArray[9].ToString()); var b = (((((((num0 + num2) + num3) + num4) + num5) + num6) + num7) + num8) + num9; var c = b%11; return (((c < 2) && (a == c)) || ((c >= 2) && ((11 - c) == a)));
int result = 0, controlNr = (int)(input[9] - 48);
for (int i = 0; i < input.Length - 1; i++)
result += (input[i] - 48) * (10 - i);
int remainder = result % 11;
bool isValid = controlNr == (remainder < 2 ? remainder : 11 - remainder);(\d)\1{9}if (Regex.IsMatch(input, @"(\d)\1{9}"))
{
//Invalid Code...
}var allDigitEqual = new[] { "0000000000", "1111111111", "2222222222", "3333333333", "4444444444", "5555555555", "6666666666", "7777777777", "8888888888", "9999999999" };
if (allDigitEqual.Contains(nationalCode))
return false;if (Regex.IsMatch(nationalCode, @"(\d)\1{9}"))
return false;
public static bool IsValidIranianNationalCode(string input)
{
// input has 10 digits that all of them are not equal
if (!System.Text.RegularExpressions.Regex.IsMatch(input, @"^(?!(\d)\1{9})\d{10}$"))
return false;
var check = Convert.ToInt32(input.Substring(9, 1));
var sum = Enumerable.Range(0, 9)
.Select(x => Convert.ToInt32(input.Substring(x, 1)) * (10 - x))
.Sum() % 11;
return sum < 2 && check == sum || sum >= 2 && check + sum == 11;
}
با استعلام از سازمان ثبت احوال متوجه شدیم که کد ملی 172942284 کاملا صحیحه ولی کد شما اون رو نادرست میدونه.
namespace ConsoleApplicationTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("0172942284 => {0}", "0172942284".IsValidNationalCode());
Console.WriteLine("1000000001 => {0}", "1000000001".IsValidNationalCode());
}
}
public static class Helpers
{
public static Boolean IsValidNationalCode(this String nationalCode)
{
if (String.IsNullOrEmpty(nationalCode))
throw new Exception("لطفا کد ملی را صحیح وارد نمایید");
if (nationalCode.Length != 10)
throw new Exception("طول کد ملی باید ده کاراکتر باشد");
var regex = new Regex(@"[^0-9] ");
if (!regex.IsMatch(nationalCode))
throw new Exception("کد ملی تشکیل شده از ده رقم عددی میباشد؛ لطفا کد ملی را صحیح وارد نمایید");
if (!Regex.IsMatch(nationalCode, @"^(?!(\d)\1{9})\d{10}$"))
return false;
var check = Convert.ToInt32(nationalCode.Substring(9, 1));
var result = Enumerable.Range(0, 9)
.Select(x => Convert.ToInt32(nationalCode.Substring(x, 1)) * (10 - x))
.Sum() % 11;
int remainder = result % 11;
return check == (remainder < 2 ? remainder : 11 - remainder);
}
}
} public static bool IsValidIranianNationalCode(string input)
{
input = input.PadLeft(10, '0');
if (!Regex.IsMatch(input, @"^\d{10}$"))
return false;
var check = Convert.ToInt32(input.Substring(9, 1));
var sum = Enumerable.Range(0, 9)
.Select(x => Convert.ToInt32(input.Substring(x, 1)) * (10 - x))
.Sum() % 11;
return sum < 2 && check == sum || sum >= 2 && check + sum == 11;
} public bool IsValidIranianLegalCode(string input)
{
//input has 11 digits that all of them are not equal
if (!Regex.IsMatch(input, @"^(?!(\d)\1{10})\d{11}$"))
return false;
var check = Convert.ToInt32(input.Substring(10, 1));
int dec = Convert.ToInt32(input.Substring(9, 1)) + 2;
int[] Coef = new int[10] { 29, 27, 23, 19, 17, 29, 27, 23, 19, 17 };
var sum = Enumerable.Range(0, 10)
.Select(x => (Convert.ToInt32(input.Substring(x, 1)) + dec) * Coef[x])
.Sum() % 11;
return sum == check;
} function checkCodeMeli(code)
{
var L=code.length;
if(L<8 || parseInt(code,10)==0) return false;
code=('0000'+code).substr(L+4-10);
if(parseInt(code.substr(3,6),10)==0) return false;
var c=parseInt(code.substr(9,1),10);
var s=0;
for(var i=0;i<9;i++)
s+=parseInt(code.substr(i,1),10)*(10-i);
s=s%11;
return (s<2 && c==s) || (s>=2 && c==(11-s));
return true;
} function checkCodeMeli(code)
{
var L=code.length;
if(L<11 || parseInt(code,10)==0) return false;
if(parseInt(code.substr(3,6),10)==0) return false;
var c=parseInt(code.substr(10,1),10);
var d=parseInt(code.substr(9,1),10)+2;
var z=new Array(29,27,23,19,17);
var s=0;
for(var i=0;i<10;i++)
s+=(d+parseInt(code.substr(i,1),10))*z[i%5];
s=s%11;if(s==10) s=0;
return (c==s);
} sum = sum == 10 ? 0 : sum; return sum == check;
Namespace ConsoleApplicationTest
Class Program
Private Shared Sub Main(args As String())
Console.WriteLine("0172942284 => {0}", "0172942284".IsValidNationalCode())
Console.WriteLine("1000000001 => {0}", "1000000001".IsValidNationalCode())
End Sub
End Class
Public NotInheritable Class Helpers
Private Sub New()
End Sub
<System.Runtime.CompilerServices.Extension> _
Public Shared Function IsValidNationalCode(nationalCode As [String]) As [Boolean]
If [String].IsNullOrEmpty(nationalCode) Then
Throw New Exception("لطفا کد ملی را صحیح وارد نمایید")
End If
If nationalCode.Length <> 10 Then
Throw New Exception("طول کد ملی باید ده کاراکتر باشد")
End If
Dim regex__1 = New Regex("[^0-9]<span> </span>")
If Not regex__1.IsMatch(nationalCode) Then
Throw New Exception("کد ملی تشکیل شده از ده رقم عددی میباشد؛ لطفا کد ملی را صحیح وارد نمایید")
End If
If Not Regex.IsMatch(nationalCode, "^(?!(\d)\1{9})\d{10}$") Then
Return False
End If
Dim check = Convert.ToInt32(nationalCode.Substring(9, 1))
Dim result = Enumerable.Range(0, 9).[Select](Function(x) Convert.ToInt32(nationalCode.Substring(x, 1)) * (10 - x)).Sum() Mod 11
Dim remainder As Integer = result Mod 11
Return check = (If(remainder < 2, remainder, 11 - remainder))
End Function
End Class
End Namespace input = input.PadLeft(10, '0');
if (!Regex.IsMatch(input, @"^\d{10}$"))
return false;