public static bool checkVIN(string vin)
{
//VIN码从第1位到第17位的“加权值”:
Dictionary<int, int> vinMapWeighting = new Dictionary<int, int>();
vinMapWeighting.Add(1, 8);
vinMapWeighting.Add(2, 7);
vinMapWeighting.Add(3, 6);
vinMapWeighting.Add(4, 5);
vinMapWeighting.Add(5, 4);
vinMapWeighting.Add(6, 3);
vinMapWeighting.Add(7, 2);
vinMapWeighting.Add(8, 10);
vinMapWeighting.Add(9, 0);
vinMapWeighting.Add(10, 9);
vinMapWeighting.Add(11, 8);
vinMapWeighting.Add(12, 7);
vinMapWeighting.Add(13, 6);
vinMapWeighting.Add(14, 5);
vinMapWeighting.Add(15, 4);
vinMapWeighting.Add(16, 3);
vinMapWeighting.Add(17, 2);
//VIN码各位数字的“对应值”
Dictionary<string, int> vinMapValue = new Dictionary<string, int>();
vinMapValue.Add("0", 0);
vinMapValue.Add("1", 1);
vinMapValue.Add("2", 2);
vinMapValue.Add("3", 3);
vinMapValue.Add("4", 4);
vinMapValue.Add("5", 5);
vinMapValue.Add("6", 6);
vinMapValue.Add("7", 7);
vinMapValue.Add("8", 8);
vinMapValue.Add("9", 9);
vinMapValue.Add("A", 1);
vinMapValue.Add("B", 2);
vinMapValue.Add("C", 3);
vinMapValue.Add("D", 4);
vinMapValue.Add("E", 5);
vinMapValue.Add("F", 6);
vinMapValue.Add("G", 7);
vinMapValue.Add("H", 8);
vinMapValue.Add("J", 1);
vinMapValue.Add("K", 2);
vinMapValue.Add("M", 4);
vinMapValue.Add("L", 3);
vinMapValue.Add("N", 5);
vinMapValue.Add("P", 7);
vinMapValue.Add("R", 9);
vinMapValue.Add("S", 2);
vinMapValue.Add("T", 3);
vinMapValue.Add("U", 4);
vinMapValue.Add("V", 5);
vinMapValue.Add("W", 6);
vinMapValue.Add("X", 7);
vinMapValue.Add("Y", 8);
vinMapValue.Add("Z", 9);
bool reultFlag = false;
string uppervin = vin.ToLower();
//排除字母O、I
if (vin == null || uppervin.IndexOf("O") >= 0 || uppervin.IndexOf("I") >= 0)
{
reultFlag = false;
}
else
{
//1:长度为17
if (vin.Length == 17)
{
int len = uppervin.Length;
string[] vinArr = new string[len];
for (int i = 0; i < len; i++)
{
vinArr[i] = uppervin.Substring(i, 1);
}
int amount = 0;
for (int i = 0; i < vinArr.Length; i++)
{
//VIN码从从第一位开始,码数字的对应值×该位的加权值,计算全部17位的乘积值相加
if (vinMapValue.ContainsKey(vinArr[i].ToUpper()))
amount += vinMapValue[vinArr[i].ToUpper()] * vinMapWeighting[i + 1];
}
//乘积值相加除以11、若余数为10,即为字母X
if (amount % 11 == 10)
{
if (vinArr[8].ToUpper() == "X")
{
reultFlag = true;
}
else
{
reultFlag = false;
}
}
else
{
//VIN码从从第一位开始,码数字的对应值×该位的加权值,计算全部17位的乘积值相加除以11,所得的余数,即为第九位校验值
if (vinMapValue.ContainsKey(vinArr[8].ToUpper()))
{
if (amount % 11 != vinMapValue[vinArr[8].ToUpper()])
{
reultFlag = false;
}
else
{
reultFlag = true;
}
}
}
}
//1:长度不为17
if (!vin.Equals("") && vin.Length != 17)
{
reultFlag = false;
}
}
return reultFlag;
}