C# sprawdzanie poprawności numeru VIN pojazdu

0

Cześć,

Chciałbym w C# napisać prosty program do sprawdzania poprawności numeru VIN. W google można znaleźć kod funkcji, która sprawdza poprawność numeru VIN dla pojazdów z ameryki, ale ja chciałbym napisać taką funkcję dla europejskich numerów VIN. Ma ktoś na to pomysł lub źródło na podstawie którego można by napisać taką funkcję ?

1

https://www.motofakty.pl/artykul/co-oznacza-numer-vin.html

Dzielisz VIN na sekcje i parsujesz każdą wyciągając informacje.

0

Mając poniższy kod, który tak jak pisałem działa na pojazdy z Ameryki co trzeba zmienić, żeby działał na pojazdy z Europy ???

public object Strings { get; private set; } = "cały numer VIN";

        public static string poczatekVin = "osiem pierwszych znaków numeru VIN";
        public static string koniecVIN = "osiem ostatnich znaków numeru VIN";

        

        public string VIN(string vin1to8, string vin10to17
)
        {
            // Funkcja zwracająca pełny VIN z cyfrą kontrolną po podaniu pierwszych 8 i ostanich 8 liter numeru
            // 
            var iloczyn = 0;
            int i;
            char cyfra_Kontrolna;
            if (vin1to8.Count() != 8)
                return "";
            if (vin10to17.Count() != 8)
                return "";

            Dictionary<char, int> lettervalue = new Dictionary<char, int>()
    {
        {
            'A',
            1
        },
        {
            'B',
            2
        },
        {
            'C',
            3
        },
        {
            'D',
            4
        },
        {
            'E',
            5
        },
        {
            'F',
            6
        },
        {
            'G',
            7
        },
        {
            'H',
            8
        },
        {
            'J',
            1
        },
        {
            'K',
            2
        },
        {
            'L',
            3
        },
        {
            'M',
            4
        },
        {
            'N',
            5
        },
        {
            'P',
            7
        },
        {
            'R',
            9
        },
        {
            'S',
            2
        },
        {
            'T',
            3
        },
        {
            'U',
            4
        },
        {
            'V',
            5
        },
        {
            'W',
            6
        },
        {
            'X',
            7
        },
        {
            'Y',
            8
        },
        {
            'Z',
            9
        },
        {
            '1',
            1
        },
        {
            '2',
            2
        },
        {
            '3',
            3
        },
        {
            '4',
            4
        },
        {
            '5',
            5
        },
        {
            '6',
            6
        },
        {
            '7',
            7
        },
        {
            '8',
            8
        },
        {
            '9',
            9
        },
        {
            '0',
            0
        }
    };

            Dictionary<int, int> positionweight = new Dictionary<int, int>()
    {
        {
            1,
            8
        },
        {
            2,
            7
        },
        {
            3,
            6
        },
        {
            4,
            5
        },
        {
            5,
            4
        },
        {
            6,
            3
        },
        {
            7,
            2
        },
        {
            8,
            10
        },
        {
            9,
            0
        },
        {
            10,
            9
        },
        {
            11,
            8
        },
        {
            12,
            7
        },
        {
            13,
            6
        },
        {
            14,
            5
        },
        {
            15,
            4
        },
        {
            16,
            3
        },
        {
            17,
            2
        }
    };

            i = 1;
            foreach (char litera in vin1to8)
            {
                iloczyn += lettervalue[char.ToUpper(litera)] * positionweight[i];
                i += 1;
            }

            i = 10;
            foreach (char litera in vin10to17)
            {
                iloczyn += lettervalue[char.ToUpper(litera)] * positionweight[i];
                i += 1;
            }

            iloczyn = iloczyn % 11;

            switch (iloczyn)
            {
                case 0:
                    {
                        cyfra_Kontrolna = '0';
                        break;
                    }

                case 1:
                    {
                        cyfra_Kontrolna = '1';
                        break;
                    }

                case 2:
                    {
                        cyfra_Kontrolna = '2';
                        break;
                    }

                case 3:
                    {
                        cyfra_Kontrolna = '3';
                        break;
                    }

                case 4:
                    {
                        cyfra_Kontrolna = '4';
                        break;
                    }

                case 5:
                    {
                        cyfra_Kontrolna = '5';
                        break;
                    }

                case 6:
                    {
                        cyfra_Kontrolna = '6';
                        break;
                    }

                case 7:
                    {
                        cyfra_Kontrolna = '7';
                        break;
                    }

                case 8:
                    {
                        cyfra_Kontrolna = '8';
                        break;
                    }

                case 9:
                    {
                        cyfra_Kontrolna = '9';
                        break;
                    }

                case 10:
                    {
                        cyfra_Kontrolna = 'X';
                        break;
                    }

                default:
                    {
                        return "";
                    }
            }

            return vin1to8 + cyfra_Kontrolna + vin10to17;
        }

        private void simpleButton1_Click(object sender, EventArgs e)
        {
            //VIN(poczatekVin, koniecVIN);
            MessageBox.Show(VIN(txtPoczatekVin.Text, txtKoniecVin.Text).ToString());
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            txtNrVin.Select();
        }

        private void txtNrVin_EditValueChanged(object sender, EventArgs e)
        {
            txtPoczatekVin.Text = txtNrVin.Text.Substring(0, 8);
            txtKoniecVin.Text = txtNrVin.Text.Substring(9, 8);
        }
    }
0

Podstawiając w miejsce całego numeru VIN przykładowo numer: W0L0XCE7564116559 po wykonaniu funkcji numer VIN jest zwracany jako W0L0XCE7264116559, czyli po siódemce zamiast 5 jest 2, zatem działa to niepoprawnie. Funkcja powinna zwrócić identyczny numer VIN. Wie ktoś jak ten problem można wyeliminować ?

1

Ale po co zmieniasz w ogóle ten numer, skoro chcesz sprawdzić jego poprawność? Ta funkcja powinna zwracać bool.

1 użytkowników online, w tym zalogowanych: 0, gości: 1