using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Text.RegularExpressions;
using UnityEngine.UI;
public class RealNameAuthentication : MonoBehaviour
{
[SerializeField] private InputField inputField_1;
[SerializeField] private InputField inputField_2;
[SerializeField] private InputField inputField_3;
public void InputFieldParseIdCard()
{
ParseIdCard(inputField_1.text);
}
public void InputFieldCheckIdCard()
{
Debug.Log(CheckIdCard(inputField_2.text));
}
public void InputFieldCheckTwID()
{
Debug.Log( CheckTwID(inputField_3.text));
}
// 输入全部身份证号码,计算出出生年月日以及性别和年龄
private void ParseIdCard(string val)
{
string birthdayValue = "19931221";
string sexId = "";
string sexText = "";
if (15 == val.Length) //15位身份证号码
{
birthdayValue = val[6].ToString() + val[7].ToString();
if (int.Parse(birthdayValue) < 10)
{
birthdayValue = "20" + birthdayValue;
}
else
{
birthdayValue = "19" + birthdayValue;
}
birthdayValue = birthdayValue + '-' + val[8] + val[9] + '-' + val[10] + val[11];
if (int.Parse(((val[14] / 2) * 2).ToString()) != val[14])
{
sexId = "1";
sexText = "男";
}
else
{
sexId = "2";
sexText = "女";
}
}
if (18 == val.Length)
{
//18位身份证号码
birthdayValue = val[6].ToString() + val[7] + val[8] + val[9] + '-' + val[10] + val[11] + '-' + val[12] +
val[13];
if (int.Parse((val[16] / 2).ToString()) * 2 != val[16])
{
sexId = "1";
sexText = "男";
}
else
{
sexId = "2";
sexText = "女";
}
}
//年龄
birthdayValue = birthdayValue.Replace("-", "/");
string[] YMD = birthdayValue.Split('/');
DateTime dt1 = new DateTime(int.Parse(YMD[0]), int.Parse(YMD[1]), int.Parse(YMD[2]));
DateTime dt2 = new DateTime(DateTime.Now.Year,DateTime.Now.Month,DateTime.Now.Day);
int age = dt2.Year - dt1.Year;
var m = dt2.Month - dt1.Month;
if (m < 0)
age--;
Debug.Log(dt1.Year);
Debug.Log(dt2.Year);
// 返回 2017/12/21 "1" "男" 29
Debug.Log($"{birthdayValue}, {sexId}, {sexText}, {age}");
//return new Array(birthdayValue, sexId, sexText, age);
}
// 验证身份证号
private string CheckIdCard(string idcard)
{
idcard = idcard.ToUpper();
string[] Errors = new string[]
{
"校验成功!", "身份证号码位数不对!",
"身份证号码出生日期超出范围或含有非法字符!", "身份证号码校验错误!",
"身份证号码中地区编码不正确!"
};
Dictionary<int, string> area = new Dictionary<int, string>
{
{11, "北京"}, {12, "天津"}, {13, "河北"}, {14, "山西"}, {15, "内蒙古"}, {21, "辽宁"},
{22, "吉林"}, {23, "黑龙江"}, {31, "上海"}, {32, "江苏"}, {33, "浙江"}, {34, "安徽"},
{35, "福建"}, {36, "江西"}, {37, "山东"}, {41, "河南"}, {42, "湖北"}, {43, "湖南"},
{44, "广东"}, {45, "广西"}, {46, "海南"}, {50, "重庆"}, {51, "四川"}, {52, "贵州"}, {53, "云南"}, {54, "西藏"},
{61, "陕西"}, {62, "甘肃"}, {63, "青海"}, {64, "宁夏"}, {65, "新疆"}, {71, "台湾"}, {81, "香港"}, {82, "澳门"}, {91, "国外"}
};
string M, JYM;
double S, Y;
if (idcard.Length != 15 && idcard.Length != 18) return Errors[1];
if (idcard.Substring(0, 6) == "000000" || idcard.Substring(0, 6) == "111111" ||
idcard.Substring(0, 6) == "222222" || idcard.Substring(0, 6) == "333333" ||
idcard.Substring(0, 6) == "444444" || idcard.Substring(0, 6) == "555555" ||
idcard.Substring(0, 6) == "666666" || idcard.Substring(0, 6) == "777777" ||
idcard.Substring(0, 6) == "888888" || idcard.Substring(0, 6) == "999999") return Errors[4];
if (idcard.Substring(0, 6) == "123456" || idcard.Substring(0, 6) == "234567" ||
idcard.Substring(0, 6) == "345678" || idcard.Substring(0, 6) == "456789" ||
idcard.Substring(0, 6) == "567890" || idcard.Substring(0, 6) == "012345" ||
idcard.Substring(0, 6) == "543210" || idcard.Substring(0, 6) == "432109" ||
idcard.Substring(0, 6) == "321098" || idcard.Substring(0, 6) == "210987" ||
idcard.Substring(0, 6) == "109876" || idcard.Substring(0, 6) == "098765" ||
idcard.Substring(0, 6) == "987654" || idcard.Substring(0, 6) == "876543" ||
idcard.Substring(0, 6) == "765432") return Errors[4];
if (idcard.Substring(0, 6) == "121212" || idcard.Substring(0, 6) == "131313" ||
idcard.Substring(0, 6) == "141414" || idcard.Substring(0, 6) == "151515" ||
idcard.Substring(0, 6) == "161616" || idcard.Substring(0, 6) == "171717" ||
idcard.Substring(0, 6) == "181818" || idcard.Substring(0, 6) == "191919" ||
idcard.Substring(0, 6) == "101010") return Errors[4];
if (idcard.Substring(0, 6) == "212121" || idcard.Substring(0, 6) == "232323" ||
idcard.Substring(0, 6) == "242424" || idcard.Substring(0, 6) == "252525" ||
idcard.Substring(0, 6) == "262626" || idcard.Substring(0, 6) == "272727" ||
idcard.Substring(0, 6) == "282828" || idcard.Substring(0, 6) == "292929" ||
idcard.Substring(0, 6) == "202020") return Errors[4];
if (idcard.Substring(0, 6) == "313131" || idcard.Substring(0, 6) == "323232" ||
idcard.Substring(0, 6) == "343434" || idcard.Substring(0, 6) == "353535" ||
idcard.Substring(0, 6) == "363636" || idcard.Substring(0, 6) == "373737" ||
idcard.Substring(0, 6) == "383838" || idcard.Substring(0, 6) == "393939" ||
idcard.Substring(0, 6) == "303030") return Errors[4];
if (idcard.Substring(0, 6) == "414141" || idcard.Substring(0, 6) == "424242" ||
idcard.Substring(0, 6) == "434343" || idcard.Substring(0, 6) == "454545" ||
idcard.Substring(0, 6) == "464646" || idcard.Substring(0, 6) == "474747" ||
idcard.Substring(0, 6) == "484848" || idcard.Substring(0, 6) == "494949" ||
idcard.Substring(0, 6) == "404040") return Errors[4];
if (idcard.Substring(0, 6) == "515151" || idcard.Substring(0, 6) == "525252" ||
idcard.Substring(0, 6) == "535353" || idcard.Substring(0, 6) == "545454" ||
idcard.Substring(0, 6) == "565656" || idcard.Substring(0, 6) == "575757" ||
idcard.Substring(0, 6) == "585858" || idcard.Substring(0, 6) == "595959" ||
idcard.Substring(0, 6) == "505050") return Errors[4];
if (idcard.Substring(0, 6) == "616161" || idcard.Substring(0, 6) == "626262" ||
idcard.Substring(0, 6) == "636363" || idcard.Substring(0, 6) == "646464" ||
idcard.Substring(0, 6) == "656565" || idcard.Substring(0, 6) == "676767" ||
idcard.Substring(0, 6) == "686868" || idcard.Substring(0, 6) == "696969" ||
idcard.Substring(0, 6) == "606060") return Errors[4];
if (idcard.Substring(0, 6) == "717171" || idcard.Substring(0, 6) == "727272" ||
idcard.Substring(0, 6) == "737373" || idcard.Substring(0, 6) == "747474" ||
idcard.Substring(0, 6) == "757575" || idcard.Substring(0, 6) == "767676" ||
idcard.Substring(0, 6) == "787878" || idcard.Substring(0, 6) == "797979" ||
idcard.Substring(0, 6) == "707070") return Errors[4];
if (idcard.Substring(0, 6) == "818181" || idcard.Substring(0, 6) == "828282" ||
idcard.Substring(0, 6) == "838383" || idcard.Substring(0, 6) == "848484" ||
idcard.Substring(0, 6) == "858585" || idcard.Substring(0, 6) == "868686" ||
idcard.Substring(0, 6) == "878787" || idcard.Substring(0, 6) == "898989" ||
idcard.Substring(0, 6) == "808080") return Errors[4];
if (idcard.Substring(0, 6) == "919191" || idcard.Substring(0, 6) == "929292" ||
idcard.Substring(0, 6) == "939393" || idcard.Substring(0, 6) == "949494" ||
idcard.Substring(0, 6) == "959595" || idcard.Substring(0, 6) == "969696" ||
idcard.Substring(0, 6) == "979797" || idcard.Substring(0, 6) == "989898" ||
idcard.Substring(0, 6) == "909090") return Errors[4];
if (area[int.Parse(idcard.Substring(0, 2))] == null) return Errors[4];
string ereg;
switch (idcard.Length)
{
case 15:
if ((int.Parse(idcard.Substring(6, 2)) + 1900) % 4 == 0 ||
((int.Parse(idcard.Substring(6, 2)) + 1900) % 100 == 0 &&
(int.Parse(idcard.Substring(6, 2)) + 1900) % 4 == 0))
{
ereg =
@"^[1-9] [0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2] [0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2] [0-9]|30)|02(0[1-9]|[1-2] [0-9]))[0-9]{3}$"; //测试出生日期的合法性
}
else
{
ereg =
@"^[1-9] [0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2] [0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2] [0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$"; //测试出生日期的合法性
}
if (!Regex.IsMatch(idcard, ereg))
return Errors[0];
else
return Errors[2];
case 18:
if (int.Parse(idcard.Substring(6, 4)) % 4 == 0 || (int.Parse(idcard.Substring(6, 4)) % 100 == 0 &&
int.Parse(idcard.Substring(6, 4)) % 4 == 0))
{
ereg =
@"/^[1 - 9][0 - 9]{ 5}19[0 - 9]{ 2} ((01 | 03 | 05 | 07 | 08 | 10 | 12)(0[1 - 9] |[1 - 2][0 - 9] | 3[0 - 1]) | (04 | 06 | 09 | 11)(0[1 - 9] |[1 - 2][0 - 9] | 30) | 02(0[1 - 9] |[1 - 2][0 - 9]))[0 - 9]{ 3}[0-9Xx]$/"; //闰年出生日期的合法性正则表达式
}
else
{
ereg =
@"/^[1-9] [0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2] [0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2] [0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/"; //平年出生日期的合法性正则表达式
}
if (!Regex.IsMatch(idcard, ereg))
{
S = (double.Parse(idcard[0].ToString()) + double.Parse(idcard[10].ToString())) * 7 +
(double.Parse(idcard[1].ToString()) + double.Parse(idcard[11].ToString())) * 9 +
(double.Parse(idcard[2].ToString()) + double.Parse(idcard[12].ToString())) * 10 +
(double.Parse(idcard[3].ToString()) + double.Parse(idcard[13].ToString())) * 5 +
(double.Parse(idcard[4].ToString()) + double.Parse(idcard[14].ToString())) * 8 +
(double.Parse(idcard[5].ToString()) + double.Parse(idcard[15].ToString())) * 4 +
(double.Parse(idcard[6].ToString()) + double.Parse(idcard[16].ToString())) * 2 +
double.Parse(idcard[7].ToString()) * 1 + double.Parse(idcard[8].ToString()) * 6 +
double.Parse(idcard[9].ToString()) * 3;
Y = S % 11;
M = "F";
JYM = "10X98765432";
M = JYM.Substring((int) Y, 1);
if (M == idcard[17].ToString())
return Errors[0];
else
return Errors[3];
}
else
{
return Errors[2];
}
default:
return Errors[1];
}
}
// 检查身份证格式
private string CheckTwID(string id)
{
/*//建立字母分数数组(A~Z)
int[] citys = new int[]
{
1, 10, 19, 28, 37, 46, 55, 64, 39, 73, 82, 2, 11,
20, 48, 29, 38, 47, 56, 65, 74, 83, 21, 3, 12, 30
};
id = id.ToUpper();
// 使用「正规表达式」检验格式
if (!Regex.IsMatch(id, @"/^[A - Z](1 | 2)\d{8}$/ i"))
{
return "身份证号码格式不对!";
}
else
{
//计算总分
//C#中用 Convert.ToByte(A[i]) 就跟 as语言或js语言中 .charCodeAt() 输出结果是一样的
var total = citys[Convert.ToByte(id[0]) - 65];
for (var i = 1; i <= 8; i++)
{
total += ((id[i]) * (9 - i));
}
//补上检查码(最后一码)
total += id[9];
//检查比对码(余数应为0);
if (total % 10 == 0)
{
return "true";
}
else
{
return "身份证号码格式不对!";
}
}*/
string pattern = @"^\d{17}(?:\d|X)$";
string birth = id.Substring(6, 8).Insert(6, "-").Insert(4, "-");
DateTime time = new DateTime();
int[] arr_weight = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; // 加权数组
string[] id_last = { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" }; // 校验数组
int sum = 0;
for (int i = 0; i < 17; i++)
{
sum += arr_weight[i] * int.Parse(id[i].ToString());
}
int result = sum % 11; // 实际校验位的值
if (Regex.IsMatch(id, pattern)) // 18位格式检查
{
if(DateTime.TryParse(birth, out time)) // 出生日期检查
{
if (id_last[result] == id[17].ToString()) // 校验位检查
{
return ("身份证号格式正确!");
}
else
{
return("最后一位校验错误!");
}
}
else
{
return("出生日期验证失败!");
}
}
else
{
return("身份证号格式错误!");
}
}
}