Is it possible to validate IMEI Number?
A search suggests that there isn't a built-in function that will validate an IMEI number, but there is a validation method using the Luhn algorithm.
General process:
- Input IMEI:
490154203237518
- Take off the last digit, and remember it:
49015420323751
&8
. This last digit 8 is the validation digit. - Double each second digit in the IMEI:
4 18 0 2 5 8 2 0 3 4 3 14 5 2
(excluding the validation digit) - Separate this number into single digits:
4 1 8 0 2 5 8 2 0 3 4 3 1 4 5 2
(notice that18
and14
have been split). - Add up all the numbers:
4+1+8+0+2+5+8+2+0+3+4+3+1+4+5+2
=52
- Take your resulting number, remember it, and round it up to the nearest multiple of ten:
60
. - Subtract your original number from the rounded-up number:
60 - 52
=8
. - Compare the result to your original validation digit. If the two numbers match, your IMEI is valid.
The IMEI given in step 1 above is valid, because the number found in step #7 is 8, which matches the validation digit.
According to the previous answer from Karl Nicoll i'm created this method in Java.
public static int validateImei(String imei) {
//si la longitud del imei es distinta de 15 es invalido
if (imei.length() != 15)
return CheckImei.SHORT_IMEI;
//si el imei contiene letras es invalido
if (!PhoneNumber.allNumbers(imei))
return CheckImei.MALFORMED_IMEI;
//obtener el ultimo digito como numero
int last = imei.charAt(14) - 48;
//duplicar cada segundo digito
//sumar cada uno de los digitos resultantes del nuevo imei
int curr;
int sum = 0;
for (int i = 0; i < 14; i++) {
curr = imei.charAt(i) - 48;
if (i % 2 != 0){
// sum += duplicateAndSum(curr);
// initial code from Osvel Alvarez Jacomino contains 'duplicateAndSum' method.
// replacing it with the implementation down here:
curr = 2 * curr;
if(curr > 9) {
curr = (curr / 10) + (curr - 10);
}
sum += curr;
}
else {
sum += curr;
}
}
//redondear al multiplo de 10 superior mas cercano
int round = sum % 10 == 0 ? sum : ((sum / 10 + 1) * 10);
return (round - sum == last) ? CheckImei.VALID_IMEI_NO_NETWORK : CheckImei.INVALID_IMEI;
}