Search code examples
iosstringswiftuitextfieldstring-formatting

Formatting Phone number in Swift


I'm formatting my textfiled text once the user start typing the phone number into this format type 0 (555) 444 66 77 and it is working fine but once I get the number from the server I get it like this 05554446677 So please could you tell me how I can edit it in the same format once I get it fro the server?

My code once I start typing:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    if textField == phoneNumberTextField{
        var newString = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string)
        var components = newString.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet)

        var decimalString = "".join(components) as NSString
        var length = decimalString.length
        var hasLeadingOne = length > 0 && decimalString.characterAtIndex(0) == (1 as unichar)

        if length == 0 || (length > 11 && !hasLeadingOne) || length > 12{
            var newLength = (textField.text as NSString).length + (string as NSString).length - range.length as Int

            return (newLength > 11) ? false : true
        }
        var index = 0 as Int
        var formattedString = NSMutableString()

        if hasLeadingOne{
            formattedString.appendString("1 ")
            index += 1
        }

        if (length - index) > 1{
            var zeroNumber = decimalString.substringWithRange(NSMakeRange(index, 1))
            formattedString.appendFormat("%@ ", zeroNumber)
            index += 1
        }
        if (length - index) > 3{
            var areaCode = decimalString.substringWithRange(NSMakeRange(index, 3))
            formattedString.appendFormat("(%@) ", areaCode)
            index += 3
        }
        if (length - index) > 3{
            var prefix = decimalString.substringWithRange(NSMakeRange(index, 3))
            formattedString.appendFormat("%@ ", prefix)
            index += 3
        }
        if (length - index) > 3{
            var prefix = decimalString.substringWithRange(NSMakeRange(index, 2))
            formattedString.appendFormat("%@ ", prefix)
            index += 2
        }

        var remainder = decimalString.substringFromIndex(index)
        formattedString.appendString(remainder)
        textField.text = formattedString as String
        return false
    }else{
        return true
    }
}

Solution

  • Manipulations with characters in String are not very straightforward. You need following:

    Swift 2.1

    let s = "05554446677"
    let s2 = String(format: "%@ (%@) %@ %@ %@", s.substringToIndex(s.startIndex.advancedBy(1)),
        s.substringWithRange(s.startIndex.advancedBy(1) ... s.startIndex.advancedBy(3)),
        s.substringWithRange(s.startIndex.advancedBy(4) ... s.startIndex.advancedBy(6)),
        s.substringWithRange(s.startIndex.advancedBy(7) ... s.startIndex.advancedBy(8)),
        s.substringWithRange(s.startIndex.advancedBy(9) ... s.startIndex.advancedBy(10))
    )
    

    Swift 2.0

    let s = "05554446677"
    let s2 = String(format: "%@ (%@) %@ %@ %@", s.substringToIndex(advance(s.startIndex, 1)),
        s.substringWithRange(advance(s.startIndex, 1) ... advance(s.startIndex, 3)),
        s.substringWithRange(advance(s.startIndex, 4) ... advance(s.startIndex, 6)),
        s.substringWithRange(advance(s.startIndex, 7) ... advance(s.startIndex, 8)),
        s.substringWithRange(advance(s.startIndex, 9) ... advance(s.startIndex, 10))
    )
    

    Code will print 0 (555) 444 66 77