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条回答
Explosion°爆炸
2楼-- · 2019-01-03 08:33

The code bellow is what I typically use. The format is different but you get the picture. This will handle input such as '123df#$@$gdfg45-+678dfg901' and output '1 (234) 567-8901'

#import "NSString+phoneNumber.h"

@implementation NSString (phoneNumber)

-(NSString*) phoneNumber{
    static NSCharacterSet* set = nil;
    if (set == nil){
        set = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
    }
    NSString* phoneString = [[self componentsSeparatedByCharactersInSet:set] componentsJoinedByString:@""];
    switch (phoneString.length) {
        case 7: return [NSString stringWithFormat:@"%@-%@", [phoneString substringToIndex:3], [phoneString substringFromIndex:3]];
        case 10: return [NSString stringWithFormat:@"(%@) %@-%@", [phoneString substringToIndex:3], [phoneString substringWithRange:NSMakeRange(3, 3)],[phoneString substringFromIndex:6]];
        case 11: return [NSString stringWithFormat:@"%@ (%@) %@-%@", [phoneString substringToIndex:1], [phoneString substringWithRange:NSMakeRange(1, 3)], [phoneString substringWithRange:NSMakeRange(4, 3)], [phoneString substringFromIndex:7]];
        case 12: return [NSString stringWithFormat:@"+%@ (%@) %@-%@", [phoneString substringToIndex:2], [phoneString substringWithRange:NSMakeRange(2, 3)], [phoneString substringWithRange:NSMakeRange(5, 3)], [phoneString substringFromIndex:8]];
        default: return nil;
    }
}

@end
查看更多
Animai°情兽
3楼-- · 2019-01-03 08:33

This will help you

Format (xxx) xxx-xxxx For SWIFT 3.0

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        let length = Int(getLength(mobileNumber: textField.text!))

        if length == 15 {
            if range.length == 0 {
                return false
            }
        }

        if length == 3 {

            let num = self.formatNumber(mobileNumber: textField.text!)

            textField.text = NSString(format:"(%@)",num) as String

            if range.length > 0{
                let index: String.Index = num.index(num.startIndex, offsetBy: 3)
                textField.text = NSString(format:"%@",num.substring(to: index)) as String
            }

        }else if length == 6 {
            let num = self.formatNumber(mobileNumber: textField.text!)
            let index: String.Index = num.index(num.startIndex, offsetBy: 3)

            textField.text = NSString(format:"(%@) %@-",num.substring(to: index), num.substring(from: index)) as String
            if range.length > 0{
                textField.text = NSString(format:"(%@) %@",num.substring(to: index), num.substring(from: index)) as String
            }
        }

        return true
    }

    func formatNumber(mobileNumber: String) -> String {
        var number = mobileNumber
        number = number.replacingOccurrences(of: "(", with: "")
        number = number.replacingOccurrences(of: ")", with: "")
        number = number.replacingOccurrences(of: " ", with: "")
        number = number.replacingOccurrences(of: "-", with: "")
        number = number.replacingOccurrences(of: "+", with: "")

        let length = Int(number.characters.count)

        if length > 15 {
            let index = number.index(number.startIndex, offsetBy: 15)

           number = number.substring(to: index)
        }

        return number
    }

    func getLength(mobileNumber: String) -> Int {

        var number = mobileNumber
        number = number.replacingOccurrences(of: "(", with: "")
        number = number.replacingOccurrences(of: ")", with: "")
        number = number.replacingOccurrences(of: " ", with: "")
        number = number.replacingOccurrences(of: "-", with: "")
        number = number.replacingOccurrences(of: "+", with: "")

        let length = Int(number.characters.count)
        return length

    }
查看更多
老娘就宠你
4楼-- · 2019-01-03 08:36

For those of you who require international number formatting: https://code.google.com/p/libphonenumber/

Comes with C++, Java and JavaScript implementations. Should be easy to wrap the C++ implementations in a .mm file and write a small Objective-C wrapper around it.

查看更多
祖国的老花朵
5楼-- · 2019-01-03 08:37

SWIFT

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {        
            let length = self.getTextLength(textField.text)



            if length == 10{
                if range.length == 0{
                    return false
                }
            }

            if length == 3{

                var num : String = self.formatNumber(textField.text)

                textField.text = num + "-"
                if(range.length > 0){
                    textField.text = (num as NSString).substringToIndex(3)
                }
            }
            else if length == 6{

                var num : String = self.formatNumber(textField.text)

                let prefix  = (num as NSString).substringToIndex(3)
                let postfix = (num as NSString).substringFromIndex(3)

                textField.text = prefix + "-" + postfix + "-"

                if range.length > 0{
                    textField.text = prefix + postfix
                }
            }

            return true
    }




func getTextLength(mobileNo: String) -> NSInteger{

        var str : NSString = mobileNo as NSString
        str = str.stringByReplacingOccurrencesOfString("(", withString: "")
        str = str.stringByReplacingOccurrencesOfString(")", withString: "")
        str = str.stringByReplacingOccurrencesOfString(" ", withString: "")
        str = str.stringByReplacingOccurrencesOfString("-", withString: "")
        str = str.stringByReplacingOccurrencesOfString("+", withString: "")

        return str.length
    }

    func formatNumber(mobileNo: String) -> String{
        var str : NSString = mobileNo as NSString
        str = str.stringByReplacingOccurrencesOfString("(", withString: "")
        str = str.stringByReplacingOccurrencesOfString(")", withString: "")
        str = str.stringByReplacingOccurrencesOfString(" ", withString: "")
        str = str.stringByReplacingOccurrencesOfString("-", withString: "")
        str = str.stringByReplacingOccurrencesOfString("+", withString: "")

        if str.length > 10{
            str = str.substringFromIndex(str.length - 10)
        }

        return str as String
    }
查看更多
手持菜刀,她持情操
6楼-- · 2019-01-03 08:37
+(NSString *) phoneNumberFormatterTextField:(NSString *)number forRange:(NSRange)range
{
    int length = (int)[[self getPhoneNumber:number] length];
    if(length == 3)
    {
        NSString *num = [MPosBaseScreenController getPhoneNumber:number];
        number = [num stringByReplacingOccurrencesOfString:@"(\\d{3})"
                                              withString:@"($1) "
                                                 options:NSRegularExpressionSearch
                                                   range:NSMakeRange(0, num.length)];

    }
    else if(length == 6 || length > 6 )
    {
        NSString *num = [MPosBaseScreenController getPhoneNumber:number];
        number = [num stringByReplacingOccurrencesOfString:@"(\\d{3})(\\d{3})"
                                              withString:@"($1) $2 - "
                                                 options:NSRegularExpressionSearch
                                                   range:NSMakeRange(0, num.length)];
    }
       return number;
}
查看更多
爷的心禁止访问
7楼-- · 2019-01-03 08:39

A valid option is https://github.com/iziz/libPhoneNumber-iOS All the other answer cover only a small part of the possibilities and combinations, this library actually parse and validate EVERY phone number, and identify:

  • Nationality
  • phone number type
  • National carrier
查看更多
登录 后发表回答