The idea is to use some kind of custom proxy for formatting the text on the fly:
struct ContentView: View {
@State var someNumber = 123
var body: some View {
let formattedNumber = Binding<String>(
get: {
switch self.someNumber {
case ..<0: return "???"
case ..<10: return "0.0\(self.someNumber)"
case ..<100: return "0.\(self.someNumber)"
case 100...: return String(format: "%02f", Double(self.someNumber)/100)
default: return "???"
}
},
set: {
if let value = NumberFormatter().number(from: $0) {
self.someNumber = value.intValue
}
}
)
return TextField("Number", text: formattedNumber)
}
}
Warning: This answer contains some UX issues when user is typing, but it answers the original question
Recommendation: For this type of textfields, I recommend to use custom responder that responds to keyboard and text events instead of default TextField