这是一个营业执照统一社会信用代码的简单校验类
public class RegisterNo
{
protected static ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
static string error_CreditCode = "社会信用代码有误";
static string error_CreditCode_min = "社会信用代码不足18位,请核对后再输!";
static string error_CreditCode_max = "社会信用代码大于18位,请核对后再输!";
static string error_CreditCode_empty = "社会信用代码不能为空!";
static int[] power = { 1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28 };
private static char[] pre17s;
private static Dictionary<string, int> datas = null;
static char[] code = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'T', 'U', 'W', 'X', 'Y' };
/// <summary>
/// 判断是否是一个有效的社会信用代码
/// </summary>
/// <param name="creditCode"></param>
/// <param name="errMsg"></param>
/// <returns></returns>
public static bool IsCreditCode(string creditCode, out string errMsg)
{
try
{
initDatas();
pre17(creditCode);
var flag = false;
if ("".Equals(creditCode) || " ".Equals(creditCode))
{
errMsg = error_CreditCode_empty;
}
else if (creditCode.Length < 18)
{
errMsg = error_CreditCode_min;
}
else if (creditCode.Length > 18)
{
errMsg = error_CreditCode_max;
}
else
{
int sum = GetSum(pre17s);
int temp = sum % 31;
temp = temp == 0 ? 31 : temp;
if (creditCode.Substring(17, 1).Equals(code[31 - temp].ToString()))
{
flag = true;
errMsg = "";
}
else
{
errMsg = error_CreditCode;
}
}
return flag;
}
catch (Exception ex)
{
errMsg = ex.Message;
_log.Error(ex.Message, ex);
return false;
}
}
/**
* @param chars
* @return
*/
private static int GetSum(char[] chars)
{
int sum = 0;
for (int i = 0; i < chars.Length; i++)
{
int code = datas[chars[i].ToString()];
sum += power[i] * code;
}
return sum;
}
/**
* 获取前17位字符
* @param creditCode
*/
static void pre17(string creditCode)
{
String pre17 = creditCode.Substring(0, 17);
pre17s = pre17.ToCharArray();
}
/**
* 初始化数据
* @param count
*/
static void initDatas()
{
datas = new Dictionary<string, int>();
for (int i = 0; i < code.Length; i++)
{
datas.Add(code[i] + "", i);
}
}
}