PDA

View Full Version : UK Postcode Validation


ABC123

Esio Trot
05-17-2007, 07:36 AM
Rather than try and re-invent the wheel, I am wondering if any members have, or know where in can be obtained, validating code for entering postcodes into a field.

Thanks in advance.

Robin James
05-18-2007, 07:48 AM
Yes, I'd also like to know if someone has done it. I thought about it from looking at:

http://www.datadictionaryadmin.scot.nhs.uk/isddd/ISD_DT_TOP_Content.jsp;jsessionid=B707B362D5C4269422C8F8494D36D616?pContentID=1799&p_applic=CCC&p_service=Content.show&
and
http://www.govtalk.gov.uk/gdsc/html/frames/PostCode.htm

but is more involved than my first glance suggested. Perhaps the easiest is to buy a postcode to address generator - almost certainly works with Alpha. Costs £80 per year per machine cheapest(?).

Shame also our UK phone numbers don't have a consistent format like US.

Tony Rutherford
05-18-2007, 09:13 AM
I have designed two functions to check whether a postcode has a valid structure. Please note - they only check the structure, i.e. whether the letters and numbers are in the right places; they don't tell you whether the postcode actually exists.

ValidPostcode() returns .T. or .F. - it can be used in the CanWrite event in a field rule, e.g.:


