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
二、JS版
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
}