summaryrefslogtreecommitdiff
path: root/go/luhn/luhn.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-08-27 22:08:55 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-08-27 22:08:55 +0200
commita0698547385e2aa355c9a3c40ffdf1e0c04d63a8 (patch)
tree74b66654dd16b97890748f643508313997e0ad90 /go/luhn/luhn.go
parentcd350a33c56dce01fad81fa5ebb2f1258d2f2455 (diff)
Solve luhn
Diffstat (limited to 'go/luhn/luhn.go')
-rw-r--r--go/luhn/luhn.go42
1 files changed, 42 insertions, 0 deletions
diff --git a/go/luhn/luhn.go b/go/luhn/luhn.go
new file mode 100644
index 0000000..c8ba0ad
--- /dev/null
+++ b/go/luhn/luhn.go
@@ -0,0 +1,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 + "0"))
+ n := (10 - sum%10) % 10
+ return s + string('0'+n)
+}