学习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" )
//求数字的个位数,十位数..之和,例: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 }
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 } }