Phone number formatting on iOS

2019-01-03 07:53发布

I have a text field where the user enters data. It's a phone number field. If the user enters 1234567890, I want it displayed as (123)-(456)-7890 as the user types. How is this possible?

23条回答
小情绪 Triste *
2楼-- · 2019-01-03 08:26

Maybe you could use this simple method:

+ (NSString*) formatPhoneNumber:(NSString *)phoneNumber codeLength:(int) code segmentLength:(int) segment
{
    NSString* result = @"";

    int length = [phoneNumber length];

    NSString* firstSegment = @"";
    NSString* restSegment = @"";

    for (int i=0; i<length; i++) {

        char c = [phoneNumber characterAtIndex:i];

        if(i < code)
            firstSegment = [firstSegment stringByAppendingFormat:@"%c", c];
        else
        {
            restSegment = [restSegment stringByAppendingFormat:@"%c", c];

            int threshold = (i - code) + 1;

            if((threshold % segment == 0) && (threshold > 0) && !(threshold > length))
                restSegment = [restSegment stringByAppendingFormat:@"%c", '-'];
        }

    }

    result = [result stringByAppendingFormat:@"%@-%@", firstSegment, restSegment];

    return result;
}

Assuming above method is in Contact class, just use the method like this:

NSString* phoneNumber = @"085755023455";

NSString* formattedNumber = [Contact formatPhoneNumber:phoneNumber codeLength:3 segmentLength:4];

That would be resulting something like:

085-7550-2345-5
查看更多
聊天终结者
3楼-- · 2019-01-03 08:29

Also for format +x (xxx) xxx-xx-xx you can use something like this simple solution:

+ (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
NSArray *components = [newString componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]];
NSString *decimalString = [components componentsJoinedByString:@""];

if (decimalString.length > 11) {
    return NO;
}

NSMutableString *formattedString = [NSMutableString stringWithString:decimalString];

[formattedString insertString:@"+" atIndex:0];

if (formattedString.length > 2)
    [formattedString insertString:@" (" atIndex:2];

if (formattedString.length > 7)
    [formattedString insertString:@") " atIndex:7];

if (formattedString.length > 12)
    [formattedString insertString:@"-" atIndex:12];

if (formattedString.length > 15)
    [formattedString insertString:@"-" atIndex:15];


textField.text = formattedString;
return NO;}      
查看更多
爷的心禁止访问
4楼-- · 2019-01-03 08:30

Thanks so much for the first answer but, i think, that method -(int)getLength:(NSString*)mobileNumber is useless. You can try something like below:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

int length = [[self formatNumber:[textField text]] length];

if (length == 10) {
    if(range.length == 0) {
        return NO;
    }
}

if (length == 3) {
    NSString *num = [self formatNumber:[textField text]];
    textField.text = [NSString stringWithFormat:@"(%@) ",num];
    if (range.length > 0) {
        [textField setText:[NSString stringWithFormat:@"%@",[num substringToIndex:3]]];
    }
}
else if (length == 6) {
    NSString *num = [self formatNumber:[textField text]];
    [textField setText:[NSString stringWithFormat:@"(%@) %@-",[num  substringToIndex:3],[num substringFromIndex:3]]];
    if (range.length > 0) {
        [textField setText:[NSString stringWithFormat:@"(%@) %@",[num substringToIndex:3],[num substringFromIndex:3]]];
    }
}

return YES;
}

- (NSString*)formatNumber:(NSString*)mobileNumber {
mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@"(" withString:@""];
mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@")" withString:@""];
mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@" " withString:@""];
mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@"-" withString:@""];
mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@"+" withString:@""];

int length = [mobileNumber length];

if (length > 10) {
    mobileNumber = [mobileNumber substringFromIndex: length-10];
}

return mobileNumber;
}
查看更多
beautiful°
5楼-- · 2019-01-03 08:32

This felt more clear and handles removing any unwanted characters much more nicely. Formats correctly for 1 (###) ###‑#### or (###) ###‑####

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
    NSArray *components = [newString componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]];
    NSString *decimalString = [components componentsJoinedByString:@""];

    NSUInteger length = decimalString.length;
    BOOL hasLeadingOne = length > 0 && [decimalString characterAtIndex:0] == '1';

    if (length == 0 || (length > 10 && !hasLeadingOne) || (length > 11)) {
        textField.text = decimalString;
        return NO;
    }

    NSUInteger index = 0;
    NSMutableString *formattedString = [NSMutableString string];

    if (hasLeadingOne) {
        [formattedString appendString:@"1 "];
        index += 1;
    }

    if (length - index > 3) {
        NSString *areaCode = [decimalString substringWithRange:NSMakeRange(index, 3)];
        [formattedString appendFormat:@"(%@) ",areaCode];
        index += 3;
    }

    if (length - index > 3) {
        NSString *prefix = [decimalString substringWithRange:NSMakeRange(index, 3)];
        [formattedString appendFormat:@"%@-",prefix];
        index += 3;
    }

    NSString *remainder = [decimalString substringFromIndex:index];
    [formattedString appendString:remainder];

    textField.text = formattedString;

    return NO;
}
查看更多
Bombasti
6楼-- · 2019-01-03 08:32

We wrote a custom NSFormatter subclass for phone numbers here: https://github.com/edgecase/PhoneNumberFormatter

You can use it like any other NSFormatter subclass.

查看更多
Fickle 薄情
7楼-- · 2019-01-03 08:32

C# Xamarin.iOS version of most comprehensive answer on how to do phone formatting in iOS is below

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();
        PhoneNumberTextField.ShouldChangeCharacters = ChangeCharacters;
    }

    private bool ChangeCharacters(UITextField textField, NSRange range, string replacementString)
    {
        var text = textField.Text;
        var newString = text.Substring(0, range.Location) + replacementString + text.Substring(range.Location + range.Length);
        var decimalString = Regex.Replace(newString, @"[^\d]", string.Empty);
        var length = decimalString.Length;
        var hasLeadingOne = length > 0 && decimalString[0] == '1';
        if ((length == 0) || (length > 10 && !hasLeadingOne) || (length > 11))
        {
            textField.Text = decimalString;
            return false;
        }
        var index = 0;
        var formattedString = "";
        if (hasLeadingOne)
        {
            formattedString += "1";
            index += 1;
        }
        if (length - index > 3)
        {
            var areaCode = decimalString.Substring(index, 3);
            formattedString += "(" + areaCode + ")";
            index += 3;
        }
        if (length - index > 3)
        {
            var prefix = decimalString.Substring(index, 3);
            formattedString += " " + prefix + "-";
            index += 3;
        }
        var remainder = decimalString.Substring(index);
        formattedString += remainder;
        textField.Text = formattedString;
        return false;
    }
查看更多
登录 后发表回答