-
-
Save insidegui/58778c6aed8c9722dfd1ab8c22f5fcbc to your computer and use it in GitHub Desktop.
Basic implementation to apply different regexes over a card number String and find the card type
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import UIKit | |
//: Basic implementation to apply different regexes over a card number String and find the card type | |
enum CardType:String, CustomStringConvertible { | |
case invalid = "Not valid" | |
case visa = "^4[0-9]{6,}$" | |
case mastercard = "^5[0-9]{6,}$" | |
case amex = "^3[47][0-9]{13}$" | |
case diners = "^3(?:0[0-5]|[68][0-9])[0-9]{11}$" | |
case elo = "^[456](?:011|38935|51416|576|04175|067|06699|36368|36297)\\d{10}(?:\\d{2})?$" | |
case jcb = "^(?:2131|1800|35\\d{3})\\d{11}$" | |
var description: String { | |
switch self { | |
case .invalid: | |
return "Invalid" | |
case .visa: | |
return "Visa" | |
case .mastercard: | |
return "Mastercard" | |
case .amex: | |
return "American Express" | |
case .diners: | |
return "Diners" | |
case .elo: | |
return "Elo" | |
case .jcb: | |
return "JCB" | |
} | |
} | |
func validate(_ cardNumber:String) -> Bool { | |
let predicate = NSPredicate(format: "SELF MATCHES [c] %@", self.rawValue) | |
let result = predicate.evaluate(with: cardNumber) | |
return result | |
} | |
} | |
let cardNumber = "4172368939385121" | |
let supportedTypes = [CardType.visa, .mastercard, .amex, .diners, .elo, .jcb] | |
var cardType = supportedTypes.lazy.first(where: { $0.validate(cardNumber) }) ?? .invalid | |
print("Print card type: \(cardType)") //Prints Visa | |
//: Or Even | |
extension Sequence where Iterator.Element == CardType { | |
func type(of input:String) -> Iterator.Element { | |
let cardType = self.lazy.first(where: { $0.validate(input) }) ?? .invalid | |
return cardType | |
} | |
} | |
extension CardType { | |
static func from(number:String) -> CardType { | |
let type = [CardType.visa, .mastercard, .amex, .diners, .elo, .jcb].type(of: number) | |
return type | |
} | |
} | |
cardType = CardType.from(number: cardNumber) | |
print("Print card type: \(cardType)") //Prints Visa |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment