From 3d57d0d25740ab9e69488e928f1d983106a491c0 Mon Sep 17 00:00:00 2001 From: Leandro Isotton Date: Wed, 5 Nov 2025 11:18:34 +0100 Subject: [PATCH] Add hint to formatter, so a hint can be provided if postcode is invalid --- src/CountryPostcodeFormatter.php | 7 +++++++ src/Formatter/ADFormatter.php | 5 +++++ src/Formatter/AFFormatter.php | 5 +++++ src/Formatter/AIFormatter.php | 5 +++++ src/Formatter/ALFormatter.php | 5 +++++ src/Formatter/AMFormatter.php | 5 +++++ src/Formatter/AQFormatter.php | 5 +++++ src/Formatter/ARFormatter.php | 5 +++++ src/Formatter/ASFormatter.php | 5 +++++ src/Formatter/ATFormatter.php | 5 +++++ src/Formatter/AUFormatter.php | 5 +++++ src/Formatter/AXFormatter.php | 5 +++++ src/Formatter/AZFormatter.php | 5 +++++ src/Formatter/BAFormatter.php | 5 +++++ src/Formatter/BBFormatter.php | 5 +++++ src/Formatter/BDFormatter.php | 5 +++++ src/Formatter/BEFormatter.php | 5 +++++ src/Formatter/BGFormatter.php | 5 +++++ src/Formatter/BHFormatter.php | 5 +++++ src/Formatter/BLFormatter.php | 5 +++++ src/Formatter/BMFormatter.php | 5 +++++ src/Formatter/BNFormatter.php | 5 +++++ src/Formatter/BRFormatter.php | 5 +++++ src/Formatter/BTFormatter.php | 5 +++++ src/Formatter/BYFormatter.php | 5 +++++ src/Formatter/CAFormatter.php | 5 +++++ src/Formatter/CCFormatter.php | 5 +++++ src/Formatter/CHFormatter.php | 5 +++++ src/Formatter/CLFormatter.php | 5 +++++ src/Formatter/CNFormatter.php | 5 +++++ src/Formatter/COFormatter.php | 5 +++++ src/Formatter/CRFormatter.php | 5 +++++ src/Formatter/CUFormatter.php | 5 +++++ src/Formatter/CVFormatter.php | 5 +++++ src/Formatter/CXFormatter.php | 5 +++++ src/Formatter/CYFormatter.php | 5 +++++ src/Formatter/CZFormatter.php | 5 +++++ src/Formatter/DEFormatter.php | 5 +++++ src/Formatter/DKFormatter.php | 5 +++++ src/Formatter/DOFormatter.php | 5 +++++ src/Formatter/DZFormatter.php | 5 +++++ src/Formatter/ECFormatter.php | 5 +++++ src/Formatter/EEFormatter.php | 5 +++++ src/Formatter/EGFormatter.php | 5 +++++ src/Formatter/ESFormatter.php | 5 +++++ src/Formatter/ETFormatter.php | 5 +++++ src/Formatter/FIFormatter.php | 5 +++++ src/Formatter/FKFormatter.php | 5 +++++ src/Formatter/FMFormatter.php | 5 +++++ src/Formatter/FOFormatter.php | 5 +++++ src/Formatter/FRFormatter.php | 5 +++++ src/Formatter/GBFormatter.php | 5 +++++ src/Formatter/GEFormatter.php | 5 +++++ src/Formatter/GFFormatter.php | 5 +++++ src/Formatter/GGFormatter.php | 5 +++++ src/Formatter/GIFormatter.php | 5 +++++ src/Formatter/GLFormatter.php | 5 +++++ src/Formatter/GNFormatter.php | 5 +++++ src/Formatter/GPFormatter.php | 5 +++++ src/Formatter/GRFormatter.php | 5 +++++ src/Formatter/GSFormatter.php | 5 +++++ src/Formatter/GTFormatter.php | 5 +++++ src/Formatter/GUFormatter.php | 5 +++++ src/Formatter/GWFormatter.php | 5 +++++ src/Formatter/HNFormatter.php | 5 +++++ src/Formatter/HRFormatter.php | 5 +++++ src/Formatter/HTFormatter.php | 5 +++++ src/Formatter/HUFormatter.php | 5 +++++ src/Formatter/ICFormatter.php | 5 +++++ src/Formatter/IDFormatter.php | 5 +++++ src/Formatter/IEFormatter.php | 5 +++++ src/Formatter/ILFormatter.php | 5 +++++ src/Formatter/IMFormatter.php | 5 +++++ src/Formatter/INFormatter.php | 5 +++++ src/Formatter/IOFormatter.php | 5 +++++ src/Formatter/IQFormatter.php | 5 +++++ src/Formatter/IRFormatter.php | 5 +++++ src/Formatter/ISFormatter.php | 5 +++++ src/Formatter/ITFormatter.php | 5 +++++ src/Formatter/JEFormatter.php | 5 +++++ src/Formatter/JOFormatter.php | 5 +++++ src/Formatter/JPFormatter.php | 5 +++++ src/Formatter/KEFormatter.php | 5 +++++ src/Formatter/KGFormatter.php | 5 +++++ src/Formatter/KHFormatter.php | 5 +++++ src/Formatter/KRFormatter.php | 5 +++++ src/Formatter/KWFormatter.php | 5 +++++ src/Formatter/KYFormatter.php | 5 +++++ src/Formatter/KZFormatter.php | 5 +++++ src/Formatter/LAFormatter.php | 5 +++++ src/Formatter/LBFormatter.php | 5 +++++ src/Formatter/LCFormatter.php | 5 +++++ src/Formatter/LIFormatter.php | 5 +++++ src/Formatter/LKFormatter.php | 5 +++++ src/Formatter/LRFormatter.php | 5 +++++ src/Formatter/LSFormatter.php | 5 +++++ src/Formatter/LTFormatter.php | 5 +++++ src/Formatter/LUFormatter.php | 5 +++++ src/Formatter/LVFormatter.php | 5 +++++ src/Formatter/MAFormatter.php | 5 +++++ src/Formatter/MCFormatter.php | 5 +++++ src/Formatter/MDFormatter.php | 5 +++++ src/Formatter/MEFormatter.php | 5 +++++ src/Formatter/MFFormatter.php | 5 +++++ src/Formatter/MGFormatter.php | 5 +++++ src/Formatter/MHFormatter.php | 5 +++++ src/Formatter/MKFormatter.php | 5 +++++ src/Formatter/MMFormatter.php | 5 +++++ src/Formatter/MNFormatter.php | 5 +++++ src/Formatter/MPFormatter.php | 5 +++++ src/Formatter/MQFormatter.php | 5 +++++ src/Formatter/MSFormatter.php | 5 +++++ src/Formatter/MTFormatter.php | 5 +++++ src/Formatter/MUFormatter.php | 5 +++++ src/Formatter/MVFormatter.php | 5 +++++ src/Formatter/MXFormatter.php | 5 +++++ src/Formatter/MYFormatter.php | 5 +++++ src/Formatter/MZFormatter.php | 5 +++++ src/Formatter/NCFormatter.php | 5 +++++ src/Formatter/NEFormatter.php | 5 +++++ src/Formatter/NFFormatter.php | 5 +++++ src/Formatter/NGFormatter.php | 5 +++++ src/Formatter/NIFormatter.php | 5 +++++ src/Formatter/NLFormatter.php | 5 +++++ src/Formatter/NOFormatter.php | 5 +++++ src/Formatter/NPFormatter.php | 5 +++++ src/Formatter/NZFormatter.php | 5 +++++ src/Formatter/OMFormatter.php | 5 +++++ src/Formatter/PAFormatter.php | 5 +++++ src/Formatter/PEFormatter.php | 5 +++++ src/Formatter/PFFormatter.php | 5 +++++ src/Formatter/PGFormatter.php | 5 +++++ src/Formatter/PHFormatter.php | 5 +++++ src/Formatter/PKFormatter.php | 5 +++++ src/Formatter/PLFormatter.php | 5 +++++ src/Formatter/PMFormatter.php | 5 +++++ src/Formatter/PNFormatter.php | 5 +++++ src/Formatter/PRFormatter.php | 5 +++++ src/Formatter/PSFormatter.php | 5 +++++ src/Formatter/PTFormatter.php | 5 +++++ src/Formatter/PWFormatter.php | 5 +++++ src/Formatter/PYFormatter.php | 5 +++++ src/Formatter/REFormatter.php | 5 +++++ src/Formatter/ROFormatter.php | 5 +++++ src/Formatter/RSFormatter.php | 5 +++++ src/Formatter/RUFormatter.php | 5 +++++ src/Formatter/SAFormatter.php | 5 +++++ src/Formatter/SDFormatter.php | 5 +++++ src/Formatter/SEFormatter.php | 5 +++++ src/Formatter/SGFormatter.php | 5 +++++ src/Formatter/SHFormatter.php | 5 +++++ src/Formatter/SIFormatter.php | 5 +++++ src/Formatter/SJFormatter.php | 5 +++++ src/Formatter/SKFormatter.php | 5 +++++ src/Formatter/SMFormatter.php | 5 +++++ src/Formatter/SNFormatter.php | 5 +++++ src/Formatter/SVFormatter.php | 5 +++++ src/Formatter/SZFormatter.php | 5 +++++ src/Formatter/TCFormatter.php | 5 +++++ src/Formatter/TFFormatter.php | 5 +++++ src/Formatter/THFormatter.php | 5 +++++ src/Formatter/TJFormatter.php | 5 +++++ src/Formatter/TMFormatter.php | 5 +++++ src/Formatter/TNFormatter.php | 5 +++++ src/Formatter/TRFormatter.php | 5 +++++ src/Formatter/TTFormatter.php | 5 +++++ src/Formatter/TWFormatter.php | 5 +++++ src/Formatter/TZFormatter.php | 5 +++++ src/Formatter/UAFormatter.php | 5 +++++ src/Formatter/USFormatter.php | 5 +++++ src/Formatter/UYFormatter.php | 5 +++++ src/Formatter/UZFormatter.php | 5 +++++ src/Formatter/VAFormatter.php | 5 +++++ src/Formatter/VCFormatter.php | 5 +++++ src/Formatter/VEFormatter.php | 5 +++++ src/Formatter/VGFormatter.php | 5 +++++ src/Formatter/VIFormatter.php | 5 +++++ src/Formatter/VNFormatter.php | 5 +++++ src/Formatter/WFFormatter.php | 5 +++++ src/Formatter/WSFormatter.php | 5 +++++ src/Formatter/YTFormatter.php | 5 +++++ src/Formatter/ZAFormatter.php | 5 +++++ src/Formatter/ZMFormatter.php | 5 +++++ src/InvalidPostcodeException.php | 13 ++++++++++++- src/PostcodeFormatter.php | 4 ++-- 185 files changed, 931 insertions(+), 3 deletions(-) diff --git a/src/CountryPostcodeFormatter.php b/src/CountryPostcodeFormatter.php index b06f487..cf3b26c 100644 --- a/src/CountryPostcodeFormatter.php +++ b/src/CountryPostcodeFormatter.php @@ -21,4 +21,11 @@ interface CountryPostcodeFormatter * @return string|null The formatted postcode, or NULL if the postcode is invalid. */ public function format(string $postcode): ?string; + + /** + * Returns a hint describing the expected postcode format for this country. + * + * @return string A hint describing the expected postcode format. + */ + public function hint(): string; } diff --git a/src/Formatter/ADFormatter.php b/src/Formatter/ADFormatter.php index a427066..f8c0830 100644 --- a/src/Formatter/ADFormatter.php +++ b/src/Formatter/ADFormatter.php @@ -21,6 +21,11 @@ */ final class ADFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of the letters AD, followed by 3 digits, without separator.'; + } + public function format(string $postcode): ?string { if (str_starts_with($postcode, 'AD')) { diff --git a/src/Formatter/AFFormatter.php b/src/Formatter/AFFormatter.php index 2a160c8..4a8dd62 100644 --- a/src/Formatter/AFFormatter.php +++ b/src/Formatter/AFFormatter.php @@ -23,6 +23,11 @@ */ final class AFFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/AIFormatter.php b/src/Formatter/AIFormatter.php index 9d7722f..01bb630 100644 --- a/src/Formatter/AIFormatter.php +++ b/src/Formatter/AIFormatter.php @@ -16,6 +16,11 @@ */ final class AIFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Anguilla uses a single postcode for all addresses.'; + } + public function format(string $postcode): ?string { if ($postcode === '2640' || $postcode === 'AI2640') { diff --git a/src/Formatter/ALFormatter.php b/src/Formatter/ALFormatter.php index f12b608..3c2b414 100644 --- a/src/Formatter/ALFormatter.php +++ b/src/Formatter/ALFormatter.php @@ -18,6 +18,11 @@ */ final class ALFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/AMFormatter.php b/src/Formatter/AMFormatter.php index e021834..0a4647e 100644 --- a/src/Formatter/AMFormatter.php +++ b/src/Formatter/AMFormatter.php @@ -18,6 +18,11 @@ */ final class AMFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/AQFormatter.php b/src/Formatter/AQFormatter.php index a7f4a4d..f98577e 100644 --- a/src/Formatter/AQFormatter.php +++ b/src/Formatter/AQFormatter.php @@ -15,6 +15,11 @@ */ final class AQFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'This country uses a single postcode for all addresses.'; + } + public function format(string $postcode): ?string { if ($postcode === 'BIQQ1ZZ') { diff --git a/src/Formatter/ARFormatter.php b/src/Formatter/ARFormatter.php index f8bba8b..a7ac250 100644 --- a/src/Formatter/ARFormatter.php +++ b/src/Formatter/ARFormatter.php @@ -18,6 +18,11 @@ */ final class ARFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'The postcode is either 4 digits, or 1 letter + 4 digits + 3 letters, with no separators.'; + } + public function format(string $postcode): ?string { if (preg_match('/^(([0-9]{4})|([A-Z][0-9]{4}[A-Z]{3}))$/', $postcode) !== 1) { diff --git a/src/Formatter/ASFormatter.php b/src/Formatter/ASFormatter.php index 3b3cd21..dbbef84 100644 --- a/src/Formatter/ASFormatter.php +++ b/src/Formatter/ASFormatter.php @@ -21,6 +21,11 @@ */ final class ASFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Mail service in American Samoa is fully integrated with the United States Postal Service.'; + } + public function format(string $postcode): ?string { $length = strlen($postcode); diff --git a/src/Formatter/ATFormatter.php b/src/Formatter/ATFormatter.php index a341415..6686a91 100644 --- a/src/Formatter/ATFormatter.php +++ b/src/Formatter/ATFormatter.php @@ -21,6 +21,11 @@ final class ATFormatter implements CountryPostcodeFormatter { use StripPrefix; + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator. The first digit must be 1-9.'; + } + public function format(string $postcode): ?string { $postcode = $this->stripPrefix($postcode, 'A'); diff --git a/src/Formatter/AUFormatter.php b/src/Formatter/AUFormatter.php index cdd189e..bad0987 100644 --- a/src/Formatter/AUFormatter.php +++ b/src/Formatter/AUFormatter.php @@ -18,6 +18,11 @@ */ final class AUFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/AXFormatter.php b/src/Formatter/AXFormatter.php index d80e63f..4523eb9 100644 --- a/src/Formatter/AXFormatter.php +++ b/src/Formatter/AXFormatter.php @@ -22,6 +22,11 @@ */ final class AXFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, starting with 22.'; + } + public function format(string $postcode): ?string { $length = strlen($postcode); diff --git a/src/Formatter/AZFormatter.php b/src/Formatter/AZFormatter.php index 7a3314a..334eb60 100644 --- a/src/Formatter/AZFormatter.php +++ b/src/Formatter/AZFormatter.php @@ -21,6 +21,11 @@ */ final class AZFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'The postcode format is AZ NNNN, where N represents a digit.'; + } + public function format(string $postcode): ?string { if (str_starts_with($postcode, 'AZ')) { diff --git a/src/Formatter/BAFormatter.php b/src/Formatter/BAFormatter.php index 6f832dd..76d3bbd 100644 --- a/src/Formatter/BAFormatter.php +++ b/src/Formatter/BAFormatter.php @@ -17,6 +17,11 @@ */ final class BAFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/BBFormatter.php b/src/Formatter/BBFormatter.php index 5b303aa..0847c45 100644 --- a/src/Formatter/BBFormatter.php +++ b/src/Formatter/BBFormatter.php @@ -21,6 +21,11 @@ */ final class BBFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postal codes in Barbados are 5 digit numeric, with BB prefix.'; + } + public function format(string $postcode): ?string { if (str_starts_with($postcode, 'BB')) { diff --git a/src/Formatter/BDFormatter.php b/src/Formatter/BDFormatter.php index 05e1ee1..746b623 100644 --- a/src/Formatter/BDFormatter.php +++ b/src/Formatter/BDFormatter.php @@ -18,6 +18,11 @@ */ final class BDFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/BEFormatter.php b/src/Formatter/BEFormatter.php index b2c7b54..5d96f42 100644 --- a/src/Formatter/BEFormatter.php +++ b/src/Formatter/BEFormatter.php @@ -21,6 +21,11 @@ final class BEFormatter implements CountryPostcodeFormatter { use StripPrefix; + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { $postcode = $this->stripPrefix($postcode, 'B'); diff --git a/src/Formatter/BGFormatter.php b/src/Formatter/BGFormatter.php index 502dc2a..670f416 100644 --- a/src/Formatter/BGFormatter.php +++ b/src/Formatter/BGFormatter.php @@ -18,6 +18,11 @@ */ final class BGFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/BHFormatter.php b/src/Formatter/BHFormatter.php index e80ee71..e8cc7bd 100644 --- a/src/Formatter/BHFormatter.php +++ b/src/Formatter/BHFormatter.php @@ -18,6 +18,11 @@ */ final class BHFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Valid post code numbers are 101 to 1216 with gaps in the range. Known as block number formally.'; + } + public function format(string $postcode): ?string { if (preg_match('/^(1?[0-9])([0-9]{2})$/', $postcode, $matches) !== 1) { diff --git a/src/Formatter/BLFormatter.php b/src/Formatter/BLFormatter.php index 6e088a1..0d855fd 100644 --- a/src/Formatter/BLFormatter.php +++ b/src/Formatter/BLFormatter.php @@ -15,6 +15,11 @@ */ final class BLFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'This country uses a single postcode, 97133.'; + } + public function format(string $postcode): ?string { if ($postcode === '97133') { diff --git a/src/Formatter/BMFormatter.php b/src/Formatter/BMFormatter.php index 7cc3657..c26410e 100644 --- a/src/Formatter/BMFormatter.php +++ b/src/Formatter/BMFormatter.php @@ -18,6 +18,11 @@ */ final class BMFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcode formats are AA NN for street addresses, AA AA for P.O. Box addresses (A=letter, N=digit).'; + } + public function format(string $postcode): ?string { if (preg_match('/^([A-Z]{2})([A-Z]{2}|[0-9]{2})$/', $postcode, $matches) !== 1) { diff --git a/src/Formatter/BNFormatter.php b/src/Formatter/BNFormatter.php index 7bb2f13..0b1a472 100644 --- a/src/Formatter/BNFormatter.php +++ b/src/Formatter/BNFormatter.php @@ -18,6 +18,11 @@ */ final class BNFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcode format is two letters followed by 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[A-Z]{2}[0-9]{4}$/', $postcode, $matches) !== 1) { diff --git a/src/Formatter/BRFormatter.php b/src/Formatter/BRFormatter.php index 6dbd839..b05b486 100644 --- a/src/Formatter/BRFormatter.php +++ b/src/Formatter/BRFormatter.php @@ -20,6 +20,11 @@ */ final class BRFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Format is 5 digits, hyphen, 3 digits.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{8}$/', $postcode) !== 1) { diff --git a/src/Formatter/BTFormatter.php b/src/Formatter/BTFormatter.php index e418fa6..11e4c54 100644 --- a/src/Formatter/BTFormatter.php +++ b/src/Formatter/BTFormatter.php @@ -17,6 +17,11 @@ */ final class BTFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/BYFormatter.php b/src/Formatter/BYFormatter.php index ecbd476..8f442d6 100644 --- a/src/Formatter/BYFormatter.php +++ b/src/Formatter/BYFormatter.php @@ -17,6 +17,11 @@ */ final class BYFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postal codes in Belarus are 6 digit numeric.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{6}$/', $postcode) !== 1) { diff --git a/src/Formatter/CAFormatter.php b/src/Formatter/CAFormatter.php index 4d7e4b6..cfa1c6d 100644 --- a/src/Formatter/CAFormatter.php +++ b/src/Formatter/CAFormatter.php @@ -21,6 +21,11 @@ */ final class CAFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'The format is ANA NAN, where A is a letter and N is a digit.'; + } + public function format(string $postcode): ?string { if (preg_match('/^([ABCEGHJ-NPRSTV-Z][0-9]){3}$/', $postcode) !== 1) { diff --git a/src/Formatter/CCFormatter.php b/src/Formatter/CCFormatter.php index 6b251e0..d3b2257 100644 --- a/src/Formatter/CCFormatter.php +++ b/src/Formatter/CCFormatter.php @@ -17,6 +17,11 @@ */ final class CCFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/CHFormatter.php b/src/Formatter/CHFormatter.php index d96db4f..f684346 100644 --- a/src/Formatter/CHFormatter.php +++ b/src/Formatter/CHFormatter.php @@ -18,6 +18,11 @@ */ final class CHFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/CLFormatter.php b/src/Formatter/CLFormatter.php index 7b11f6e..f5d3f66 100644 --- a/src/Formatter/CLFormatter.php +++ b/src/Formatter/CLFormatter.php @@ -19,6 +19,11 @@ */ final class CLFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 7 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{7}$/', $postcode) !== 1) { diff --git a/src/Formatter/CNFormatter.php b/src/Formatter/CNFormatter.php index 8a480d5..9e072a4 100644 --- a/src/Formatter/CNFormatter.php +++ b/src/Formatter/CNFormatter.php @@ -19,6 +19,11 @@ */ final class CNFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'China Post uses a six-digit all-numerical system, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{6}$/', $postcode) !== 1) { diff --git a/src/Formatter/COFormatter.php b/src/Formatter/COFormatter.php index e2b73cd..601bdfd 100644 --- a/src/Formatter/COFormatter.php +++ b/src/Formatter/COFormatter.php @@ -33,6 +33,11 @@ final class COFormatter implements CountryPostcodeFormatter '99', ]; + public function hint(): string + { + return 'Postal codes in Colombia are 6 digit numeric.'; + } + public function format(string $postcode): ?string { if (preg_match('/^\d{2}(?!0000)\d{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/CRFormatter.php b/src/Formatter/CRFormatter.php index 75269bb..ee2c175 100644 --- a/src/Formatter/CRFormatter.php +++ b/src/Formatter/CRFormatter.php @@ -21,6 +21,11 @@ */ final class CRFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postal codes in Costa Rica are 5 digit numeric.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]+$/', $postcode) !== 1) { diff --git a/src/Formatter/CUFormatter.php b/src/Formatter/CUFormatter.php index d61f6df..e9b84de 100644 --- a/src/Formatter/CUFormatter.php +++ b/src/Formatter/CUFormatter.php @@ -17,6 +17,11 @@ */ final class CUFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/CVFormatter.php b/src/Formatter/CVFormatter.php index 09807f1..5a3d0e9 100644 --- a/src/Formatter/CVFormatter.php +++ b/src/Formatter/CVFormatter.php @@ -17,6 +17,11 @@ */ final class CVFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/CXFormatter.php b/src/Formatter/CXFormatter.php index 65be6fb..f890006 100644 --- a/src/Formatter/CXFormatter.php +++ b/src/Formatter/CXFormatter.php @@ -17,6 +17,11 @@ */ final class CXFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/CYFormatter.php b/src/Formatter/CYFormatter.php index 590bfb9..6784d8b 100644 --- a/src/Formatter/CYFormatter.php +++ b/src/Formatter/CYFormatter.php @@ -22,6 +22,11 @@ */ final class CYFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]+$/', $postcode) !== 1) { diff --git a/src/Formatter/CZFormatter.php b/src/Formatter/CZFormatter.php index 5502ad3..3cd0bb1 100644 --- a/src/Formatter/CZFormatter.php +++ b/src/Formatter/CZFormatter.php @@ -24,6 +24,11 @@ */ final class CZFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits in the following format: xxx xx.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/DEFormatter.php b/src/Formatter/DEFormatter.php index 3a9906f..4a7c03f 100644 --- a/src/Formatter/DEFormatter.php +++ b/src/Formatter/DEFormatter.php @@ -18,6 +18,11 @@ */ final class DEFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/DKFormatter.php b/src/Formatter/DKFormatter.php index d8911c3..341d33f 100644 --- a/src/Formatter/DKFormatter.php +++ b/src/Formatter/DKFormatter.php @@ -18,6 +18,11 @@ */ final class DKFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/DOFormatter.php b/src/Formatter/DOFormatter.php index 2c267ae..2a0f241 100644 --- a/src/Formatter/DOFormatter.php +++ b/src/Formatter/DOFormatter.php @@ -17,6 +17,11 @@ */ final class DOFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/DZFormatter.php b/src/Formatter/DZFormatter.php index daa6d76..297ecdd 100644 --- a/src/Formatter/DZFormatter.php +++ b/src/Formatter/DZFormatter.php @@ -18,6 +18,11 @@ */ final class DZFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/ECFormatter.php b/src/Formatter/ECFormatter.php index 754a737..2148ddd 100644 --- a/src/Formatter/ECFormatter.php +++ b/src/Formatter/ECFormatter.php @@ -18,6 +18,11 @@ */ final class ECFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postal codes in Ecuador have six numeric digits.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{6}$/', $postcode) !== 1) { diff --git a/src/Formatter/EEFormatter.php b/src/Formatter/EEFormatter.php index 6a9bfe7..c6b8f47 100644 --- a/src/Formatter/EEFormatter.php +++ b/src/Formatter/EEFormatter.php @@ -17,6 +17,11 @@ */ final class EEFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/EGFormatter.php b/src/Formatter/EGFormatter.php index 2b130fb..b9a1957 100644 --- a/src/Formatter/EGFormatter.php +++ b/src/Formatter/EGFormatter.php @@ -19,6 +19,11 @@ */ final class EGFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 or 7 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^\d{5}(\d{2})?$/', $postcode) !== 1) { diff --git a/src/Formatter/ESFormatter.php b/src/Formatter/ESFormatter.php index 3b6e69e..ee5ecc9 100644 --- a/src/Formatter/ESFormatter.php +++ b/src/Formatter/ESFormatter.php @@ -18,6 +18,11 @@ */ final class ESFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/ETFormatter.php b/src/Formatter/ETFormatter.php index c27995b..b893e27 100644 --- a/src/Formatter/ETFormatter.php +++ b/src/Formatter/ETFormatter.php @@ -18,6 +18,11 @@ */ final class ETFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/FIFormatter.php b/src/Formatter/FIFormatter.php index 261435e..20b6493 100644 --- a/src/Formatter/FIFormatter.php +++ b/src/Formatter/FIFormatter.php @@ -18,6 +18,11 @@ */ final class FIFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/FKFormatter.php b/src/Formatter/FKFormatter.php index 39b8923..b50baba 100644 --- a/src/Formatter/FKFormatter.php +++ b/src/Formatter/FKFormatter.php @@ -15,6 +15,11 @@ */ final class FKFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'This country uses a single postcode for all addresses.'; + } + public function format(string $postcode): ?string { if ($postcode === 'FIQQ1ZZ') { diff --git a/src/Formatter/FMFormatter.php b/src/Formatter/FMFormatter.php index 591c48c..6191a64 100644 --- a/src/Formatter/FMFormatter.php +++ b/src/Formatter/FMFormatter.php @@ -19,6 +19,11 @@ */ final class FMFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'U.S. ZIP codes. Range 96941 - 96944.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]+$/', $postcode) !== 1) { diff --git a/src/Formatter/FOFormatter.php b/src/Formatter/FOFormatter.php index 50a70c4..55c5507 100644 --- a/src/Formatter/FOFormatter.php +++ b/src/Formatter/FOFormatter.php @@ -17,6 +17,11 @@ */ final class FOFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 3 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{3}$/', $postcode) !== 1) { diff --git a/src/Formatter/FRFormatter.php b/src/Formatter/FRFormatter.php index cb94f96..9e4bfc2 100644 --- a/src/Formatter/FRFormatter.php +++ b/src/Formatter/FRFormatter.php @@ -17,6 +17,11 @@ */ final class FRFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/GBFormatter.php b/src/Formatter/GBFormatter.php index d1cb49c..919e187 100644 --- a/src/Formatter/GBFormatter.php +++ b/src/Formatter/GBFormatter.php @@ -54,6 +54,11 @@ final class GBFormatter implements CountryPostcodeFormatter */ private ?array $patterns = null; + public function hint(): string + { + return 'Postcodes can have six different formats: A9 9AA, A9A 9AA, A99 9AA, AA9 9AA, AA9A 9AA, AA99 9AA. A stands for a capital letter, 9 stands for a digit.'; + } + public function format(string $postcode): ?string { // special case diff --git a/src/Formatter/GEFormatter.php b/src/Formatter/GEFormatter.php index 9506735..8beac17 100644 --- a/src/Formatter/GEFormatter.php +++ b/src/Formatter/GEFormatter.php @@ -17,6 +17,11 @@ */ final class GEFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/GFFormatter.php b/src/Formatter/GFFormatter.php index 48c7faa..e35f7f8 100644 --- a/src/Formatter/GFFormatter.php +++ b/src/Formatter/GFFormatter.php @@ -18,6 +18,11 @@ */ final class GFFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcode format is 973NN, where N stands for a digit.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/GGFormatter.php b/src/Formatter/GGFormatter.php index 71c2c3f..c577d30 100644 --- a/src/Formatter/GGFormatter.php +++ b/src/Formatter/GGFormatter.php @@ -24,6 +24,11 @@ */ final class GGFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes can have two different formats:'; + } + public function format(string $postcode): ?string { if (preg_match('/^(GY[0-9]{1,2})([0-9][A-Z][A-Z])$/', $postcode, $matches) !== 1) { diff --git a/src/Formatter/GIFormatter.php b/src/Formatter/GIFormatter.php index 1d8cf5e..d535c2b 100644 --- a/src/Formatter/GIFormatter.php +++ b/src/Formatter/GIFormatter.php @@ -16,6 +16,11 @@ */ final class GIFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'This country uses a single postcode for all addresses.'; + } + public function format(string $postcode): ?string { if ($postcode === 'GX111AA') { diff --git a/src/Formatter/GLFormatter.php b/src/Formatter/GLFormatter.php index 9284e21..139ac83 100644 --- a/src/Formatter/GLFormatter.php +++ b/src/Formatter/GLFormatter.php @@ -17,6 +17,11 @@ */ final class GLFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/GNFormatter.php b/src/Formatter/GNFormatter.php index 90d6042..1d590ba 100644 --- a/src/Formatter/GNFormatter.php +++ b/src/Formatter/GNFormatter.php @@ -17,6 +17,11 @@ */ final class GNFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 3 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{3}$/', $postcode) !== 1) { diff --git a/src/Formatter/GPFormatter.php b/src/Formatter/GPFormatter.php index 34b71b5..b5a8eb0 100644 --- a/src/Formatter/GPFormatter.php +++ b/src/Formatter/GPFormatter.php @@ -17,6 +17,11 @@ */ final class GPFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcode format is 971NN, where N stands for a digit.'; + } + public function format(string $postcode): ?string { if (preg_match('/^971[0-9]{2}$/', $postcode) !== 1) { diff --git a/src/Formatter/GRFormatter.php b/src/Formatter/GRFormatter.php index cc421f4..1fd07aa 100644 --- a/src/Formatter/GRFormatter.php +++ b/src/Formatter/GRFormatter.php @@ -19,6 +19,11 @@ */ final class GRFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, in the format NNN NN.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/GSFormatter.php b/src/Formatter/GSFormatter.php index 25df0bf..905ed9d 100644 --- a/src/Formatter/GSFormatter.php +++ b/src/Formatter/GSFormatter.php @@ -15,6 +15,11 @@ */ final class GSFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'This country uses a single postcode for all addresses.'; + } + public function format(string $postcode): ?string { if ($postcode === 'SIQQ1ZZ') { diff --git a/src/Formatter/GTFormatter.php b/src/Formatter/GTFormatter.php index 08452fc..79291fa 100644 --- a/src/Formatter/GTFormatter.php +++ b/src/Formatter/GTFormatter.php @@ -18,6 +18,11 @@ */ final class GTFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/GUFormatter.php b/src/Formatter/GUFormatter.php index a4b74a5..7cb0c1b 100644 --- a/src/Formatter/GUFormatter.php +++ b/src/Formatter/GUFormatter.php @@ -19,6 +19,11 @@ */ final class GUFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'U.S. ZIP codes. Range 96910 - 96932.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]+$/', $postcode) !== 1) { diff --git a/src/Formatter/GWFormatter.php b/src/Formatter/GWFormatter.php index 3236670..b8dcb3f 100644 --- a/src/Formatter/GWFormatter.php +++ b/src/Formatter/GWFormatter.php @@ -17,6 +17,11 @@ */ final class GWFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/HNFormatter.php b/src/Formatter/HNFormatter.php index 224e289..962eef6 100644 --- a/src/Formatter/HNFormatter.php +++ b/src/Formatter/HNFormatter.php @@ -17,6 +17,11 @@ */ final class HNFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/HRFormatter.php b/src/Formatter/HRFormatter.php index b04153d..dae73ff 100644 --- a/src/Formatter/HRFormatter.php +++ b/src/Formatter/HRFormatter.php @@ -18,6 +18,11 @@ */ final class HRFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postal codes in Croatia are 5 digit numeric.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/HTFormatter.php b/src/Formatter/HTFormatter.php index 0eed9b0..cfe3bf7 100644 --- a/src/Formatter/HTFormatter.php +++ b/src/Formatter/HTFormatter.php @@ -17,6 +17,11 @@ */ final class HTFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/HUFormatter.php b/src/Formatter/HUFormatter.php index 3f3a41c..8004802 100644 --- a/src/Formatter/HUFormatter.php +++ b/src/Formatter/HUFormatter.php @@ -18,6 +18,11 @@ */ final class HUFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/ICFormatter.php b/src/Formatter/ICFormatter.php index 9dace70..d0e8bc1 100644 --- a/src/Formatter/ICFormatter.php +++ b/src/Formatter/ICFormatter.php @@ -20,6 +20,11 @@ */ final class ICFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator, and start with 35 (Las Palmas) or 38 (Santa Cruz de Tenerife).'; + } + public function format(string $postcode): ?string { if (preg_match('/^(35|38)[0-9]{3}$/', $postcode) !== 1) { diff --git a/src/Formatter/IDFormatter.php b/src/Formatter/IDFormatter.php index 9038d16..ae6207a 100644 --- a/src/Formatter/IDFormatter.php +++ b/src/Formatter/IDFormatter.php @@ -18,6 +18,11 @@ */ final class IDFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/IEFormatter.php b/src/Formatter/IEFormatter.php index daa22e3..e14d0fe 100644 --- a/src/Formatter/IEFormatter.php +++ b/src/Formatter/IEFormatter.php @@ -54,6 +54,11 @@ final class IEFormatter implements CountryPostcodeFormatter . '([ACDEFHKNPRTVWXY0-9]{4})' . '$/'; + public function hint(): string + { + return 'Postcodes can have at least the following thirteen different formats:'; + } + public function format(string $postcode): ?string { if (preg_match(self::PATTERN, $postcode, $matches) !== 1) { diff --git a/src/Formatter/ILFormatter.php b/src/Formatter/ILFormatter.php index ee2241d..f325e53 100644 --- a/src/Formatter/ILFormatter.php +++ b/src/Formatter/ILFormatter.php @@ -19,6 +19,11 @@ */ final class ILFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 7 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{7}$/', $postcode) !== 1) { diff --git a/src/Formatter/IMFormatter.php b/src/Formatter/IMFormatter.php index bb666cd..d4de9d9 100644 --- a/src/Formatter/IMFormatter.php +++ b/src/Formatter/IMFormatter.php @@ -32,6 +32,11 @@ final class IMFormatter implements CountryPostcodeFormatter . '([0-9][A-Z][A-Z])' . '$/'; + public function hint(): string + { + return 'Postcodes can have two different formats: IM9 9AA or IM99 9AA. A stands for a capital letter, 9 stands for a digit.'; + } + public function format(string $postcode): ?string { if (preg_match(self::PATTERN, $postcode, $matches) !== 1) { diff --git a/src/Formatter/INFormatter.php b/src/Formatter/INFormatter.php index c6652a5..2440144 100644 --- a/src/Formatter/INFormatter.php +++ b/src/Formatter/INFormatter.php @@ -18,6 +18,11 @@ */ final class INFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 6 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{6}$/', $postcode) !== 1) { diff --git a/src/Formatter/IOFormatter.php b/src/Formatter/IOFormatter.php index ce68af4..7ba3a3d 100644 --- a/src/Formatter/IOFormatter.php +++ b/src/Formatter/IOFormatter.php @@ -15,6 +15,11 @@ */ final class IOFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'This country uses a single postcode for all addresses.'; + } + public function format(string $postcode): ?string { if ($postcode === 'BBND1ZZ') { diff --git a/src/Formatter/IQFormatter.php b/src/Formatter/IQFormatter.php index 4a2ad70..e5c85b3 100644 --- a/src/Formatter/IQFormatter.php +++ b/src/Formatter/IQFormatter.php @@ -18,6 +18,11 @@ */ final class IQFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/IRFormatter.php b/src/Formatter/IRFormatter.php index 5e2bc6c..da76498 100644 --- a/src/Formatter/IRFormatter.php +++ b/src/Formatter/IRFormatter.php @@ -18,6 +18,11 @@ */ final class IRFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcode format is NNNNN NNNNN, where N stands for a digit.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{10}$/', $postcode) !== 1) { diff --git a/src/Formatter/ISFormatter.php b/src/Formatter/ISFormatter.php index a630772..de1a903 100644 --- a/src/Formatter/ISFormatter.php +++ b/src/Formatter/ISFormatter.php @@ -18,6 +18,11 @@ */ final class ISFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 3 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{3}$/', $postcode) !== 1) { diff --git a/src/Formatter/ITFormatter.php b/src/Formatter/ITFormatter.php index 5440c0c..5205e42 100644 --- a/src/Formatter/ITFormatter.php +++ b/src/Formatter/ITFormatter.php @@ -18,6 +18,11 @@ */ final class ITFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/JEFormatter.php b/src/Formatter/JEFormatter.php index a2dbc68..36ce045 100644 --- a/src/Formatter/JEFormatter.php +++ b/src/Formatter/JEFormatter.php @@ -32,6 +32,11 @@ final class JEFormatter implements CountryPostcodeFormatter . '([0-9][A-Z][A-Z])' . '$/'; + public function hint(): string + { + return 'Postcodes can have two different formats:'; + } + public function format(string $postcode): ?string { if (preg_match(self::PATTERN, $postcode, $matches) !== 1) { diff --git a/src/Formatter/JOFormatter.php b/src/Formatter/JOFormatter.php index df4ed69..93e94ab 100644 --- a/src/Formatter/JOFormatter.php +++ b/src/Formatter/JOFormatter.php @@ -18,6 +18,11 @@ */ final class JOFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator. According to Wikipedia, postcodes are used for deliveries to PO Boxes only.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/JPFormatter.php b/src/Formatter/JPFormatter.php index 9a0a0ef..0c3e7b6 100644 --- a/src/Formatter/JPFormatter.php +++ b/src/Formatter/JPFormatter.php @@ -19,6 +19,11 @@ */ final class JPFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes format is NNN-NNNN, where N stands for a digit.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{7}$/', $postcode) !== 1) { diff --git a/src/Formatter/KEFormatter.php b/src/Formatter/KEFormatter.php index c7647ac..f8864d1 100644 --- a/src/Formatter/KEFormatter.php +++ b/src/Formatter/KEFormatter.php @@ -17,6 +17,11 @@ */ final class KEFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/KGFormatter.php b/src/Formatter/KGFormatter.php index 3038439..798ed49 100644 --- a/src/Formatter/KGFormatter.php +++ b/src/Formatter/KGFormatter.php @@ -17,6 +17,11 @@ */ final class KGFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postal codes in Kyrgyzstan are 6 digit numeric.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{6}$/', $postcode) !== 1) { diff --git a/src/Formatter/KHFormatter.php b/src/Formatter/KHFormatter.php index 77c8705..7d781fc 100644 --- a/src/Formatter/KHFormatter.php +++ b/src/Formatter/KHFormatter.php @@ -17,6 +17,11 @@ */ final class KHFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/KRFormatter.php b/src/Formatter/KRFormatter.php index 472c01e..ff88e86 100644 --- a/src/Formatter/KRFormatter.php +++ b/src/Formatter/KRFormatter.php @@ -18,6 +18,11 @@ */ final class KRFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Since 2015, postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/KWFormatter.php b/src/Formatter/KWFormatter.php index 6794a3a..00b50af 100644 --- a/src/Formatter/KWFormatter.php +++ b/src/Formatter/KWFormatter.php @@ -17,6 +17,11 @@ */ final class KWFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/KYFormatter.php b/src/Formatter/KYFormatter.php index db2c506..6308483 100644 --- a/src/Formatter/KYFormatter.php +++ b/src/Formatter/KYFormatter.php @@ -20,6 +20,11 @@ */ final class KYFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcode format is KYN-NNNN, where N are digits. The first digit can only be 1 to 3.'; + } + public function format(string $postcode): ?string { if (! str_starts_with($postcode, 'KY')) { diff --git a/src/Formatter/KZFormatter.php b/src/Formatter/KZFormatter.php index 43fd16b..d78187b 100644 --- a/src/Formatter/KZFormatter.php +++ b/src/Formatter/KZFormatter.php @@ -17,6 +17,11 @@ */ final class KZFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postal codes in Kazakhstan are 6 digit numeric.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{6}$/', $postcode) !== 1) { diff --git a/src/Formatter/LAFormatter.php b/src/Formatter/LAFormatter.php index f2d8530..2427c65 100644 --- a/src/Formatter/LAFormatter.php +++ b/src/Formatter/LAFormatter.php @@ -17,6 +17,11 @@ */ final class LAFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/LBFormatter.php b/src/Formatter/LBFormatter.php index 54fc35f..d3b6c82 100644 --- a/src/Formatter/LBFormatter.php +++ b/src/Formatter/LBFormatter.php @@ -18,6 +18,11 @@ */ final class LBFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcode format is NNNN NNNN, where N stands for a digit.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{8}$/', $postcode) !== 1) { diff --git a/src/Formatter/LCFormatter.php b/src/Formatter/LCFormatter.php index 9f30bb3..fda20f4 100644 --- a/src/Formatter/LCFormatter.php +++ b/src/Formatter/LCFormatter.php @@ -17,6 +17,11 @@ */ final class LCFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'The postcode format is LCNN NNN, N standing for a digit.'; + } + public function format(string $postcode): ?string { if (preg_match('/^(LC[0-9]{2})([0-9]{3})$/', $postcode, $matches) !== 1) { diff --git a/src/Formatter/LIFormatter.php b/src/Formatter/LIFormatter.php index 0542747..ab66fc2 100644 --- a/src/Formatter/LIFormatter.php +++ b/src/Formatter/LIFormatter.php @@ -18,6 +18,11 @@ */ final class LIFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator, range 9485 to 9498.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/LKFormatter.php b/src/Formatter/LKFormatter.php index 99e4808..c86861b 100644 --- a/src/Formatter/LKFormatter.php +++ b/src/Formatter/LKFormatter.php @@ -18,6 +18,11 @@ */ final class LKFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/LRFormatter.php b/src/Formatter/LRFormatter.php index a4f3951..3f460a3 100644 --- a/src/Formatter/LRFormatter.php +++ b/src/Formatter/LRFormatter.php @@ -17,6 +17,11 @@ */ final class LRFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/LSFormatter.php b/src/Formatter/LSFormatter.php index 9319807..9695ea2 100644 --- a/src/Formatter/LSFormatter.php +++ b/src/Formatter/LSFormatter.php @@ -17,6 +17,11 @@ */ final class LSFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 3 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{3}$/', $postcode) !== 1) { diff --git a/src/Formatter/LTFormatter.php b/src/Formatter/LTFormatter.php index 1ad06f0..563a224 100644 --- a/src/Formatter/LTFormatter.php +++ b/src/Formatter/LTFormatter.php @@ -25,6 +25,11 @@ */ final class LTFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postal codes in Lithuania since 2005 are 5 digit numeric.'; + } + public function format(string $postcode): ?string { $length = strlen($postcode); diff --git a/src/Formatter/LUFormatter.php b/src/Formatter/LUFormatter.php index 11a9387..c75b50b 100644 --- a/src/Formatter/LUFormatter.php +++ b/src/Formatter/LUFormatter.php @@ -21,6 +21,11 @@ final class LUFormatter implements CountryPostcodeFormatter { use StripPrefix; + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { $postcode = $this->stripPrefix($postcode, 'L'); diff --git a/src/Formatter/LVFormatter.php b/src/Formatter/LVFormatter.php index 0e32e5e..40e66b8 100644 --- a/src/Formatter/LVFormatter.php +++ b/src/Formatter/LVFormatter.php @@ -23,6 +23,11 @@ */ final class LVFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postal codes in Latvia are 4 digit numeric and use a mandatory country code (LV) in front.'; + } + public function format(string $postcode): ?string { if (str_starts_with($postcode, 'LV')) { diff --git a/src/Formatter/MAFormatter.php b/src/Formatter/MAFormatter.php index 4a9c91f..067669c 100644 --- a/src/Formatter/MAFormatter.php +++ b/src/Formatter/MAFormatter.php @@ -18,6 +18,11 @@ */ final class MAFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/MCFormatter.php b/src/Formatter/MCFormatter.php index ceff31e..c32dd60 100644 --- a/src/Formatter/MCFormatter.php +++ b/src/Formatter/MCFormatter.php @@ -23,6 +23,11 @@ */ final class MCFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/MDFormatter.php b/src/Formatter/MDFormatter.php index 5220d72..32d5f9d 100644 --- a/src/Formatter/MDFormatter.php +++ b/src/Formatter/MDFormatter.php @@ -22,6 +22,11 @@ */ final class MDFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'The postcode format is MD-NNNN, where N stands for a digit.'; + } + public function format(string $postcode): ?string { if (str_starts_with($postcode, 'MD')) { diff --git a/src/Formatter/MEFormatter.php b/src/Formatter/MEFormatter.php index 4fedd96..4b8e636 100644 --- a/src/Formatter/MEFormatter.php +++ b/src/Formatter/MEFormatter.php @@ -18,6 +18,11 @@ */ final class MEFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/MFFormatter.php b/src/Formatter/MFFormatter.php index 29ad7ab..2926fd8 100644 --- a/src/Formatter/MFFormatter.php +++ b/src/Formatter/MFFormatter.php @@ -15,6 +15,11 @@ */ final class MFFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'This country uses a single postcode, 97150.'; + } + public function format(string $postcode): ?string { if ($postcode === '97150') { diff --git a/src/Formatter/MGFormatter.php b/src/Formatter/MGFormatter.php index 70f0cc6..4dd63b7 100644 --- a/src/Formatter/MGFormatter.php +++ b/src/Formatter/MGFormatter.php @@ -17,6 +17,11 @@ */ final class MGFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 3 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{3}$/', $postcode) !== 1) { diff --git a/src/Formatter/MHFormatter.php b/src/Formatter/MHFormatter.php index 0bd1005..e732da9 100644 --- a/src/Formatter/MHFormatter.php +++ b/src/Formatter/MHFormatter.php @@ -19,6 +19,11 @@ */ final class MHFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'U.S. ZIP codes. Range 96960 - 96970.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]+$/', $postcode) !== 1) { diff --git a/src/Formatter/MKFormatter.php b/src/Formatter/MKFormatter.php index 8ff145c..c7223a6 100644 --- a/src/Formatter/MKFormatter.php +++ b/src/Formatter/MKFormatter.php @@ -18,6 +18,11 @@ */ final class MKFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postal codes in the Republic of Macedonia are 4 digits in length.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/MMFormatter.php b/src/Formatter/MMFormatter.php index ce4ab13..99a56bd 100644 --- a/src/Formatter/MMFormatter.php +++ b/src/Formatter/MMFormatter.php @@ -18,6 +18,11 @@ */ final class MMFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/MNFormatter.php b/src/Formatter/MNFormatter.php index 2d08597..5a04c9b 100644 --- a/src/Formatter/MNFormatter.php +++ b/src/Formatter/MNFormatter.php @@ -17,6 +17,11 @@ */ final class MNFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/MPFormatter.php b/src/Formatter/MPFormatter.php index 3c2c199..1460c0f 100644 --- a/src/Formatter/MPFormatter.php +++ b/src/Formatter/MPFormatter.php @@ -20,6 +20,11 @@ */ final class MPFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'U.S. ZIP codes. Range 96950 - 96952.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]+$/', $postcode) !== 1) { diff --git a/src/Formatter/MQFormatter.php b/src/Formatter/MQFormatter.php index f2d798f..1328c90 100644 --- a/src/Formatter/MQFormatter.php +++ b/src/Formatter/MQFormatter.php @@ -18,6 +18,11 @@ */ final class MQFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/MSFormatter.php b/src/Formatter/MSFormatter.php index f14b510..f9517db 100644 --- a/src/Formatter/MSFormatter.php +++ b/src/Formatter/MSFormatter.php @@ -21,6 +21,11 @@ */ final class MSFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'The format is MSR followed by a space then 4 digits, in the range 1110 to 1350.'; + } + public function format(string $postcode): ?string { if (str_starts_with($postcode, 'MSR')) { diff --git a/src/Formatter/MTFormatter.php b/src/Formatter/MTFormatter.php index 79ad7dc..6fce605 100644 --- a/src/Formatter/MTFormatter.php +++ b/src/Formatter/MTFormatter.php @@ -18,6 +18,11 @@ */ final class MTFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcode format is AAA NNNN, A standing for a letter and N standing for a digit.'; + } + public function format(string $postcode): ?string { if (preg_match('/^([A-Z]{3})([0-9]{4})$/', $postcode, $matches) !== 1) { diff --git a/src/Formatter/MUFormatter.php b/src/Formatter/MUFormatter.php index 7cd2646..0d78d3a 100644 --- a/src/Formatter/MUFormatter.php +++ b/src/Formatter/MUFormatter.php @@ -18,6 +18,11 @@ */ final class MUFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/MVFormatter.php b/src/Formatter/MVFormatter.php index d33df0e..a373c95 100644 --- a/src/Formatter/MVFormatter.php +++ b/src/Formatter/MVFormatter.php @@ -17,6 +17,11 @@ */ final class MVFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/MXFormatter.php b/src/Formatter/MXFormatter.php index 9cdc20f..06d5cc1 100644 --- a/src/Formatter/MXFormatter.php +++ b/src/Formatter/MXFormatter.php @@ -18,6 +18,11 @@ */ final class MXFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/MYFormatter.php b/src/Formatter/MYFormatter.php index 85cc743..4387cae 100644 --- a/src/Formatter/MYFormatter.php +++ b/src/Formatter/MYFormatter.php @@ -18,6 +18,11 @@ */ final class MYFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/MZFormatter.php b/src/Formatter/MZFormatter.php index 89b1c84..d8873fc 100644 --- a/src/Formatter/MZFormatter.php +++ b/src/Formatter/MZFormatter.php @@ -17,6 +17,11 @@ */ final class MZFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/NCFormatter.php b/src/Formatter/NCFormatter.php index 184a3df..4de96df 100644 --- a/src/Formatter/NCFormatter.php +++ b/src/Formatter/NCFormatter.php @@ -17,6 +17,11 @@ */ final class NCFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Overseas Collectivity of France. French codes used. Range 98800 - 98890.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/NEFormatter.php b/src/Formatter/NEFormatter.php index ea74874..917ab61 100644 --- a/src/Formatter/NEFormatter.php +++ b/src/Formatter/NEFormatter.php @@ -17,6 +17,11 @@ */ final class NEFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/NFFormatter.php b/src/Formatter/NFFormatter.php index 99112f0..34a8638 100644 --- a/src/Formatter/NFFormatter.php +++ b/src/Formatter/NFFormatter.php @@ -18,6 +18,11 @@ */ final class NFFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/NGFormatter.php b/src/Formatter/NGFormatter.php index 35e4194..2416cd6 100644 --- a/src/Formatter/NGFormatter.php +++ b/src/Formatter/NGFormatter.php @@ -18,6 +18,11 @@ */ final class NGFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postal codes in Nigeria are numeric, consisting of six digits.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{6}$/', $postcode) !== 1) { diff --git a/src/Formatter/NIFormatter.php b/src/Formatter/NIFormatter.php index 4a969bf..143dc95 100644 --- a/src/Formatter/NIFormatter.php +++ b/src/Formatter/NIFormatter.php @@ -18,6 +18,11 @@ */ final class NIFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postal codes in Nicaragua are 5 digit numeric.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/NLFormatter.php b/src/Formatter/NLFormatter.php index c73c2f6..56af1a6 100644 --- a/src/Formatter/NLFormatter.php +++ b/src/Formatter/NLFormatter.php @@ -20,6 +20,11 @@ */ final class NLFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcode format is NNNN AA, where N stands for a digit and A for a letter.'; + } + public function format(string $postcode): ?string { if (preg_match('/^([1-9][0-9]{3})([A-Z]{2})$/', $postcode, $matches) !== 1) { diff --git a/src/Formatter/NOFormatter.php b/src/Formatter/NOFormatter.php index 5b25557..183ca9f 100644 --- a/src/Formatter/NOFormatter.php +++ b/src/Formatter/NOFormatter.php @@ -18,6 +18,11 @@ */ final class NOFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Norwegian Postal Codes are 4-digit codes.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/NPFormatter.php b/src/Formatter/NPFormatter.php index 42817b4..58495f4 100644 --- a/src/Formatter/NPFormatter.php +++ b/src/Formatter/NPFormatter.php @@ -18,6 +18,11 @@ */ final class NPFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/NZFormatter.php b/src/Formatter/NZFormatter.php index daf5943..9f8cc4b 100644 --- a/src/Formatter/NZFormatter.php +++ b/src/Formatter/NZFormatter.php @@ -18,6 +18,11 @@ */ final class NZFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/OMFormatter.php b/src/Formatter/OMFormatter.php index a437263..f41f7e8 100644 --- a/src/Formatter/OMFormatter.php +++ b/src/Formatter/OMFormatter.php @@ -18,6 +18,11 @@ */ final class OMFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 3 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{3}$/', $postcode) !== 1) { diff --git a/src/Formatter/PAFormatter.php b/src/Formatter/PAFormatter.php index befc8e6..f1424e1 100644 --- a/src/Formatter/PAFormatter.php +++ b/src/Formatter/PAFormatter.php @@ -18,6 +18,11 @@ */ final class PAFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'The postal codes consist of four numeric digits.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/PEFormatter.php b/src/Formatter/PEFormatter.php index f7c336a..4712b9e 100644 --- a/src/Formatter/PEFormatter.php +++ b/src/Formatter/PEFormatter.php @@ -18,6 +18,11 @@ */ final class PEFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/PFFormatter.php b/src/Formatter/PFFormatter.php index 58eaa05..76c189c 100644 --- a/src/Formatter/PFFormatter.php +++ b/src/Formatter/PFFormatter.php @@ -18,6 +18,11 @@ */ final class PFFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcode format is 987NN, where N stands for a digit.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/PGFormatter.php b/src/Formatter/PGFormatter.php index 01a0867..0acba2e 100644 --- a/src/Formatter/PGFormatter.php +++ b/src/Formatter/PGFormatter.php @@ -17,6 +17,11 @@ */ final class PGFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 3 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{3}$/', $postcode) !== 1) { diff --git a/src/Formatter/PHFormatter.php b/src/Formatter/PHFormatter.php index 4fe9939..13915c2 100644 --- a/src/Formatter/PHFormatter.php +++ b/src/Formatter/PHFormatter.php @@ -18,6 +18,11 @@ */ final class PHFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/PKFormatter.php b/src/Formatter/PKFormatter.php index a67da95..cee8cee 100644 --- a/src/Formatter/PKFormatter.php +++ b/src/Formatter/PKFormatter.php @@ -18,6 +18,11 @@ */ final class PKFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/PLFormatter.php b/src/Formatter/PLFormatter.php index 1605720..798eaa7 100644 --- a/src/Formatter/PLFormatter.php +++ b/src/Formatter/PLFormatter.php @@ -23,6 +23,11 @@ */ final class PLFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits in the following format: xy-zzz.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/PMFormatter.php b/src/Formatter/PMFormatter.php index e7c6386..ee33aa8 100644 --- a/src/Formatter/PMFormatter.php +++ b/src/Formatter/PMFormatter.php @@ -15,6 +15,11 @@ */ final class PMFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'This country uses a single postcode, 97500.'; + } + public function format(string $postcode): ?string { if ($postcode === '97500') { diff --git a/src/Formatter/PNFormatter.php b/src/Formatter/PNFormatter.php index e6e3eae..7878fd9 100644 --- a/src/Formatter/PNFormatter.php +++ b/src/Formatter/PNFormatter.php @@ -15,6 +15,11 @@ */ final class PNFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'This country uses a single postcode for all addresses.'; + } + public function format(string $postcode): ?string { if ($postcode === 'PCRN1ZZ') { diff --git a/src/Formatter/PRFormatter.php b/src/Formatter/PRFormatter.php index cf7c471..d19eb78 100644 --- a/src/Formatter/PRFormatter.php +++ b/src/Formatter/PRFormatter.php @@ -20,6 +20,11 @@ */ final class PRFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Puerto Rico is allocated the US ZIP codes 00600 to 00799 and 00900 to 00999.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]+$/', $postcode) !== 1) { diff --git a/src/Formatter/PSFormatter.php b/src/Formatter/PSFormatter.php index 17b898a..c751c57 100644 --- a/src/Formatter/PSFormatter.php +++ b/src/Formatter/PSFormatter.php @@ -18,6 +18,11 @@ */ final class PSFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 3 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{3}$/', $postcode) !== 1) { diff --git a/src/Formatter/PTFormatter.php b/src/Formatter/PTFormatter.php index aac129d..9ce60e6 100644 --- a/src/Formatter/PTFormatter.php +++ b/src/Formatter/PTFormatter.php @@ -19,6 +19,11 @@ */ final class PTFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcode format is NNNN-NNN, N standing for a digit.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{7}$/', $postcode) !== 1) { diff --git a/src/Formatter/PWFormatter.php b/src/Formatter/PWFormatter.php index abc9b8c..e0be311 100644 --- a/src/Formatter/PWFormatter.php +++ b/src/Formatter/PWFormatter.php @@ -19,6 +19,11 @@ */ final class PWFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'U.S. ZIP codes. All locations 96940.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]+$/', $postcode) !== 1) { diff --git a/src/Formatter/PYFormatter.php b/src/Formatter/PYFormatter.php index 8671117..a611792 100644 --- a/src/Formatter/PYFormatter.php +++ b/src/Formatter/PYFormatter.php @@ -18,6 +18,11 @@ */ final class PYFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/REFormatter.php b/src/Formatter/REFormatter.php index 73d0aea..43dbf55 100644 --- a/src/Formatter/REFormatter.php +++ b/src/Formatter/REFormatter.php @@ -19,6 +19,11 @@ */ final class REFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, starting with 974, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/ROFormatter.php b/src/Formatter/ROFormatter.php index 8236961..a72b2c7 100644 --- a/src/Formatter/ROFormatter.php +++ b/src/Formatter/ROFormatter.php @@ -18,6 +18,11 @@ */ final class ROFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postal codes have six digits and no separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{6}$/', $postcode) !== 1) { diff --git a/src/Formatter/RSFormatter.php b/src/Formatter/RSFormatter.php index 773b000..ff79c37 100644 --- a/src/Formatter/RSFormatter.php +++ b/src/Formatter/RSFormatter.php @@ -18,6 +18,11 @@ */ final class RSFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Serbian postal codes consist of five digits.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/RUFormatter.php b/src/Formatter/RUFormatter.php index 5bb76e4..73c1059 100644 --- a/src/Formatter/RUFormatter.php +++ b/src/Formatter/RUFormatter.php @@ -18,6 +18,11 @@ */ final class RUFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postal codes have six digits and no separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{6}$/', $postcode) !== 1) { diff --git a/src/Formatter/SAFormatter.php b/src/Formatter/SAFormatter.php index ed1f110..ec5ee3a 100644 --- a/src/Formatter/SAFormatter.php +++ b/src/Formatter/SAFormatter.php @@ -19,6 +19,11 @@ */ final class SAFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'The postcode format is NNNNN for PO Boxes and NNNNN-NNNN for home delivery, N standing for a digit.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]+$/', $postcode) !== 1) { diff --git a/src/Formatter/SDFormatter.php b/src/Formatter/SDFormatter.php index 786ca7f..9fd1a35 100644 --- a/src/Formatter/SDFormatter.php +++ b/src/Formatter/SDFormatter.php @@ -17,6 +17,11 @@ */ final class SDFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/SEFormatter.php b/src/Formatter/SEFormatter.php index e959d5f..1c5458e 100644 --- a/src/Formatter/SEFormatter.php +++ b/src/Formatter/SEFormatter.php @@ -20,6 +20,11 @@ */ final class SEFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcode format is NNN NN. The lowest number is 100 00 and the highest number is 984 99.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/SGFormatter.php b/src/Formatter/SGFormatter.php index e1a23f0..58e6983 100644 --- a/src/Formatter/SGFormatter.php +++ b/src/Formatter/SGFormatter.php @@ -18,6 +18,11 @@ */ final class SGFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postal codes in Singapore consist of six digits, no separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{6}$/', $postcode) !== 1) { diff --git a/src/Formatter/SHFormatter.php b/src/Formatter/SHFormatter.php index 502e75f..b31e558 100644 --- a/src/Formatter/SHFormatter.php +++ b/src/Formatter/SHFormatter.php @@ -17,6 +17,11 @@ */ final class SHFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Saint Helena uses one code STHL 1ZZ'; + } + public function format(string $postcode): ?string { if ($postcode === 'STHL1ZZ') { diff --git a/src/Formatter/SIFormatter.php b/src/Formatter/SIFormatter.php index ee20f75..de26fdd 100644 --- a/src/Formatter/SIFormatter.php +++ b/src/Formatter/SIFormatter.php @@ -18,6 +18,11 @@ */ final class SIFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'The codes consist of four digits written without separator characters.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/SJFormatter.php b/src/Formatter/SJFormatter.php index 2d038d6..929c3fa 100644 --- a/src/Formatter/SJFormatter.php +++ b/src/Formatter/SJFormatter.php @@ -18,6 +18,11 @@ */ final class SJFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'This country uses Norwegian 4-digit postal codes.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/SKFormatter.php b/src/Formatter/SKFormatter.php index 34be20d..752eebc 100644 --- a/src/Formatter/SKFormatter.php +++ b/src/Formatter/SKFormatter.php @@ -23,6 +23,11 @@ */ final class SKFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits in the following format: xxx xx.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/SMFormatter.php b/src/Formatter/SMFormatter.php index 4f6c873..b9a84d4 100644 --- a/src/Formatter/SMFormatter.php +++ b/src/Formatter/SMFormatter.php @@ -18,6 +18,11 @@ */ final class SMFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'The postcode format is 4789N, where N stands for a digit.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/SNFormatter.php b/src/Formatter/SNFormatter.php index 42f6317..1367fa0 100644 --- a/src/Formatter/SNFormatter.php +++ b/src/Formatter/SNFormatter.php @@ -17,6 +17,11 @@ */ final class SNFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/SVFormatter.php b/src/Formatter/SVFormatter.php index 976d454..41ca121 100644 --- a/src/Formatter/SVFormatter.php +++ b/src/Formatter/SVFormatter.php @@ -17,6 +17,11 @@ */ final class SVFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/SZFormatter.php b/src/Formatter/SZFormatter.php index 56b718a..b7a057d 100644 --- a/src/Formatter/SZFormatter.php +++ b/src/Formatter/SZFormatter.php @@ -17,6 +17,11 @@ */ final class SZFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcode format is ANNN, A standing for a letter and N for a digit.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[A-Z][0-9]{3}$/', $postcode, $matches) !== 1) { diff --git a/src/Formatter/TCFormatter.php b/src/Formatter/TCFormatter.php index 53482d4..71c23c0 100644 --- a/src/Formatter/TCFormatter.php +++ b/src/Formatter/TCFormatter.php @@ -15,6 +15,11 @@ */ final class TCFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'This country uses a single postcode for all addresses: TKCA1ZZ.'; + } + public function format(string $postcode): ?string { if ($postcode === 'TKCA1ZZ') { diff --git a/src/Formatter/TFFormatter.php b/src/Formatter/TFFormatter.php index 8530214..eb86df6 100644 --- a/src/Formatter/TFFormatter.php +++ b/src/Formatter/TFFormatter.php @@ -18,6 +18,11 @@ */ final class TFFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'French codes in the 98400 range have been reserved, but do not seem to be in use at the moment.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/THFormatter.php b/src/Formatter/THFormatter.php index eb34def..804cf43 100644 --- a/src/Formatter/THFormatter.php +++ b/src/Formatter/THFormatter.php @@ -18,6 +18,11 @@ */ final class THFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/TJFormatter.php b/src/Formatter/TJFormatter.php index ab8cd37..75ab4cd 100644 --- a/src/Formatter/TJFormatter.php +++ b/src/Formatter/TJFormatter.php @@ -17,6 +17,11 @@ */ final class TJFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 6 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{6}$/', $postcode) !== 1) { diff --git a/src/Formatter/TMFormatter.php b/src/Formatter/TMFormatter.php index 55d9664..e7d0394 100644 --- a/src/Formatter/TMFormatter.php +++ b/src/Formatter/TMFormatter.php @@ -17,6 +17,11 @@ */ final class TMFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postal codes in Turkmenistan are 6 digit numeric.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{6}$/', $postcode) !== 1) { diff --git a/src/Formatter/TNFormatter.php b/src/Formatter/TNFormatter.php index c418e98..6be720d 100644 --- a/src/Formatter/TNFormatter.php +++ b/src/Formatter/TNFormatter.php @@ -18,6 +18,11 @@ */ final class TNFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/TRFormatter.php b/src/Formatter/TRFormatter.php index e7bb888..d74fabd 100644 --- a/src/Formatter/TRFormatter.php +++ b/src/Formatter/TRFormatter.php @@ -18,6 +18,11 @@ */ final class TRFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/TTFormatter.php b/src/Formatter/TTFormatter.php index d72c640..edc89d4 100644 --- a/src/Formatter/TTFormatter.php +++ b/src/Formatter/TTFormatter.php @@ -18,6 +18,11 @@ */ final class TTFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 6 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{6}$/', $postcode) !== 1) { diff --git a/src/Formatter/TWFormatter.php b/src/Formatter/TWFormatter.php index 09fa231..905c84f 100644 --- a/src/Formatter/TWFormatter.php +++ b/src/Formatter/TWFormatter.php @@ -22,6 +22,11 @@ */ final class TWFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Acceptable formats are NNN and NNN-NN, N standing for a digit.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]+$/', $postcode) !== 1) { diff --git a/src/Formatter/TZFormatter.php b/src/Formatter/TZFormatter.php index 432c006..b4e813b 100644 --- a/src/Formatter/TZFormatter.php +++ b/src/Formatter/TZFormatter.php @@ -17,6 +17,11 @@ */ final class TZFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/UAFormatter.php b/src/Formatter/UAFormatter.php index d9cd5a2..78c10a4 100644 --- a/src/Formatter/UAFormatter.php +++ b/src/Formatter/UAFormatter.php @@ -18,6 +18,11 @@ */ final class UAFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/USFormatter.php b/src/Formatter/USFormatter.php index f460eb8..b60aa6f 100644 --- a/src/Formatter/USFormatter.php +++ b/src/Formatter/USFormatter.php @@ -22,6 +22,11 @@ */ final class USFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes in the USA are called ZIP codes.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]+$/', $postcode) !== 1) { diff --git a/src/Formatter/UYFormatter.php b/src/Formatter/UYFormatter.php index 548bc99..d954fd9 100644 --- a/src/Formatter/UYFormatter.php +++ b/src/Formatter/UYFormatter.php @@ -17,6 +17,11 @@ */ final class UYFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/UZFormatter.php b/src/Formatter/UZFormatter.php index 32f2e91..7324dfd 100644 --- a/src/Formatter/UZFormatter.php +++ b/src/Formatter/UZFormatter.php @@ -17,6 +17,11 @@ */ final class UZFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postal codes in Uzbekistan are 6 digit numeric.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{6}$/', $postcode) !== 1) { diff --git a/src/Formatter/VAFormatter.php b/src/Formatter/VAFormatter.php index 41a9115..21a896a 100644 --- a/src/Formatter/VAFormatter.php +++ b/src/Formatter/VAFormatter.php @@ -15,6 +15,11 @@ */ final class VAFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Single code used for all addresses. Part of the Italian postal code system.'; + } + public function format(string $postcode): ?string { if ($postcode === '00120') { diff --git a/src/Formatter/VCFormatter.php b/src/Formatter/VCFormatter.php index b48bd0c..69dd33a 100644 --- a/src/Formatter/VCFormatter.php +++ b/src/Formatter/VCFormatter.php @@ -20,6 +20,11 @@ */ final class VCFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'The postcode format is VCNNNN, where N represents a digit.'; + } + public function format(string $postcode): ?string { if (str_starts_with($postcode, 'VC')) { diff --git a/src/Formatter/VEFormatter.php b/src/Formatter/VEFormatter.php index f1191d8..0b1b22f 100644 --- a/src/Formatter/VEFormatter.php +++ b/src/Formatter/VEFormatter.php @@ -17,6 +17,11 @@ */ final class VEFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/VGFormatter.php b/src/Formatter/VGFormatter.php index a0ad208..c98b36a 100644 --- a/src/Formatter/VGFormatter.php +++ b/src/Formatter/VGFormatter.php @@ -20,6 +20,11 @@ */ final class VGFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'The postcode format is VG followed by 4 digits, specifically VG1110 through VG1160.'; + } + public function format(string $postcode): ?string { if (str_starts_with($postcode, 'VG')) { diff --git a/src/Formatter/VIFormatter.php b/src/Formatter/VIFormatter.php index bb7c75e..16a98e6 100644 --- a/src/Formatter/VIFormatter.php +++ b/src/Formatter/VIFormatter.php @@ -19,6 +19,11 @@ */ final class VIFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'U.S. ZIP codes. Range 00801 - 00851.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]+$/', $postcode) !== 1) { diff --git a/src/Formatter/VNFormatter.php b/src/Formatter/VNFormatter.php index 65fcaf1..f6b6b23 100644 --- a/src/Formatter/VNFormatter.php +++ b/src/Formatter/VNFormatter.php @@ -18,6 +18,11 @@ */ final class VNFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postal codes are 6 digit numeric.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{6}$/', $postcode) !== 1) { diff --git a/src/Formatter/WFFormatter.php b/src/Formatter/WFFormatter.php index 5e971de..b460d5e 100644 --- a/src/Formatter/WFFormatter.php +++ b/src/Formatter/WFFormatter.php @@ -18,6 +18,11 @@ */ final class WFFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/WSFormatter.php b/src/Formatter/WSFormatter.php index a11e97f..86137cf 100644 --- a/src/Formatter/WSFormatter.php +++ b/src/Formatter/WSFormatter.php @@ -20,6 +20,11 @@ */ final class WSFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'The postcode format is WSNNNN, where N represents a digit.'; + } + public function format(string $postcode): ?string { if (str_starts_with($postcode, 'WS')) { diff --git a/src/Formatter/YTFormatter.php b/src/Formatter/YTFormatter.php index 8e97dd4..64dcc47 100644 --- a/src/Formatter/YTFormatter.php +++ b/src/Formatter/YTFormatter.php @@ -18,6 +18,11 @@ */ final class YTFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/Formatter/ZAFormatter.php b/src/Formatter/ZAFormatter.php index 1f1c848..77dfee3 100644 --- a/src/Formatter/ZAFormatter.php +++ b/src/Formatter/ZAFormatter.php @@ -18,6 +18,11 @@ */ final class ZAFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 4 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{4}$/', $postcode) !== 1) { diff --git a/src/Formatter/ZMFormatter.php b/src/Formatter/ZMFormatter.php index 3432c13..e436b2a 100644 --- a/src/Formatter/ZMFormatter.php +++ b/src/Formatter/ZMFormatter.php @@ -17,6 +17,11 @@ */ final class ZMFormatter implements CountryPostcodeFormatter { + public function hint(): string + { + return 'Postcodes consist of 5 digits, without separator.'; + } + public function format(string $postcode): ?string { if (preg_match('/^[0-9]{5}$/', $postcode) !== 1) { diff --git a/src/InvalidPostcodeException.php b/src/InvalidPostcodeException.php index 52a2046..a6c9944 100644 --- a/src/InvalidPostcodeException.php +++ b/src/InvalidPostcodeException.php @@ -15,14 +15,17 @@ final class InvalidPostcodeException extends Exception protected string $country; + protected string $hint; + /** * Construct exception thrown when trying to format an invalid postcode. */ - public function __construct(string $postcode, string $country) + public function __construct(string $postcode, string $country, string $hint) { parent::__construct('Invalid postcode: ' . $postcode); $this->postcode = $postcode; $this->country = $country; + $this->hint = $hint; } /** @@ -40,4 +43,12 @@ public function getCountry(): string { return $this->country; } + + /** + * Get the hint associated with this exception. + */ + public function getHint(): string + { + return $this->hint; + } } diff --git a/src/PostcodeFormatter.php b/src/PostcodeFormatter.php index c955cc8..eba76e4 100644 --- a/src/PostcodeFormatter.php +++ b/src/PostcodeFormatter.php @@ -46,13 +46,13 @@ public function format(string $country, string $postcode): string } if (preg_match('/^[A-Z0-9]+$/', $postcode) !== 1) { - throw new InvalidPostcodeException($postcode, $country); + throw new InvalidPostcodeException($postcode, $country, $formatter->hint()); } $formatted = $formatter->format($postcode); if ($formatted === null) { - throw new InvalidPostcodeException($postcode, $country); + throw new InvalidPostcodeException($postcode, $country, $formatter->hint()); } return $formatted;