powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Java метод для проверки корректности VIN
7 сообщений из 7, страница 1 из 1
Java метод для проверки корректности VIN
    #38793110
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все доброго пятничного вечера. Есть задача проверить любые VIN любых годов на корректность (по длине, по контрольным цифрам и вроде там еще какие-то проверки есть). Хотелось потратить на эту задачу меньше времени, в результате нашлось пару методов:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
 public static boolean isVinValid(String vin) {
       int[] values = { 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 0, 7, 0, 9,
               2, 3, 4, 5, 6, 7, 8, 9 };
       int[] weights = { 8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2 };
      

       String s = vin;
       s = s.replaceAll("-", "");
       s = s.replaceAll(" ", "");
       s = s.toUpperCase();
       if (s.length() != 17)
           throw new RuntimeException("VIN number must be 17 characters");

       int sum = 0;
       for (int i = 0; i < 17; i++) {
           char c = s.charAt(i);
           int value;
           int weight = weights[i];

           // letter
           if (c >= 'A' && c <= 'Z') {
               value = values[c - 'A'];
               if (value == 0)
                   throw new RuntimeException("Illegal character: " + c);
           }

           // number
           else if (c >= '0' && c <= '9')
               value = c - '0';

           // illegal character
           else
               throw new RuntimeException("Illegal character: " + c);

           sum = sum + weight * value;

       }
      

       // check digit
       sum = sum % 11;
       char check = s.charAt(8);
       if (sum == 10 && check == 'X') {
           System.out.println("Valid");
           return true;
       } else if (sum == transliterate(check)) {
           System.out.println("Valid");
           return true;
       } else {
           System.out.println("Invalid");
           return false;
       } 

   }
   
   private static int transliterate(char check){
     if(check == 'A' || check == 'J'){
   		return 1;
   	} else if(check == 'B' || check == 'K' || check == 'S'){
   		return 2;
   	} else if(check == 'C' || check == 'L' || check == 'T'){
   		return 3;
   	} else if(check == 'D' || check == 'M' || check == 'U'){
   		return 4;
   	} else if(check == 'E' || check == 'N' || check == 'V'){
   		return 5;
   	} else if(check == 'F' || check == 'W'){
   		return 6;
   	} else if(check == 'G' || check == 'P' || check == 'X'){
   		return 7;
   	} else if(check == 'H' || check == 'Y'){
   		return 8;
   	} else if(check == 'R' || check == 'Z'){
   		return 9;
   	} else if(Integer.valueOf(Character.getNumericValue(check)) != null){ //hacky but works
   		return Character.getNumericValue(check);
   	}
   	return -1;
   }
   
   
   
   public static boolean isVinValid2(String VIN) {
       int[] values = { 1, 2, 3, 4, 5, 6, 7, 8, 0, 1,
                        2, 3, 4, 5, 0, 7, 0, 9, 2, 3,
                        4, 5, 6, 7, 8, 9 };
       int[] weights = { 8, 7, 6, 5, 4, 3, 2, 10, 0, 9,
                         8, 7, 6, 5, 4, 3, 2 };

       VIN = VIN.replaceAll("-", "");
       VIN = VIN.toUpperCase();
       if (VIN.length() != 17)
               return false;
           //throw new RuntimeException("VIN number must be 17 characters");

       int sum = 0;
       for (int i = 0; i < 17; i++) {
           char c = VIN.charAt(i);
           int value;
           int weight = weights[i];

           // letter
           if (c >= 'A' && c <= 'Z') {
               value = values[c - 'A'];
               if (value == 0)
                       return false;
                   //throw new RuntimeException("Illegal character: " + c);
           }

           // number
           else if (c >= '0' && c <= '9') value = c - '0';
               
           // illegal character
           else return false; //throw new RuntimeException("Illegal character: " + c);

           sum = sum + weight * value;

       }

       // check digit
       sum = sum % 11;
       char check = VIN.charAt(8);
       if (check != 'X' && (check < '0' || check > '9'))
               return false;
           //throw new RuntimeException("Illegal check digit: " + check);
       if      (sum == 10 && check == 'X') return true; // System.out.println("Valid");
       else if (sum == check - '0')        return true; // System.out.println("Valid");
       else                                return false; // System.out.println("Invalid");

   }




Потестировала. Примеры корректных винов взяла с автомобильных сайтов. По корейским авто (не по всем) методы сообщают, что вин не валиден, то же - с автомобилями рено.
Может у кого есть проверенные решения для подобных задач? Поделитесь.
...
Рейтинг: 0 / 0
Java метод для проверки корректности VIN
    #38793187
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
May12, а чем регулярные выражения плохи?
...
Рейтинг: 0 / 0
Java метод для проверки корректности VIN
    #38793204
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smackmychiMay12, а чем регулярные выражения плохи?
Тем что они провалидируют только формат, но не сами данные.
...
Рейтинг: 0 / 0
Java метод для проверки корректности VIN
    #38793210
Artem_Nav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Я просто оставлю это здесь" (c):
VINChecker - декомпилируется

vin-decoder
...
Рейтинг: 0 / 0
Java метод для проверки корректности VIN
    #38793305
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz, ну, тогда сразу со структурой VIN и работать.
...
Рейтинг: 0 / 0
Java метод для проверки корректности VIN
    #38793339
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12, transliterate () какой-то некрасивый. А можно его через switch переписать.
...
Рейтинг: 0 / 0
Java метод для проверки корректности VIN
    #38794234
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, это не я писала, хотя навряд ли я бы лучше сделала.
Artem_Nav, спасибо. я натыкалась на vin-decoder, но его функциональности для моего случая избыточны.
я его посмотрю повнимательнее.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Java метод для проверки корректности VIN
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]