if ValidPostcode(upper(a_field_value) = .F. then
cancel()
end if

If the result is .F., a message box tells you why it is invalid.

ValidPostcode2() returns a character result - either "OK" or the reason why it isn't OK.

The structure of valid postcodes is specified in the Cabinet Office's UK Data Standards Catalogue at http://www.govtalk.gov.uk/gdsc/html/frames/PostCode.htm

Please note that the website says that the structure could change in the future.

ValidPostcode():


FUNCTION ValidPostcode as L (vcPostCode as C)

'Checks whether postcode structure is valid
'Created by Tony Rutherford 10/9/06
'Based on information at http://www.govtalk.gov.uk/gdsc/html/frames/PostCode.htm
'Copyright Tony Rutherford 2006

'Declare & initialise variables
DIM vcPostCode as C 'user input
DIM i as N 'counter
DIM vcChar as C 'character value
DIM vnAscii as N 'ascii code value
DIM vcFormat as C 'format of postcode
DIM vnSpacePos as N 'position of space in postcode

'Check for special code
IF vcPostCode = "GIR 0AA" THEN
ValidPostcode = .T.
EXIT FUNCTION
END IF

'Check for multiple spaces
IF at(" ", vcPostCode) <> 0 THEN
msgbox("Error!", "Postcode cannot contain multiple spaces", UI_STOP_SYMBOL + UI_OK)
ValidPostcode = .F.
EXIT FUNCTION
END IF

'Check for leading/trailing spaces
IF vcPostCode <> ltrim(vcPostCode) THEN
msgbox("Error!", "Postcode must not have leading spaces.", UI_STOP_SYMBOL + UI_OK)
ValidPostcode = .F.
EXIT FUNCTION
END IF

'Check number of words
IF w_count(vcPostCode) <> 2 THEN
msgbox("Error!", "Postcode must have two parts separated by a space.", UI_STOP_SYMBOL + UI_OK)
ValidPostcode = .F.
EXIT FUNCTION
END IF

'Check structure
FOR i = 1 to len(vcPostCode)
vcChar = substr(vcPostCode, i, 1)
vnAscii = asc(vcChar)
IF vnAscii >= 65 .and. vnAscii <= 90 THEN
vcFormat = vcFormat + "A"
ELSEIF vnAscii >= 48 .and. vnAscii <= 57 then
vcFormat = vcFormat + "N"
ELSEIF vcChar = " " then
vcFormat = vcFormat + " "
ELSE
msgbox("Error!", "Postcode must have two parts separated by a space. Only letters and numbers can be used.", UI_STOP_SYMBOL + UI_OK)
ValidPostcode = .F.
EXIT FUNCTION
END IF
NEXT i
IF .not. word_exists("AN NAA,ANN NAA,AAN NAA,AANN NAA,ANA NAA,AANA NAA", vcFormat, ",") THEN
msgbox("Error!", "Postcode must be in one of the following forms: AN NAA,ANN NAA,AAN NAA,AANN NAA,ANA NAA,AANA NAA, where A is a letter and N is a number.", UI_STOP_SYMBOL + UI_OK)
ValidPostcode = .F.
EXIT FUNCTION
END IF

'Check 1st character
vcChar = left(vcPostCode, 1)
IF vcChar $ "QVX" THEN
msgbox("Error!", "The first character cannot be Q, V or X.", UI_STOP_SYMBOL + UI_OK)
ValidPostcode = .F.
EXIT FUNCTION
END IF

'Check 2nd character
IF substr(vcFormat, 2, 1) = "A" THEN
vcChar = substr(vcPostCode, 2, 1)
IF vcChar $ "IJZ" THEN
msgbox("Error!", "The second character cannot be I, J or Z.", UI_STOP_SYMBOL + UI_OK)
ValidPostcode = .F.
EXIT FUNCTION
END IF
END IF

'Check 3rd character
IF substr(vcFormat, 3, 1) = "A" THEN
vcChar = substr(vcPostCode, 3, 1)
IF .not. (vcChar $ "ABCDEFGHJKSTUW") THEN
msgbox("Error!", "The third character must be A, B, C, D, E, F, G, H, J, K, S, T, U or W.", UI_STOP_SYMBOL + UI_OK)
ValidPostcode = .F.
EXIT FUNCTION
END IF
END IF

'Check 4th character
IF substr(vcFormat, 4, 1) = "A" THEN
vcChar = substr(vcPostCode, 4, 1)
IF .not. (vcChar $ "ABEHMNPRVWXY") THEN
msgbox("Error!", "The fourth character must be A, B, E, H, M, N, P, R, V, W, X or Y.", UI_STOP_SYMBOL + UI_OK)
ValidPostcode = .F.
EXIT FUNCTION
END IF
END IF

'Check 2nd half
vnSpacePos = at(" ", vcPostCode)
FOR i = 1 to 2
vcChar = substr(vcPostCode, vnSpacePos + i + 1, 1)
IF vcChar $ "CIKMOV" THEN
msgbox("Error!", "The characters in the second part of the postcode cannot be C, I, K, M, O or V.", UI_STOP_SYMBOL + UI_OK)
ValidPostcode = .F.
EXIT FUNCTION
END IF
NEXT i

ValidPostcode = .T.

END FUNCTION


ValidPostcode2():


FUNCTION ValidPostcode2 as C (vcPostCode as C)

'Checks whether postcode structure is valid and returns either "OK" or error message as result
'Created by Tony Rutherford 10/9/06
'Based on information at http://www.govtalk.gov.uk/gdsc/html/frames/PostCode.htm
'Copyright Tony Rutherford 2006

'Declare & initialise variables
DIM vcPostCode as C 'user input
DIM i as N 'counter
DIM vcChar as C 'character value
DIM vnAscii as N 'ascii code value
DIM vcFormat as C 'format of postcode
DIM vnSpacePos as N 'position of space in postcode

'Check for special code
IF vcPostCode = "GIR 0AA" THEN
ValidPostcode2 = .T.
EXIT FUNCTION
END IF

'Check for multiple spaces
IF at(" ", vcPostCode) <> 0 THEN
ValidPostcode2 = "Postcode cannot contain multiple spaces"
EXIT FUNCTION
END IF

'Check for leading/trailing spaces
IF vcPostCode <> ltrim(vcPostCode) THEN
ValidPostcode2 ="Postcode must not have leading spaces."
EXIT FUNCTION
END IF

'Check number of words
IF w_count(vcPostCode) <> 2 THEN
ValidPostcode2 = "Postcode must have two parts separated by a space."
EXIT FUNCTION
END IF

'Check structure
FOR i = 1 to len(vcPostCode)
vcChar = substr(vcPostCode, i, 1)
vnAscii = asc(vcChar)
IF vnAscii >= 65 .and. vnAscii <= 90 THEN
vcFormat = vcFormat + "A"
ELSEIF vnAscii >= 48 .and. vnAscii <= 57 then
vcFormat = vcFormat + "N"
ELSEIF vcChar = " " then
vcFormat = vcFormat + " "
ELSE
ValidPostcode2 = "Postcode must have two parts separated by a space. Only letters and numbers can be used"
EXIT FUNCTION
END IF
NEXT i
IF .not. word_exists("AN NAA,ANN NAA,AAN NAA,AANN NAA,ANA NAA,AANA NAA", vcFormat, ",") THEN
ValidPostcode2 ="Postcode format must be: AN NAA,ANN NAA,AAN NAA,AANN NAA,ANA NAA,AANA NAA"
EXIT FUNCTION
END IF

'Check 1st character
vcChar = left(vcPostCode, 1)
IF vcChar $ "QVX" THEN
ValidPostcode2 = "The first character cannot be Q, V or X."
EXIT FUNCTION
END IF

'Check 2nd character
IF substr(vcFormat, 2, 1) = "A" THEN
vcChar = substr(vcPostCode, 2, 1)
IF vcChar $ "IJZ" THEN
ValidPostcode2 = "The second character cannot be I, J or Z."
EXIT FUNCTION
END IF
END IF

'Check 3rd character
IF substr(vcFormat, 3, 1) = "A" THEN
vcChar = substr(vcPostCode, 3, 1)
IF .not. (vcChar $ "ABCDEFGHJKSTUW") THEN
ValidPostcode2 = "The third character must be A, B, C, D, E, F, G, H, J, K, S, T, U or W."
EXIT FUNCTION
END IF
END IF

'Check 4th character
IF substr(vcFormat, 4, 1) = "A" THEN
vcChar = substr(vcPostCode, 4, 1)
IF .not. (vcChar $ "ABEHMNPRVWXY") THEN
ValidPostcode2 ="The fourth character must be A, B, E, H, M, N, P, R, V, W, X or Y."
EXIT FUNCTION
END IF
END IF

'Check 2nd half
vnSpacePos = at(" ", vcPostCode)
FOR i = 1 to 2
vcChar = substr(vcPostCode, vnSpacePos + i + 1, 1)
IF vcChar $ "CIKMOV" THEN
ValidPostcode2 = "The characters in the second part of the postcode cannot be C, I, K, M, O or V."
EXIT FUNCTION
END IF
NEXT i

ValidPostcode2 = "OK"

END FUNCTION

I hope this helps.
Tony

Esio Trot
05-18-2007, 09:17 AM
That is exactly what I needed, Tony.

You are a star!

Thanks
David

NoeticCC
05-15-2008, 07:59 AM
Belated thanks, that is wonderful! :)