我正在格式化我的文本文件,一旦用户开始将电话号码输入到这个格式类型0 (555) 444 66 77,它工作正常,但一旦我从服务器上获得号码,我就会得到这个05554446677,所以请告诉我,一旦我从服务器上获得号码,我如何以同样的格式编辑它?

我的代码一旦开始输入:

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
    }
}

推荐答案

使用字符串中的字符进行操作不是很简单.你需要以下几点:

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))
)

代码将被打印出来

Swift相关问答推荐

SwiftUI加载器未覆盖UIKit导航设置中的导航栏

通过withstickedContinuation传递通用类型T

防止NavigationLink自行返回导航视图

带有文本输入自动大小写修饰符的SwiftUI Textfield问题

如何在AudioKit中实现自定义音效 node ?

按下一步后无法让文本字段切换焦点

为什么要在SWIFT RandomAccessCollection协议中重新定义元素类型?

UICollectionViewCompostionalLayout Collectionview单元格宽度在重新加载数据后未正确调整大小

SWIFT`String.Encoding`:`.unicode`vs`.utf16`

如何将函数参数(字符串文字)标记为可本地化?

Swift图表';chartXVisibleDomain挂起或崩溃

如何根据 DatePicker 中选定的日期实现 TabView 页面切换?

如何在不将变量转换为字符串的情况下判断变量在 Swift 中是否为 Optional(nil)?

Swift - 给定一个像 30 的 Int 如何将范围数乘以 7?

如何在 SwiftUI 中将图像传递到 2 个视图

swiftui更改显示的 Select 器值

`@available` 属性在 macOS 版本上被错误地限制

为什么 Swift Tuples 只能在元素个数小于等于 6 的情况下进行比较?

调整文本的字体大小以适应 UIButton

Alamofire:如何全局处理错误