-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathvalidation.go
More file actions
157 lines (145 loc) · 3.16 KB
/
validation.go
File metadata and controls
157 lines (145 loc) · 3.16 KB
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
package xstrings
import (
"net/mail"
)
// IsValidCNPJ returns true if the input is a valid CNPJ.
func IsValidCNPJ(cnpj string) bool {
return validateCNPJ(cnpj) != ""
}
// IsValidCPF returns true if the input is a valid cpf
func IsValidCPF(cpf string) bool {
return validateCPF(cpf) != ""
}
// IsValidEmail returns true if the email appears to be valid. Uses net/mail
// internally.
func IsValidEmail(email string) bool {
_, err := mail.ParseAddress(email)
return err == nil
}
// IsValidIntlMobilePhoneNumber returns true if the input is a valid
// international mobile phone number.
func IsValidIntlMobilePhoneNumber(phone string) bool {
return isValidInternationalPhoneNumber(phone, true)
}
// IsValidIntlPhoneNumber returns true if the input is a valid international
// phone number.
func IsValidIntlPhoneNumber(phone string) bool {
return isValidInternationalPhoneNumber(phone, false)
}
// ValidCPF returns a string containing the valid cpf with numbers only if the input is valid and an empty string otherwise
//
// Deprecated: use IsValidCPF instead
func ValidCPF(cpf string) (validCpf string) {
return validateCPF(cpf)
}
// ValidCNPJ returns a string containing the valid cnpj with numbers only if the input is valid and an empty string otherwise
//
// Deprecated: use IsValidCNPJ instead
func ValidCNPJ(cnpj string) (validCnpj string) {
return validateCNPJ(cnpj)
}
func isValidInternationalPhoneNumber(phone string, mustBeMobile bool) bool {
fullnum := FormatNumeric(phone)
if len(fullnum) < 7 || len(fullnum) > 15 {
// https://en.wikipedia.org/wiki/E.164
return false
}
if fullnum[:2] == "55" {
if mustBeMobile {
return len(fullnum) == 13
}
return len(fullnum) >= 12 && len(fullnum) <= 13
}
return true
}
func validateCPF(cpf string) (validCpf string) {
v := FormatNumeric(cpf)
if len(v) != 11 {
return
}
same := true
for i := 0; i < len(v)-1; i++ {
if v[i] != v[i+1] {
same = false
break
}
}
if same {
return
}
sum := 0
numeros := v[:9]
digitos := v[9:]
for i := 10; i > 1; i-- {
sum += runeV(rune(numeros[10-i])) * i
}
var result int
if sum%11 < 2 {
result = 0
} else {
result = 11 - sum%11
}
if result != runeV(rune(digitos[0])) {
return
}
numeros = v[:10]
sum = 0
for i := 11; i > 1; i-- {
sum += runeV(rune(numeros[11-i])) * i
}
if sum%11 < 2 {
result = 0
} else {
result = 11 - sum%11
}
if result != runeV(rune(digitos[1])) {
return
}
return v
}
var cnpjDigs = []int{6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2}
func validateCNPJ(cnpj string) (validCnpj string) {
v := NumbersOnly(cnpj)
if len(v) != 14 {
return
}
same := true
for i := 0; i < len(v)-1; i++ {
if v[i] != v[i+1] {
same = false
break
}
}
if same {
return
}
sum := 0
numeros := v[:12]
digitos := v[12:]
for i, numero := range numeros {
sum += runeV(numero) * cnpjDigs[i+1]
}
var result int
if sum%11 < 2 {
result = 0
} else {
result = 11 - sum%11
}
if result != runeV(rune(digitos[0])) {
return
}
numeros = v[:13]
sum = 0
for i, numero := range numeros {
sum += runeV(numero) * cnpjDigs[i]
}
if sum%11 < 2 {
result = 0
} else {
result = 11 - sum%11
}
if result != runeV(rune(digitos[1])) {
return
}
return v
}