'Is it possible to validate IMEI Number?

For a mobile shop application, I need to validate an IMEI number. I know how to validate based on input length, but is their any other mechanism for validating the input number? Is there any built-in function that can achieve this?

Logic from any language is accepted, and appreciated.



Solution 1:[1]

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;

}

Solution 2:[2]

I think this logic is not right because this working only for the specific IMEI no - 490154203237518 not for other IMEI no ...I implement the code also...

var number = 490154203237518;
var array1 = new Array();
var array2 = new Array();
var specialno = 0 ;
var sum = 0 ;
var finalsum = 0;
var cast = number.toString(10).split('');
var finalnumber = '';
if(cast.length == 15){
    for(var i=0,n = cast.length; i<n; i++){

        if(i !== 14){
          if(i == 0 || i%2 == 0 ){
            array1[i] = cast[i];
          }else{
            array1[i] = cast[i]*2;
          }
        }else{
           specialno = cast[14];
        }

     }

     for(var j=0,m = array1.length; j<m; j++){
        finalnumber = finalnumber.concat(array1[j]);
     }

     while(finalnumber){
        finalsum += finalnumber % 10;
        finalnumber = Math.floor(finalnumber / 10);
     }

    contno = (finalsum/10);
    finalcontno = Math.round(contno)+1;

    check_specialno = (finalcontno*10) - finalsum; 

    if(check_specialno == specialno){
        alert('Imei')
    }else{
        alert('Not IMEI');
    }
}else{
    alert('NOT imei - length not matching');
}   


 //alert(sum);

Solution 3:[3]

IMEI can start with 0 digit. This is why the function input is string. Thanks for the method @KarlNicol

Golang

func IsValid(imei string) bool {
    digits := strings.Split(imei, "")

    numOfDigits := len(digits)

    if numOfDigits != 15 {
        return false
    }

    checkingDigit, err := strconv.ParseInt(digits[numOfDigits-1], 10, 8)
    if err != nil {
        return false
    }

    checkSum := int64(0)
    for i := 0; i < numOfDigits-1; i++ { // we dont need the last one
        convertedDigit := ""

        if (i+1)%2 == 0 {
            d, err := strconv.ParseInt(digits[i], 10, 8)
            if err != nil {
                return false
            }
            convertedDigit = strconv.FormatInt(2*d, 10)
        } else {
            convertedDigit = digits[i]
        }

        convertedDigits := strings.Split(convertedDigit, "")

        for _, c := range convertedDigits {
            d, err := strconv.ParseInt(c, 10, 8)
            if err != nil {
                return false
            }
            checkSum = checkSum + d
        }

    }

    if (checkSum+checkingDigit)%10 != 0 {
        return false
    }

    return true
}

Solution 4:[4]

According to the previous answer from Karl Nicoll i'm created this function in Python.

from typing import List


def is_valid_imei(imei: str) -> bool:
    def digits_of(s: str) -> List[int]:
        return [int(d) for d in s]

    if len(imei) != 15 or not imei.isdecimal():
        return False

    digits = digits_of(imei)
    last = digits.pop()
    for i in range(1, len(digits), 2):
        digits[i] *= 2
    digits = digits_of(''.join(map(str, digits)))
    return (sum(digits) + last) % 10 == 0

Solution 5:[5]

I don't believe there are any built-in ways to authenticate an IMEI number. You would need to verify against a third party database (googling suggests there are a number of such services, but presumably they also get their information from more centralised sources).

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Pascal
Solution 2 Milan Mahata
Solution 3 Community
Solution 4
Solution 5 roelofs