using System;
名前空間Sp.Common
{
public class ValidatorHelper
{
/// <summary>
/// IDカードの番号に対応するアドレス
/// </ summary>
// enum IDAddress
// {
// Beijing = 11、Tianjin = 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
// }
/// <summary>
/// 世代IDカード番号(15桁)を確認します
/// [15桁の番号;対応する都道府県の住所と一致します;誕生日は正しく一致します]
/// </ summary>
/// <param name = "input"> 検証する文字列</ param>
/// <returns> 一致するかどうか</
return > public static bool IsIDCard15(string input)
{
// 15桁に変換できるかどうかを検証するInteger
long l = 0 ;
if(!Long .TryParse(input、out l)|| l.ToString()。Length!= 15 )
{
リターン falseに;
}
//は一致州確認
@ ビット1,2-州政府市役所コード5の符号ビット3,4の数であるエリアコードのための1〜6を、 6桁の数字は、郡および地区の政府コードです。
文字列アドレス= " 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、" ;
if(!Address.Contains(input.Remove(2)+ " 、" ))
{
return false ;
}
// 検証誕生日の一致
文字列 BIRTHDATE = input.Substring(6、6).Insert(4、" / ").Insert(2、" / " );
のDateTime DT;
IF(DateTime.TryParse(BIRTHDATE、!OUTのDT))
{
リターン falseに;
}
戻り trueに;
}
/// <概要>
/// 第2世代のID番号(18桁、GB11643-1999規格)を確認します
/// [長さは18桁です。最初の17桁は数字で、最後の桁(チェックコード)は大文字と小文字のxにすることができます。対応する州の住所と一致します。誕生日を正しく一致させることができます。チェックコードを正しく一致させることができます]
/// </ summary>
/// <param name = "input"> 検証する文字列</ param>
/// <returns> 一致するか</
return > public static bool IsIDCard18(string input)
{
// 正しい整数に変換できることを確認する
long l = 0 ;
if(!long .TryParse(input.Remove(17)、out l) || l.ToString()。長さ!= 17 ||!long .TryParse(input.Replace(' x '、' 0 ').Replace(' X '、' 0 ')、out l))
{
戻る falseに;
}
//は一致州確認
@ ビット1,2-州政府市役所符号の符号ビット3,4の数であるエリアコードのための6 1〜5 、郡と地区の政府コードは6桁。
文字列アドレス= " 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、" ;
if(!Address.Contains(input.Remove(2)+ " 、" ))
{
return false ;
}
// 検証誕生日の一致
文字列 BIRTHDATE = input.Substring(6、8).Insert(6。 、" / ").Insert(4。 、" / " );
日時DT、
IF(DateTime.TryParse(BIRTHDATE ,! OUT DT))
{
リターン falseに;
}
// チェックコードの検証
// 補正チェックコード:
// (1)17桁の本体コードの加重和式
// S =和(Ai * Wi)、i = 0、...、16、最初の17桁の重みの合計
/ / Ai:i番目の位置のID番号のデジタル値を
示します// Wi:i番目の位置の重み係数を示します
//Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
// (2)modを計算する
// Y = mod(S、11)
// (3)modによって対応するチェックコードを取得する
/ / Y:0 1 2 3 4 5 6 7 8 9 10
// チェックコード:1 0 X 9 8 7 6 5 4 3 2
string [] arrVarifyCode =(" 1,0、x、9,8,7、 6,5,4,3,2 ").split(' ' );
文字列 []のWi =(" 7,9,10,5,8,4,2,1,6,3,7,9、 10,5,8,4,2 ").Split(' 、' );
char [] Ai = input.Remove(17).ToCharArray();
int sum = 0 ;
for(int i = 0 ; i < 17 ; i ++ )
{
sum + = int .Parse(Wi [i])* int .Parse(Ai [i] .ToString());
}
int y = -1 ;
Math.DivRem(合計、11、アウトy);
もし(arrVarifyCode [Y]!= input.Substring(17、1 ).ToLower())
{
戻り 偽;
}
return true ;
}
/// <summary>
/// ID番号を確認する(第1世代と第2世代のID番号を区別しない)
/// </ summary>
/// <param name = "input"> 確認待ちString </ param>
/// <returns> 一致するか</
return > public static bool IsIDCard(string input)
{
if(input.Length == 18 )
return IsIDCard18(input);
else if(input.Length == 15 )
戻るIsIDCard15(入力);
それ以外の場合は
falseを返し ます。
}
}
}