学习go语言有一段时间了,最近公司要生成手机IMEI,在网上找了一下,没有合适的,决定弄一个。

IMEI校验码(最右一位)算法: IMEI有15位数,从右至左 (1).将偶数位数字分别乘以2,分别计算个位数和十位数之和 (2).将奇数位数字相加,再加上上一步算得的值 (3).如果得出的数个位是0则校验位为0,否则为10减去个位数 如:35 89 01 80 69 72 41 偶数位乘以2得到52=10 92=18 12=02 02=00 92=18 22=04 1*2=02,计算奇数位数字之和和偶数位个位十位之和,得到 3+(1+0)+8+(1+8)+0+(0+2)+8+(0+0)+6+(1+8)+7+(0+4)+4+(0+2)=63 => 校验位 10-3 = 7,则最后位为7,所以完整是358901806972417 代码如下:

package main

import (
	"fmt"
	"strconv"
)

func main() {
	var start int = 86774106000000
	for i := 0; i < 100; i++ { //生成100个IMEI
		startStr := strconv.Itoa(start)
		last := strconv.Itoa(imei(start))
		fmt.Println(startStr + last)
		start = start + 1
	}
}

//求数字的个位数,十位数..之和,例:sum(18)=9
func sum(i int) int {
	s := strconv.Itoa(i)
	var sum int
	for i := 0; i < len(s); i++ {
		a := string(s[i])
		b, _ := strconv.Atoi(a)
		sum += b
	}
	return sum
}

//求数字的IMEI
func imei(i int) int {
	startStr := fmt.Sprintf("%d", i)
	var allSum, sum1, last int
	for i := 0; i < len(startStr); i++ {
		ch := startStr[i]
		chStr := string(ch)
		if i%2 == 0 {
			chInt, _ := strconv.Atoi((chStr))
			sum1 = chInt
		} else {
			chInt, _ := strconv.Atoi((chStr))
			chIntDouble := chInt * 2
			sum1 = sum(chIntDouble)
		}
		allSum = allSum + sum1
	}
	mod := allSum % 10
	last = 10 - mod
	if last == 10 {
		last = 0
	}
	return last
}