Tom Pinchen
Tom Pinchen

Reputation: 2497

Add a space to UK Postcode in correct place Javascript

I am trying to write a basic function that will allow me to add a space to UK postcodes where the spaces have been removed.

UK postcodes always have a space before the final digit of the postcode string.

Some examples with no spacing and with correct spacing:

CB30QB => CB3 0QB
N12NL => N1 2NL
OX144FB => OX14 4FB

To find the final digit in the string I am regex /\d(?=\D*$)/g and the Javascript I have in place currently is as follows:

// Set the Postcode
var postCode = "OX144FB";

// Find the index position of the final digit in the string (in this case '4')
var postcodeIndex = postCode.indexOf(postCode.match(/\d(?=\D*$)/g));

// Slice the final postcode at the index point, add a space and join back together.
var finalPostcode = [postCode.slice(0, postcodeIndex), ' ', postCode.slice(postcodeIndex)].join('');

return finalPostcode;

I am getting the following results when I change the set postcost:

CB30QB becomes CB3 0QB - Correct
N12NL becomes N1 2NL - Correct
CB249LQ becomes CB24 9LQ - Correct
OX144FB becomes OX1 44FB - Incorrect
OX145FB becomes OX14 5FB - Correct

It seems that the issue might be to do with having two digits of the same value as most other combinations seem to work.

Does anyone know how I can fix this?

Upvotes: 4

Views: 4738

Answers (6)

Curtis Parfitt-Ford
Curtis Parfitt-Ford

Reputation: 128

This is an old problem, but whilst Avinash Raj's solution works, it only works if all your postcodes are without spaces. If you have a mix, and you want to regularize them to having a single space, you can use this regex:

string.replace(/(\S*)\s*(\d)/, "$1 $2");

DEMO - it even works with more than one space!

Upvotes: 2

Casimir et Hippolyte
Casimir et Hippolyte

Reputation: 89557

Using the String.prototype.replace method is obviously the easiest way:

return postCode.replace(/(?=\d\D*$)/, ' ');

or using the greediness:

return postCode.replace(/^(.*)(?=\d)/, '$1 ');

Your previous code doesn't work because you are searching with indexOf the substring matched with the String.prototype.match() method (that is the last digit before the end). But if this digit is several times in the string, indexOf will return the position of the first occurrence.

As an aside, when you want to find the position of a match in a string, use the String.prototype.search() method that returns this position.

Upvotes: 1

Mariano
Mariano

Reputation: 6511

As everyone else is answering, .replace() is easier. However, let me point what's wrong in the code.

The problem is you're using postCode.indexOf() to find the first occurence of what has been matched. In this case:

Text:     OX144FB
Match:        ^ match is correct: "4"

Text:     OX144FB
IndexOf:     ^ first occurence of "4"

To fix it, use the .index of the match object:

// Find the index position of the final digit in the string (in this case '4')
var postcodeIndex = postCode.match(/\d(?=\D*$)/g).index;

Upvotes: 2

Pranav C Balan
Pranav C Balan

Reputation: 115222

You can use replace() with regex, you need to place space before 3 letters from the end

document.write('CB30QB'.replace(/^(.*)(.{3})$/,'$1 $2')+'<br>');
document.write('N12NL'.replace(/^(.*)(.{3})$/,'$1 $2')+'<br>');
document.write('CB249LQ'.replace(/^(.*)(.{3})$/,'$1 $2')+'<br>');
document.write('OX144FB'.replace(/^(.*)(.{3})$/,'$1 $2'));

Upvotes: 4

Nermin
Nermin

Reputation: 6100

var postCode = "OX144FB";

return postCode.replace(/^(.*)(\d)(.*)/, "$1 $2$3");

Upvotes: 1

Avinash Raj
Avinash Raj

Reputation: 174696

I should use string.replace

string.replace(/^(.*)(\d)/, "$1 $2");

DEMO

Upvotes: 10

Related Questions