动态字符串格式化

时间:2016-01-24 14:23:36

标签: swift uitextfield

我正在使用不同的说明符实现一个在文本输入过程中格式化字符串的功能,例如:

let formatString = "#### #### #### #### ###" // For card number format

let formatString = "##/##" // For expiry month and year (mm/yy)`

如果用户开始输入卡片详细信息,例如 self.cardNumberTextField = "44624523这应格式化为 4462 4523使用指定的格式集。卡过期日期也应如此。

任何人都可以帮助解决如何在Swift中实现这一点吗?理想情况下,这种格式化应该在TextField中键入时发生。

1 个答案:

答案 0 :(得分:0)

在你的操场上玩这个...尝试不同的输入,更少的数字,一些角色等...

let format = "###/# ## XXX ## #### #(#)#"
struct E:ErrorType { var txt = ""}

func formated(str: String, formater: String) throws->String {
    var s = str.characters.generate()
    var res = ""
    let f = formater.characters
    try f.forEach { (c) -> () in
        if c == Character("#") {
            if let q = s.next() {
                if let _ = Int(String(q)) {
                    res.append(q)
                } else {
                    throw E(txt: "input must be a number!!!")
                }
            } else {
                res.append(Character("#"))            }
        } else {
            res.append(c)
        }
    }
    return res
}

do {
    print(try formated("", formater: format))
    print(try formated("1234", formater: format))
    print(try formated("123412345678547", formater: format))
    print(try formated("123a12345678547", formater: format))
} catch let e {
    print((e as? E)?.txt ?? "unknown error")
}

/*
###/# ## XXX ## #### #(#)#
123/4 ## XXX ## #### #(#)#
123/4 12 XXX 34 5678 5(4)7
input must be a number!!!
*/