Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Java метод для проверки корректности VIN / 7 сообщений из 7, страница 1 из 1
31.10.2014, 15:32
    #38793110
May12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java метод для проверки корректности VIN
Все доброго пятничного вечера. Есть задача проверить любые 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
31.10.2014, 16:08
    #38793187
smackmychi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java метод для проверки корректности VIN
May12, а чем регулярные выражения плохи?
...
Рейтинг: 0 / 0
31.10.2014, 16:19
    #38793204
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java метод для проверки корректности VIN
smackmychiMay12, а чем регулярные выражения плохи?
Тем что они провалидируют только формат, но не сами данные.
...
Рейтинг: 0 / 0
31.10.2014, 16:29
    #38793210
Artem_Nav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java метод для проверки корректности VIN
"Я просто оставлю это здесь" (c):
VINChecker - декомпилируется

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


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