Skip to content

Instantly share code, notes, and snippets.

@mciastek
Last active September 17, 2018 17:45
Show Gist options
  • Save mciastek/28a2d59dd937ccdad797 to your computer and use it in GitHub Desktop.
Save mciastek/28a2d59dd937ccdad797 to your computer and use it in GitHub Desktop.
Angular phone number filter
/**
* [Filter] phone number filter
* Usage: {{ phoneNumber | {prefix} {range} {range} {range} }}
* {prefix} - e.g. {+48}
* {range} - e.g. {3} or {2-3}
* -> where first number in {2-3} defines slicing when string.length equals 7,
* second defines slicing for length equal 9
*/
angular.module('app').filter('phoneNumber', function() {
return function(item, pattern) {
// if no item return empty string
if (!item) {
return '';
}
// if not pattern provided set default pattern
if (!pattern) {
pattern = '{+48} {3} {2-3} {2-3}';
}
try {
if (pattern) {
pattern.match(/\{(\S{1,3})\}/g);
}
} catch (err) {
throw new Error('Please enter proper filter pattern. For example: {+48} {3} {2-3} {2-3}');
}
// get patterns
var patternArray = pattern.match(/\{(\S{1,3})\}/g);
// get prefix and gap
var prefix = patternArray[0].match(/\+\d{2}/);
var gap = pattern.match(/}(\S|\s){/)[1];
var formattedNumber = '';
var phone = '';
// slices length container
var slices = [];
var sliceRange = 0;
var i;
// clear filtered item from whitespaces
item = item.toString().replace(new RegExp('^\\' + prefix + '|\\s+|', 'g'), '');
// push slices to array from patternArray
for (i = (prefix) ? 1 : 0; i < patternArray.length; i++) {
if (patternArray[i].match(/[a-z]+/g)) {
throw new Error('Please provide number range into filter');
}
if (patternArray[i].match(/\d/g).length === 1) {
slices.push(patternArray[i].match(/\d/g)[0]);
} else {
slices.push(patternArray[i].match(/\d/g));
}
}
// set slice range according to item.length
switch (item.length) {
case 9:
sliceRange = 1;
break;
case 7:
sliceRange = 0;
break;
default:
return item;
}
// build phone number
for (i = 0; i < slices.length; i++) {
// if slice is not range type,
// for example: {3}
if (typeof slices[i] !== 'object') {
if (i === 0) {
phone += item.slice(0, parseInt(slices[i], 10)) + gap;
} else {
if (i !== (slices.length - 1)) {
phone += item.slice( ((phone.length) - (gap.length * i)), ((phone.length) - (gap.length * i)) + parseInt(slices[i], 10)) + gap;
} else {
phone += item.slice( ((phone.length) - (gap.length * i)), ((phone.length) - (gap.length * i)) + parseInt(slices[i], 10));
}
}
// if slices is range type,
// for example {2-3}
} else {
if (i === 0) {
phone += item.slice(0, parseInt(slices[i][sliceRange], 10)) + gap;
} else {
if (i !== (slices.length - 1)) {
phone += item.slice( ((phone.length) - (gap.length * i)), ((phone.length) - (gap.length * i)) + parseInt(slices[i][sliceRange], 10)) + gap;
} else {
phone += item.slice( ((phone.length) - (gap.length * i)), ((phone.length) - (gap.length * i)) + parseInt(slices[i][sliceRange], 10))
}
}
}
}
// if prefix is defined add prefix to number
if (prefix) {
formattedNumber = prefix + gap + phone;
} else {
formattedNumber = phone;
}
return formattedNumber;
};
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment