# 身份证号码有效性检测算法 ( 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

}

• 本文已收录于以下专栏：

## 身份证号码有效性检测

• baidu_15100009
• 2017年03月21日 16:23
• 285

## A*算法JS版本

• cloudandy
• 2007年12月16日 20:51
• 612

## js 验证身份证号码正确性

• zl541907196
• 2013年11月21日 21:00
• 3711

## C#验证身份证是否有效

• f10_s
• 2013年12月26日 10:56
• 2608

## C# 15位身份证号码转18位算法实现

• zlb168
• 2011年03月12日 11:01
• 2062

## C# 验证URL有效性

TEST 这篇日志，是直接从OneNote 2010里面发送到CSDN上去的！！ 发送接口如下： http://blog.csdn.net/jxitc/services/metablogapi.a...
• jxitc
• 2011年01月18日 05:08
• 3052

## C#识别身份证号码（经典版）

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin...
• lucky51222
• 2015年10月17日 22:14
• 3017

## 18位身份证号验证算法的原理以及C#实现和在管理系统的应用

• u013871100
• 2016年07月10日 00:16
• 1967

## 中国大陆身份证号码有效性验证

package test; import java.text.SimpleDateFormat; import java.util.Date; /** * 身份证号码,可以解析身份证...
• wxl3105
• 2011年11月24日 00:27
• 4612

## 把15位身份证转成18位的JS代码

• java2000_net
• 2008年10月20日 19:28
• 4474

举报原因： 您举报文章：身份证号码有效性检测算法 ( js版 转 C#版 ) 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)