Skip to content

Instantly share code, notes, and snippets.

@BrunoScheltzke
Created May 21, 2021 20:21
Show Gist options
  • Save BrunoScheltzke/06f859a60fa04d4dea309c974ae2e960 to your computer and use it in GitHub Desktop.
Save BrunoScheltzke/06f859a60fa04d4dea309c974ae2e960 to your computer and use it in GitHub Desktop.
Validate CPF and CNPF
extension StringProtocol {
var isValidCNPJ: Bool {
let numbers = compactMap(\.wholeNumberValue)
guard numbers.count == 14 && Set(numbers).count != 1 else { return false }
return numbers.prefix(12).digitoCNPJ == numbers[12] &&
numbers.prefix(13).digitoCNPJ == numbers[13]
}
var isValidCPF: Bool {
let numbers = compactMap(\.wholeNumberValue)
guard numbers.count == 11 && Set(numbers).count != 1 else { return false }
return numbers.prefix(9).digitoCPF == numbers[9] &&
numbers.prefix(10).digitoCPF == numbers[10]
}
}
extension Collection where Element == Int {
var digitoCPF: Int {
var number = count + 2
let digit = 11 - reduce(into: 0) {
number -= 1
$0 += $1 * number
} % 11
return digit > 9 ? 0 : digit
}
var digitoCNPJ: Int {
var number = 1
let digit = 11 - reversed().reduce(into: 0) {
number += 1
$0 += $1 * number
if number == 9 { number = 1 }
} % 11
return digit > 9 ? 0 : digit
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment