Advertisement
Guest User

credit card types

a guest
Sep 7th, 2017
369
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 4.50 KB | None | 0 0
  1. /**
  2.  * Different kinds of credit cards.
  3.  *
  4.  * Reference from [credit-card-type](https://github.com/braintree/credit-card-type)
  5.  */
  6. sealed class CreditCardType {
  7.     abstract val name: String
  8.     abstract val prefixPattern: Regex
  9.     abstract val gaps: IntArray
  10.     abstract val lengths: IntArray
  11.     abstract val securityCodeLength: Int
  12.  
  13.     companion object {
  14.         private val types: List<CreditCardType> = listOf(Visa, MasterCard, AmericanExpress, DinersClub, Discovery, Jcb, UnionPay, Maestro)
  15.  
  16.         fun matchCardNumber(cardNumber: String): List<CreditCardType> = types.filter { type -> type.prefixPattern.find(cardNumber) != null }
  17.  
  18.         fun matchName(name: String): CreditCardType = types.first { type -> type.name == name }
  19.  
  20.         fun getIcon(cardType: CreditCardType): Int = when (cardType) {
  21.             Visa -> R.drawable.ic_credit_card_visa
  22.             MasterCard -> R.drawable.ic_credit_card_mastercard
  23.             AmericanExpress -> R.drawable.ic_credit_card_amerian_express
  24.             DinersClub -> R.drawable.ic_credit_card_dinerclub
  25.             Discovery -> R.drawable.ic_credit_card_discover
  26.             Jcb -> R.drawable.ic_credit_card_jcb
  27.             UnionPay -> R.drawable.ic_credit_card_unionpay
  28.             Maestro -> R.drawable.ic_credit_card_maestro
  29.         }
  30.  
  31.         fun getSmallIcon(cardType: CreditCardType): Int = when (cardType) {
  32.             Visa -> R.drawable.ic_credit_card_visa_small
  33.             MasterCard -> R.drawable.ic_credit_card_mastercard_small
  34.             AmericanExpress -> R.drawable.ic_credit_card_amerian_express_small
  35.             DinersClub -> R.drawable.ic_credit_card_dinerclub_small
  36.             Discovery -> R.drawable.ic_credit_card_discover_small
  37.             Jcb -> R.drawable.ic_credit_card_jcb_small
  38.             UnionPay -> R.drawable.ic_credit_card_unionpay_small
  39.             Maestro -> R.drawable.ic_credit_card_maestro_small
  40.         }
  41.     }
  42. }
  43.  
  44. object Visa : CreditCardType() {
  45.     override val name: String = "visa"
  46.     override val prefixPattern: Regex = Regex("""^4""")
  47.     override val gaps: IntArray = intArrayOf(4, 8, 12)
  48.     override val lengths: IntArray = intArrayOf(16, 18, 19)
  49.     override val securityCodeLength: Int = 3
  50. }
  51.  
  52. object MasterCard : CreditCardType() {
  53.     override val name: String = "master-card"
  54.     override val prefixPattern: Regex = Regex("""^(5[1-5]|222[1-9]|2[3-6]|27[0-1]|2720)""")
  55.     override val gaps: IntArray = intArrayOf(4, 8, 12)
  56.     override val lengths: IntArray = intArrayOf(16)
  57.     override val securityCodeLength: Int = 3
  58. }
  59.  
  60. object AmericanExpress : CreditCardType() {
  61.     override val name: String = "american-express"
  62.     override val prefixPattern: Regex = Regex("""^3[47]""")
  63.     override val gaps: IntArray = intArrayOf(4, 10)
  64.     override val lengths: IntArray = intArrayOf(15)
  65.     override val securityCodeLength: Int = 4
  66. }
  67.  
  68. object DinersClub : CreditCardType() {
  69.     override val name: String = "diners-club"
  70.     override val prefixPattern: Regex = Regex("""^3(0[0-5]|[689])""")
  71.     override val gaps: IntArray = intArrayOf(4, 10)
  72.     override val lengths: IntArray = intArrayOf(14, 16, 19)
  73.     override val securityCodeLength: Int = 3
  74. }
  75.  
  76. object Discovery : CreditCardType() {
  77.     override val name: String = "discover"
  78.     override val prefixPattern: Regex = Regex("""^(6011|65|64[4-9])""")
  79.     override val gaps: IntArray = intArrayOf(4, 8, 12)
  80.     override val lengths: IntArray = intArrayOf(16, 19)
  81.     override val securityCodeLength: Int = 3
  82. }
  83.  
  84. object Jcb : CreditCardType() {
  85.     override val name: String = "jcb"
  86.     override val prefixPattern: Regex = Regex("""^(2131|1800|35)""")
  87.     override val gaps: IntArray = intArrayOf(4, 8, 12)
  88.     override val lengths: IntArray = intArrayOf(16)
  89.     override val securityCodeLength: Int = 3
  90. }
  91.  
  92. object UnionPay : CreditCardType() {
  93.     override val name: String = "unionpay"
  94.     override val prefixPattern: Regex = Regex("""^(((620|(621(?!83|88|98|99))|622(?!06|018)|62[3-6]|627[02,06,07]|628(?!0|1)|629[1,2]))\d*|622018\d{12})""")
  95.     override val gaps: IntArray = intArrayOf(4, 8, 12)
  96.     override val lengths: IntArray = intArrayOf(16, 17, 18, 19)
  97.     override val securityCodeLength: Int = 3
  98. }
  99.  
  100. object Maestro : CreditCardType() {
  101.     override val name: String = "maestro"
  102.     override val prefixPattern: Regex = Regex("""^(5[06-9]|6[37])""")
  103.     override val gaps: IntArray = intArrayOf(4, 8, 12)
  104.     override val lengths: IntArray = intArrayOf(12, 13, 14, 15, 16, 17, 18, 19)
  105.     override val securityCodeLength: Int = 3
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement