###### 身份证号码有效性检测算法 ( js版 转 C#版 )

C#版

#region 检测是否是正确的身份证

/// <summary>

/// 身份证验证

/// </summary>

/// <param name="num"></param>

/// <returns></returns>

public static bool isIdCardNo(string cardid)

{

string num = cardid.ToUpper();

int[] factorArr = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 };

char[] parityBit = new char[] { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };

char[] varArray = new char[18];

var lngProduct = 0;

int intCheckDigit = 0;

var intStrLen = num.Length;

var idNumber = num;

// initialize

if ((intStrLen != 15) && (intStrLen != 18))

{

return false;

}

// check and set value

for (int i = 0; i < intStrLen; i++)

{

varArray[i] = (char)Convert.ToInt32(idNumber[i]);

if (((varArray[i] - 48) < 0 || (varArray[i] - 48) > 9) && (i != 17))

{

return false;

}

else if (i < 17)

{

varArray[i] = (char)((varArray[i] - 48) * factorArr[i]);

}

}

if (intStrLen == 18)

{

//check date

var date8 = idNumber.Substring(6, 8);

if (isDate8(date8) == false)

{

return false;

}

// calculate the sum of the products

for (int i = 0; i < 17; i++)

{

lngProduct = lngProduct + varArray[i];

}

// calculate the check digit

intCheckDigit = parityBit[lngProduct % 11];

// check last digit

if (varArray[17] != intCheckDigit)

{

return false;

}

}

else

{        //length is 15

//check date

var date6 = idNumber.Substring(6, 6);

if (isDate6(date6) == false)

{

return false;

}

}

return true;

}

/// <summary>

/// 15位身份证日期检测--年/月--6位

/// </summary>

/// <param name="sDate"></param>

/// <returns></returns>

static bool isDate6(string sDate)

{

if (!Regex.IsMatch(sDate, "^[0-9]{6}$")) { return false; } int year, month; year = Convert.ToInt32(sDate.Substring(0, 4)); month = Convert.ToInt32(sDate.Substring(4, 2)); if (year < 1700 || year > 2500) return false; if (month < 1 || month > 12) return false; return true; } /// <summary> /// 18位身份证日期检测--年/月/日--8位 /// </summary> /// <param name="sDate"></param> /// <returns></returns> static bool isDate8(string sDate) { if (!Regex.IsMatch(sDate, "^[0-9]{8}$"))

{

return false;

}

int year, month, day;

year = Convert.ToInt32(sDate.Substring(0, 4));

month = Convert.ToInt32(sDate.Substring(4, 2));

day = Convert.ToInt32(sDate.Substring(6, 2));

int[] iaMonthDays = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

if (year < 1700 || year > 2500) return false;

if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) iaMonthDays[1] = 29;

if (month < 1 || month > 12) return false;

if (day < 1 || day > iaMonthDays[month - 1]) return false;

return true;

}

#endregion

function isIdCardNo(num) {

var factorArr = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1);

var parityBit = new Array("1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2");

var varArray = new Array();

var intValue;

var lngProduct = 0;

var intCheckDigit;

var intStrLen = num.length;

var idNumber = num;

// initialize

if ((intStrLen != 15) && (intStrLen != 18)) {

return false;

}

// check and set value

for (i = 0; i < intStrLen; i++) {

varArray[i] = idNumber.charAt(i);

if ((varArray[i] < '0' || varArray[i] > '9') && (i != 17)) {

return false;

} else if (i < 17) {

varArray[i] = varArray[i] * factorArr[i];

}

}

if (intStrLen == 18) {

//check date

var date8 = idNumber.substring(6, 14);

if (isDate8(date8) == false) {

return false;

}

// calculate the sum of the products

for (i = 0; i < 17; i++) {

lngProduct = lngProduct + varArray[i];

}

// calculate the check digit

intCheckDigit = parityBit[lngProduct % 11];

// check last digit

if (varArray[17] != intCheckDigit) {

return false;

}

}

else {        //length is 15

//check date

var date6 = idNumber.substring(6, 12);

if (isDate6(date6) == false) {

return false;

}

}

return true;

}

function isDate6(sDate) {

if (!/^[0-9]{6}$/.test(sDate)) { return false; } var year, month, day; year = sDate.substring(0, 4); month = sDate.substring(4, 6); if (year < 1700 || year > 2500) return false if (month < 1 || month > 12) return false return true } /** * 判断是否为“YYYYMMDD”式的时期 * */ function isDate8(sDate) { if (!/^[0-9]{8}$/.test(sDate)) {

return false;

}

var year, month, day;

year = sDate.substring(0, 4);

month = sDate.substring(4, 6);

day = sDate.substring(6, 8);

var iaMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

if (year < 1700 || year > 2500) return false

if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) iaMonthDays[1] = 29;

if (month < 1 || month > 12) return false

if (day < 1 || day > iaMonthDays[month - 1]) return false

return true

}

#### 中国大陆18位身份证校验算法（附JS实现）

2011-05-20 23:15:00

#### js实现完美身份证号有效性验证

2017-06-22 11:30:38

#### JS 姓名、身份证号检测

2017-06-20 09:24:43

#### js实现完美身份证号有效性验证

2014-10-27 16:27:50

#### javascript实现验证身份证号的有效性并提示

2017-03-28 15:58:29

#### js实现身份证号有效性验证

2015-07-30 14:46:42

#### js实现完美身份证号有效性验…

2017-02-23 17:24:52

#### 身份证号码有效性验证

2017-09-15 16:40:48

#### 身份证有效性校验

2016-10-19 10:54:48

#### JS验证身份证有效性

2017-10-27 09:47:30