I had the same problem awhile back and eventually created my own solution. I'm sure there is a better one out there but this does the trick. Started with using the onChange method but quickly realized that it silos it over time and you need to change to currency on the fly without a text field. So, I created an extensionof String to format the text.
extension String {
func currency() -> String {
var string = self.replacingOccurrences(of: "$", with: "").replacingOccurrences(of: ",", with: "")
var coin = ""
if let range = string.range(of: ".") {
let coins = string[range.upperBound...]
coin = "."+coins
string.removeSubrange(range.upperBound...)
string = string.replacingOccurrences(of: ".", with: "")
if coin.count > 3 {
coin = String(coin.dropLast())
string.append(coin)
return string
}
}
if string.count > 0 {
switch string.count {
case 4:
string.insert(",", at: string.index(string.startIndex, offsetBy: 1))
case 5:
string.insert(",", at: string.index(string.startIndex, offsetBy: 2))
case 6:
string.insert(",", at: string.index(string.startIndex, offsetBy: 3))
case 7:
string.insert(",", at: string.index(string.startIndex, offsetBy: 1))
string.insert(",", at: string.index(string.startIndex, offsetBy: 5))
case 8:
string.insert(",", at: string.index(string.startIndex, offsetBy: 2))
string.insert(",", at: string.index(string.startIndex, offsetBy: 6))
case 9:
string.insert(",", at: string.index(string.startIndex, offsetBy: 3))
string.insert(",", at: string.index(string.startIndex, offsetBy: 7))
case 10:
string.insert(",", at: string.index(string.startIndex, offsetBy: 1))
string.insert(",", at: string.index(string.startIndex, offsetBy: 5))
string.insert(",", at: string.index(string.startIndex, offsetBy: 9))
case 11:
string.insert(",", at: string.index(string.startIndex, offsetBy: 2))
string.insert(",", at: string.index(string.startIndex, offsetBy: 6))
string.insert(",", at: string.index(string.startIndex, offsetBy: 10))
case 12:
string.insert(",", at: string.index(string.startIndex, offsetBy: 3))
string.insert(",", at: string.index(string.startIndex, offsetBy: 7))
string.insert(",", at: string.index(string.startIndex, offsetBy: 11))
case 13:
string.insert(",", at: string.index(string.startIndex, offsetBy: 1))
string.insert(",", at: string.index(string.startIndex, offsetBy: 5))
string.insert(",", at: string.index(string.startIndex, offsetBy: 9))
string.insert(",", at: string.index(string.startIndex, offsetBy: 13))
case 14:
string.insert(",", at: string.index(string.startIndex, offsetBy: 2))
string.insert(",", at: string.index(string.startIndex, offsetBy: 6))
string.insert(",", at: string.index(string.startIndex, offsetBy: 10))
string.insert(",", at: string.index(string.startIndex, offsetBy: 14))
case 15:
string.insert(",", at: string.index(string.startIndex, offsetBy: 3))
string.insert(",", at: string.index(string.startIndex, offsetBy: 7))
string.insert(",", at: string.index(string.startIndex, offsetBy: 11))
string.insert(",", at: string.index(string.startIndex, offsetBy: 15))
default:
break
}
string.insert("$", at: string.startIndex)
}
string.append(coin)
string = string.replacingOccurrences(of: " ", with: "")
return string
}
}