I have a TextField that displays a @String. I would like to ensure that the user only types numbers into the TextField and that the result is then localized, with commas, decimals, etc. per the current Locale. For example, if the Local is ‘de_DE’ then the text would display 123.456 or for ‘en_US’ it would be 123,456 .
<code>import SwiftUI
import Combine
struct ContentView: View {
@State var sTest = "123456"
var formatter = NumberFormatter()
var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text("Hello, ContentView!")
TextField("Test", text: $sTest)
.onReceive(Just(sTest)) { newValue in
formatter.usesGroupingSeparator = true
formatter.numberStyle = .decimal
formatter.locale = Locale.current
let filtered = newValue.filter { "0123456789".contains($0) }
if filtered != newValue {
self.sTest = filtered
}
}
}
}
} //end of struct
</code>
<code>import SwiftUI
import Combine
struct ContentView: View {
@State var sTest = "123456"
var formatter = NumberFormatter()
var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text("Hello, ContentView!")
TextField("Test", text: $sTest)
.onReceive(Just(sTest)) { newValue in
formatter.usesGroupingSeparator = true
formatter.numberStyle = .decimal
formatter.locale = Locale.current
let filtered = newValue.filter { "0123456789".contains($0) }
if filtered != newValue {
self.sTest = filtered
}
}
}
}
} //end of struct
</code>
import SwiftUI
import Combine
struct ContentView: View {
@State var sTest = "123456"
var formatter = NumberFormatter()
var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text("Hello, ContentView!")
TextField("Test", text: $sTest)
.onReceive(Just(sTest)) { newValue in
formatter.usesGroupingSeparator = true
formatter.numberStyle = .decimal
formatter.locale = Locale.current
let filtered = newValue.filter { "0123456789".contains($0) }
if filtered != newValue {
self.sTest = filtered
}
}
}
}
} //end of struct
I’d like to replace:
<code>self.sTest = filtered
</code>
<code>self.sTest = filtered
</code>
self.sTest = filtered
with something like:
<code>self.sTest = formatter.string(from: NSNumber(floatLiteral: Double(filtered) ?? 0))!
</code>
<code>self.sTest = formatter.string(from: NSNumber(floatLiteral: Double(filtered) ?? 0))!
</code>
self.sTest = formatter.string(from: NSNumber(floatLiteral: Double(filtered) ?? 0))!
but this doesn’t work. How can I achieve this?