Идея состоит в том, чтобы использовать какой-то собственный прокси для форматирования текста на лету:
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)
}
}
Предупреждение : Этот ответ содержит некоторые проблемы с UX, когда пользователь вводя текст, но он отвечает на исходный вопрос
Рекомендация : для текстовых полей этого типа я рекомендую использовать пользовательский ответчик, который отвечает на события клавиатуры и текста вместо значений по умолчанию TextField