Кто-нибудь знает, как улучшить эту функцию? Я не беспокоюсь о сокращении кода, я уверен, что это может быть сделано с лучшим регулярным выражением, меня больше беспокоит правильная логика. У меня было ужасное время найти документацию для SSN #. Большинство правил, которые я использую ниже, поступают от других программистов, работающих в кредитной индустрии (источники не цитируются).
- Есть ли дополнительные правила, которые вы знаете?
- Знаете ли вы, что это неправильно?
- Можете ли вы разместить свои источники?
Спасибо за понимание!
public static bool isSSN(string ssn)
{
Regex rxBadSSN = new Regex(@"(\d)\1\1\1\1\1\1\1\1");
//Must be 9 bytes
if(ssn.Trim().Length != 9)
return false;
//Must be numeric
if(!isNumeric(ssn))
return false;
//Must be less than 772999999
if( (Int32)Double.Parse(ssn.Substring(0,3)) > 772 )
{
//Check for Green Card Temp SSN holders
// Could be 900700000
// 900800000
if(ssn.Substring(0,1) != "9")
return false;
if(ssn.Substring(3,1) != "7" && ssn.Substring(3,1) != "8")
return false;
}
//Obviously Fake!
if(ssn == "123456789")
return false;
//Try again!
if(ssn == "123121234")
return false;
//No single group can have all zeros
if(ssn.Substring(0,3) == "000")
return false;
if(ssn.Substring(3,2) == "00")
return false;
if(ssn.Substring(5,4) == "0000")
return false;
//Check to make sure the SSN number is not repeating
if (rxBadSSN.IsMatch(ssn))
return false;
return true;
}