C# 校验车架号(VIN码)第9位是否有效算法
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; }