In my app I am taking phone number as an input from user. Number should be in US format. I want to display it like (555)-888-888 dynamically. For example when user starts to input number when he reaches to 4 digit it shows number like this (555)-4 and so on. I tried to replaceString method but i found that it will not work.
-
1Possible duplicate: http://stackoverflow.com/questions/6052966/phone-number-formatting – Radu Dan Feb 28 '14 at 10:38
-
1possible duplicate of [UITextField for Phone Number](http://stackoverflow.com/questions/1246439/uitextfield-for-phone-number) – Amar Feb 28 '14 at 10:47
-
Your answer is right there [https://stackoverflow.com/questions/45606112/phone-number-format-from-country-code](https://stackoverflow.com/questions/45606112/phone-number-format-from-country-code) – Shahbaz Saleem Mar 13 '18 at 01:54
6 Answers
Look at NBAsYouTypeFormatter
class of libPhoneNumber-iOS library.
You create new instance of NSAsYouTypeFormatter
with your US region code given:
NBAsYouTypeFormatter *asYouTypeFormatter = [[NBAsYouTypeFormatter alloc] initWithRegionCode:REGION_CODE_STRING];
Then every time user changes the phone number you call:
- (NSString*)inputDigit:(NSString*)nextChar;
or
- (NSString*)removeLastDigit;
Returned NSString
from this two methods is your dynamically formatted phone number.

- 6,069
- 1
- 22
- 39
-
1
-
What if I need not do this real-time. For example, If I input number and country code, I should get formatted number. Any idea 'Damir179'? – NSPratik Feb 03 '15 at 13:44
-
1I got my answer by doing : `NBAsYouTypeFormatter *asYouTypeFormatter = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"US"]; NSString *output = [asYouTypeFormatter inputString:@"9999988888"];` – NSPratik Feb 03 '15 at 14:03
-
Damir179 : I have downloaded demo project from - [ https://github.com/iziz/libPhoneNumber-iOS ] . Problem is that there are lots of files in that project. I don't think all those are required. Can u guide me only which files I need to include in my existing project. I just need to format number by passing country code. Thanks in advance. – NSPratik Feb 04 '15 at 04:21
-
Also one more que: Every time user changes the phone number you call: `- (NSString*)inputDigit:(NSString*)nextChar;` or `- (NSString*)removeLastDigit;` . How we will know that the character is added or removed ? – NSPratik Feb 04 '15 at 06:07
-
I moved ahead. But `textField.text = [asYouTypeFormatter inputDigit:string];` is not working for me... I am doing this in `- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string` – NSPratik Feb 04 '15 at 08:18
-
Thanks Damir179, answer Upvoted. I got a direction from your answer and could do what I wanted. Also, I am going to add new answer which explain from scratch on how to format phone number textfield based on region code. – NSPratik Feb 04 '15 at 12:11
-
@damirstuhec Can you please share NBAsYouTypeFormatter in Swift Because I have implemented it but for the US it's not adding '(' , ' )' brackets as per format it's formatting like this: - +1669-3503455. – Parth Barot May 03 '19 at 11:19
-
@ParthBarot that's specific to how the library works, not the programming language used. Please file an issue in the library's repo if it doesn't support your format currently. – damirstuhec May 04 '19 at 15:17
I am going to explain from scratch. So, new users can get the way from start.
Download libPhoneNumber-iOS library from here. At the bottom side of the page of that link, you will find what files you need to add to your project.
Now, follow below steps to implement.
(1) Import files in the view controller where you need your textfield to be formatted.
#import "NBPhoneMetaDataGenerator.h"
#import "NBPhoneNumberUtil.h"
#import "NBAsYouTypeFormatter.h"
and make instance of type NBAsYouTypeFormatter in header file:
NBAsYouTypeFormatter *asYouTypeFormatter;
(2) In the viewDidLoad
method of that view controller, initialize that object taken earlier:
asYouTypeFormatter = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"IN"];
Note: @"IN" is for India. You can set it to anything you want. Refer to plist file that will be included in libPhoneNumber-iOS library to view full list of region codes.
(3) In delegate method of UITextField
, dynamically manage text of yout textfield.
#pragma mark
#pragma mark - Phone Number textfield formatting
# define LIMIT 18 // Or whatever you want
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
// Just allow 18 digits
if(!(([string length] + range.location) > LIMIT))
{
// Something entered by user
if(range.length == 0)
{
[txtNumber setText:[asYouTypeFormatter inputDigit:string]];
}
// Backspace
else if(range.length == 1)
{
[txtNumber setText:[asYouTypeFormatter removeLastDigit]];
}
}
return NO;
}
Hope it helps !!!

- 4,714
- 7
- 51
- 81
-
1What if there is already a phone number in the textField and we just want to change a few numbers ? – Frederic Adda Sep 01 '15 at 15:37
-
1
-
`[asYouTypeFormatter inputDigit:yourString]` : This is the key method which will give you formatted string – NSPratik Sep 02 '15 at 07:09
-
1Ah OK, I found the solution in your answer to the other question! It's inputString. Thanks a lot ! – Frederic Adda Sep 02 '15 at 10:47
-
I found a solution that I wanted to share because, even with the solutions previously presented here, I had a hard time finding how to make it work.
I have a tableView whose cells include a textField. One of this cells bear the phone number. It can be already filled-in in some cases, or not.
This is in Swift by the way.
Make sure your bridging header file nameOfYourProject-Bridging-Header includes the following line:
#import "NBAsYouTypeFormatter.h"
Declare a property for the NBAsYouTypeFormatter:
private var phoneFormatter: NBAsYouTypeFormatter!
in viewDidLoad, or didSet of a property, initialize the NBAsYouTypeFormatter with the country code:
// yourRegionCode is a 2-digit country code (ISO 3166) phoneFormatter = NBAsYouTypeFormatter(regionCode: yourRegionCode)
Declare your viewController as a TextFieldDelegate and implement function shouldChangeCharactersInRange:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { // Phone number cell if cellContainsPhoneNumber { // This is specific to your own tableView // Formatting phone number as you type let textWithoutSpaces = textField.text.stringByReplacingOccurrencesOfString(" ", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil) phoneFormatter.inputString(textWithoutSpaces) // This is the initial value of the phoneFormatter each time the delegate method is called let formattedNumber: String! if string == "" { formattedNumber = phoneFormatter.removeLastDigit() } else { formattedNumber = phoneFormatter.inputDigit(string) } // set the textField text with the new formattedNumber textField.text = formattedNumber return false } return true }
This way, it works exactly as Apple's contact edition mechanism. Let me know if this helped you.

- 5,905
- 4
- 56
- 71
-
I have implemented it but for the US it's not adding ( & ) brackets as per format it's formatting like this: - +1669-3503455. – Parth Barot May 03 '19 at 11:16
Here's an updated snippet that generally works for me (Swift 2.0):
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
// Allow up to 18 chars
if !(string.characters.count + range.location > 18) {
if range.length == 0 {
// original text didn't change
textField.text = phoneFormatter?.inputDigit(string)
} else if range.length == 1 {
// user pressed backspace
textField.text = phoneFormatter?.removeLastDigit()
} else if range.length == textField.text?.characters.count {
// text was cleared
phoneFormatter?.clear()
textField.text = ""
}
}
return false
}
The main thing that changed was it allows for the user to press the "Clear" button or Select All -> Clear.
There are some edge cases such as the user editing specific digits in the phone number which this doesn't handle but could be easily added.

- 4,004
- 4
- 35
- 48
Here is a solution using libPhoneNumber that also handles the non trivial cases of editing in the middle of the number, cutting and pasting, selection and typing. It keeps the cursor stable and does not behave unexpectedly.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if(range.location == textField.text.length && range.length == 0)
{
// Something added at end
textField.text = [numberFormatter inputDigit:string];
}
else if(range.location == textField.text.length-1 && range.length == 1)
{
// Backspace at end
textField.text = [numberFormatter removeLastDigit];
} else {
// Other modification in middle
NSString* input = textField.text;
// New cursor position after modification
NSUInteger cursorIdx = range.location + string.length;
// If backspacing to delete a format character - just reposition the cursor.
BOOL backspaceOnly = range.length == 1 && string.length == 0 && !isdigit([input characterAtIndex:range.location]);
if(!backspaceOnly) {
// make the modification, reformat the number
input = [input stringByReplacingCharactersInRange:range withString:string];
[numberFormatter clear];
BOOL rememberCursorPos = NO;
NSString* text;
// reinput the number to the formatter
// remembering the first digit position at or after the cursor
for (int i = 0; i < input.length; ++i)
{
if(i == cursorIdx) {
rememberCursorPos = YES;
}
char digit = [input characterAtIndex:i];
switch(digit) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
if(!rememberCursorPos) {
text = [numberFormatter inputDigit:[NSString stringWithFormat:@"%c", digit]];
} else {
text = [numberFormatter inputDigitAndRememberPosition:[NSString stringWithFormat:@"%c", digit]];
rememberCursorPos = NO;
}
break;
}
}
// reformat the number
textField.text = text;
// get updated cursor position (formatter position starts at 1)
cursorIdx = numberFormatter.getRememberedPosition - 1;
}
// reposition the cursor
UITextPosition* position = [textField positionFromPosition:textField.beginningOfDocument offset:cursorIdx];
textField.selectedTextRange = [textField textRangeFromPosition:position toPosition:position];
}
return NO;
}

- 3,074
- 2
- 26
- 39
You can use this library for formatting input during typing https://github.com/luximetr/AnyFormatKit
Example
let textInputController = TextInputController()
let textInput = TextInputField() // or TextInputView or any TextInput
textInputController.textInput = textInput // setting textInput
let formatter = TextInputFormatter(textPattern: "### (###) ###-##-##", prefix: "+12")
textInputController.formatter = formatter // setting formatter
In this case TextInputController will format text in your textField or textView.

- 71
- 2
- 2