@@ -76,27 +76,6 @@ CardNumber::isValid('2730 1684 6416 1841', 'visa'); // false
7676CardNumber::isValid('2201 6868 4646 8444', 'visa'); // false
7777```
7878
79- List of available card types:
80-
81- | Bank Name | Card Type | Enum Type |
82- | --------------------| ----------------------| ------------------------------------------------------------|
83- | AmericanExpress | ` amex ` | ` DragonCode\CardNumber\Enums\CardType::americanExpress ` |
84- | Dankort | ` dankort ` | ` DragonCode\CardNumber\Enums\CardType::dankort ` |
85- | DinersClub | ` dinersclub ` | ` DragonCode\CardNumber\Enums\CardType::dinersClub ` |
86- | Discovery | ` discovery ` | ` DragonCode\CardNumber\Enums\CardType::discovery ` |
87- | Forbrugsforeningen | ` forbrugsforeningen ` | ` DragonCode\CardNumber\Enums\CardType::forbrugsforeningen ` |
88- | HiperCard | ` hipercard ` | ` DragonCode\CardNumber\Enums\CardType::hiperCard ` |
89- | Jcb | ` jcb ` | ` DragonCode\CardNumber\Enums\CardType::jcb ` |
90- | Maestro | ` maestro ` | ` DragonCode\CardNumber\Enums\CardType::maestro ` |
91- | MasterCard | ` mastercard ` | ` DragonCode\CardNumber\Enums\CardType::masterCard ` |
92- | Mir | ` mir ` | ` DragonCode\CardNumber\Enums\CardType::mir ` |
93- | Ralf Ringer | ` ralfringer ` | ` DragonCode\CardNumber\Enums\CardType::ralfRinger ` |
94- | Troy | ` troy ` | ` DragonCode\CardNumber\Enums\CardType::troy ` |
95- | Unionpay | ` unionpay ` | ` DragonCode\CardNumber\Enums\CardType::unionPay ` |
96- | Visa | ` visa ` | ` DragonCode\CardNumber\Enums\CardType::visa ` |
97- | VisaElectron | ` visaelectron ` | ` DragonCode\CardNumber\Enums\CardType::visaElectron ` |
98- | Yves Rocher | ` yvesrocher ` | ` DragonCode\CardNumber\Enums\CardType::yvesRocher ` |
99-
10079You can also check for invalid numbers:
10180
10281``` php
@@ -121,6 +100,44 @@ CardNumber::isInvalid('5580-4733x7202_47 33'); // false
121100CardNumber::isInvalid('5580-4733x7202_47 32'); // true
122101```
123102
103+ In addition to numerical values, you can also validate number-letter combinations. For example:
104+
105+ ``` php
106+ use DragonCode\CardNumber\CardNumber;
107+ use DragonCode\CardNumber\Enums\CardType;
108+
109+ CardNumber::isValid('EKN-OSX', CardType::chars); // true
110+ CardNumber::isValid('EKN-56X', CardType::chars); // true
111+
112+ CardNumber::isValid('ekn-osx', 'chars'); // true
113+ CardNumber::isValid('ekn-56x', 'chars'); // true
114+
115+ CardNumber::isValid('EKN-OSX'); // false
116+ CardNumber::isValid('EKN-56X'); // false
117+ ```
118+
119+ List of available card types:
120+
121+ | Type | Card Type | Enum Type |
122+ | --------------------| ----------------------| ------------------------------------------------------------|
123+ | AmericanExpress | ` amex ` | ` DragonCode\CardNumber\Enums\CardType::americanExpress ` |
124+ | Chars Number | ` chars ` | ` DragonCode\CardNumber\Enums\CardType::chars ` |
125+ | Dankort | ` dankort ` | ` DragonCode\CardNumber\Enums\CardType::dankort ` |
126+ | DinersClub | ` dinersclub ` | ` DragonCode\CardNumber\Enums\CardType::dinersClub ` |
127+ | Discovery | ` discovery ` | ` DragonCode\CardNumber\Enums\CardType::discovery ` |
128+ | Forbrugsforeningen | ` forbrugsforeningen ` | ` DragonCode\CardNumber\Enums\CardType::forbrugsforeningen ` |
129+ | HiperCard | ` hipercard ` | ` DragonCode\CardNumber\Enums\CardType::hiperCard ` |
130+ | Jcb | ` jcb ` | ` DragonCode\CardNumber\Enums\CardType::jcb ` |
131+ | Maestro | ` maestro ` | ` DragonCode\CardNumber\Enums\CardType::maestro ` |
132+ | MasterCard | ` mastercard ` | ` DragonCode\CardNumber\Enums\CardType::masterCard ` |
133+ | Mir | ` mir ` | ` DragonCode\CardNumber\Enums\CardType::mir ` |
134+ | Ralf Ringer | ` ralfringer ` | ` DragonCode\CardNumber\Enums\CardType::ralfRinger ` |
135+ | Troy | ` troy ` | ` DragonCode\CardNumber\Enums\CardType::troy ` |
136+ | Unionpay | ` unionpay ` | ` DragonCode\CardNumber\Enums\CardType::unionPay ` |
137+ | Visa | ` visa ` | ` DragonCode\CardNumber\Enums\CardType::visa ` |
138+ | VisaElectron | ` visaelectron ` | ` DragonCode\CardNumber\Enums\CardType::visaElectron ` |
139+ | Yves Rocher | ` yvesrocher ` | ` DragonCode\CardNumber\Enums\CardType::yvesRocher ` |
140+
124141### Generation
125142
126143You can also easily generate any numbers using the Luhn algorithm:
@@ -192,6 +209,20 @@ CardNumber::generate(558047337202473, $formatter); // 5580/473372/024733
192209> * ` DragonCode\CardNumber\Formatters\DefaultFormatter `
193210> * ` DragonCode\CardNumber\Formatters\BankFormatter `
194211> * ` DragonCode\CardNumber\Formatters\LoyaltyFormatter `
212+ > * ` DragonCode\CardNumber\Formatters\LoyaltyCharFormatter `
213+
214+ In addition to numeric formatters, you can also use number-letter combinations.
215+ For example, using the "LoyaltyCharsFormatter" formatter, you can generate a letter code instead of a numeric number,
216+ which will be valid when verified by the Luhn's algorithm:
217+
218+ ``` php
219+ use DragonCode\CardNumber\CardNumber;
220+ use DragonCode\CardNumber\Formatters\LoyaltyCharFormatter;
221+
222+ $formatter = LoyaltyCharFormatter::create();
223+
224+ CardNumber::generate(345678123, $formatter); // KN-OSXY-AEKF
225+ ```
195226
196227### Factories
197228
0 commit comments