summaryrefslogtreecommitdiff
path: root/go/luhn/luhn.go
blob: 5da01f7b0a90f21c3d98ee8c6a41a1f720ae2cdf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package luhn

import "unicode"

func normalize(s string) string {
	var r []rune
	for _, v := range s {
		if unicode.IsNumber(v) {
			r = append(r, v)
		}
	}
	return string(r)
}

func chksum(s string) int {
	var sum int
	for i, v := range s {
		n := int(v - '0')
		if (len(s)-i)%2 == 0 {
			n *= 2
			if n > 9 {
				n -= 9
			}
		}
		sum += n
	}
	return sum
}

func Valid(s string) bool {
	s = normalize(s)
	if len(s) == 0 {
		return false
	}
	return chksum(s)%10 == 0
}

func AddCheck(s string) string {
	sum := chksum(normalize(s + "9"))
	n := 9 - sum%10
	return s + string('0'+rune(n))
}