简体   繁体   中英

Can I use iOS9 Contacts Framework to get a formatted phone number?

I would like to be able to store a phone number in a standard way, eg just the digits (potentially with the '+' for the country code), something like these examples...

"17185555555"
"+17185555555"
"+447788888888"

... but I'd like to be able to DISPLAY it to a user in a properly formatted way, eg

"1 (718) 555-5555"
"+1 (718) 555-5555"
"+44 (7788) 888888"

...WITHOUT having to rely on a CNContactViewController to format it.

Obviously doing this just for US/Canada numbers would be easy - it's just one standard format - but I'd like it to be generic so it can work for numbers from any country. I know this question gives an answer for US/Can numbers only.

I know that I could use a CNContactViewController to display the number in the correct format, eg

let newContact = CNMutableContact()
newContact.givenName = "John"
newContact.familyName = "Smith"
newContact.phoneNumbers = [CNLabeledValue(label: CNLabelPhoneNumberiPhone, value: CNPhoneNumber(stringValue:"17185555555"))]
let contactView = CNContactViewController(forContact: newContact)
self.presentViewController(contactView, animated: true, completion: nil)

This will show the number on screen properly formatted, ie

1 (718) 555-5555

... so I know that something in the framework can do it. (This approach works for other country phone number formats, as long as you prefix the number with the right country code - eg "+44...")

From various other questions I know that I can get the raw digits and country code out of a CNContact, eg (following above example)

for pNumber: CNLabeledValue in newContact.phoneNumbers {
    let value  = pNumber.value as! CNPhoneNumber
    let cc = value.valueForKey("countryCode") as? String
    let digits = value.valueForKey("digits") as? String
    print("cc:" + cc + ", " + digits)
}

... but this will just show the unformatted string again - not what I am looking for in this case.

Any help or other recommended approaches really appreciated!

My answer proposes another lib

You can format your numbers with this lib .

And you can use like this:

let phoneNumber: NBPhoneNumber = try phoneUtil.parse("17185555555", defaultRegion: yourRegion)
let formattedString: String = try phoneUtil.format(phoneNumber, numberFormat: .E164)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM