ChouBox/Utile/HuanMeng.DotNetCore/Utility/OtherExtensions.cs
2025-04-23 19:20:23 +08:00

134 lines
4.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace HuanMeng.DotNetCore.Utility
{
/// <summary>
/// 其它扩展类
/// </summary>
public static class OtherExtensions
{
/// <summary>
/// 验证身份证号是否正确
/// </summary>
/// <param name="idNumber"></param>
/// <returns></returns>
public static bool ValidateIDCard(string idNumber)
{
if (string.IsNullOrEmpty(idNumber))
{
return false;
}
// 验证长度
if (idNumber.Length != 18)
{
return false;
}
// 验证格式
Regex regex = new Regex(@"^\d{17}(\d|X)$");
if (!regex.IsMatch(idNumber))
{
return false;
}
// 验证校验码
return ValidateCheckDigit(idNumber);
}
/// <summary>
/// 验证校验码
/// </summary>
/// <param name="idNumber"></param>
/// <returns></returns>
private static bool ValidateCheckDigit(string idNumber)
{
// 加权因子
int[] weights = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
// 校验码
char[] checkDigits = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };
int sum = 0;
for (int i = 0; i < 17; i++)
{
sum += (idNumber[i] - '0') * weights[i];
}
int mod = sum % 11;
return idNumber[17] == checkDigits[mod];
}
/// <summary>
/// 根据身份证号计算年龄、性别、生日
/// </summary>
/// <param name="identityCard">身份证号</param>
/// <returns></returns>
public static (bool verify, int age, string sex, string birthday) GetIDCardBirthdayAgeSex(string identityCard)
{
var birthday = "";
var age = 0;
var sex = "";
if (string.IsNullOrEmpty(identityCard))
{
return (false, 0, "", "");
}
else
{
if (identityCard.Length != 15 && identityCard.Length != 18)//身份证号码只能为15位或18位其它不合法
{
return (false, 0, "", "");
}
}
birthday = "";
string strSex = string.Empty;
if (identityCard.Length == 18)//处理18位的身份证号码从号码中得到生日和性别代码
{
birthday = identityCard.Substring(6, 4) + "-" + identityCard.Substring(10, 2) + "-" + identityCard.Substring(12, 2);
strSex = identityCard.Substring(14, 3);
}
if (identityCard.Length == 15)
{
birthday = "19" + identityCard.Substring(6, 2) + "-" + identityCard.Substring(8, 2) + "-" + identityCard.Substring(10, 2);
strSex = identityCard.Substring(12, 3);
}
age = CalculateAge(birthday);//根据生日计算年龄
if (int.Parse(strSex) % 2 == 0)//性别代码为偶数是女性奇数为男性
{
sex = "女";
}
else
{
sex = "男";
}
return (true, age, sex, birthday);
}
/// <summary>
/// 根据出生日期,计算精确的年龄
/// </summary>
/// <param name="birthDate">生日</param>
/// <returns></returns>
public static int CalculateAge(string birthDay)
{
DateTime birthDate = DateTime.Parse(birthDay);
DateTime nowDateTime = DateTime.Now;
int age = nowDateTime.Year - birthDate.Year;
//再考虑月、天的因素
if (nowDateTime.Month < birthDate.Month || (nowDateTime.Month == birthDate.Month && nowDateTime.Day < birthDate.Day))
{
age--;
}
return age;
}
}
}