对于移动商店应用程序,我需要验证IMEI number。我知道如何基于输入长度进行验证,但是他们是否有其他任何验证输入数字的机制?有没有可以实现这一目标的内置功能?
接受并赞赏任何语言的逻辑。
答案 0 :(得分:22)
搜索表明,没有内置功能可验证IMEI号,但有一种使用Luhn algorithm的验证方法。
一般过程:
490154203237518
49015420323751
& 8
。最后一位数字8是验证数字。4 18 0 2 5 8 2 0 3 4 3 14 5 2
(不包括验证数字)4 1 8 0 2 5 8 2 0 3 4 3 1 4 5 2
(请注意18
和14
已被拆分。4+1+8+0+2+5+8+2+0+3+4+3+1+4+5+2
= 52
60
。60 - 52
= 8
。上面步骤1中给出的IMEI是有效的,因为步骤#7中找到的数字是8,它与验证数字匹配。
答案 1 :(得分:2)
根据previous answer中的Karl Nicoll,我用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;
}
答案 2 :(得分:0)
我认为这种逻辑不对,因为这只适用于特定的IMEI no - 490154203237518而不适用于其他IMEI没有...我也实现了代码......
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);
答案 3 :(得分:0)
IMEI可以以0开头。这就是函数输入为字符串的原因。 感谢@KarlNicol方法
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
}
答案 4 :(得分:-1)
我不相信有任何内置方法可以验证IMEI号码。您需要验证第三方数据库(谷歌搜索表明有许多此类服务,但可能他们也从更集中的来源获取信息)。