Same here. Also tried "Barbados Dollars" (BBD), same result as with Euros. Only if I empty the whole field, including the currency sign, data entry is possible (and gets formatted correctly with the right currency).
USD works fine.
Any further insights on this?
Post
Replies
Boosts
Views
Activity
I understand that you want to change the currency symbol, but also want to change the TextField to show the new currency in the proper format.
I had the same problem. While working on it I realized that currency symbol and number formatting are actually different things, and not necessarily connected. If an American speaks about ten thousand dollars, he will write "$10,000.00". If a German speaks about a thousand Euros, he will write "10.000,00 €". And if he speaks about a thousand dollars, in his own country, he will probably write "10.000,00 $". A Frenchman will write a thousand Euros as "10 000,00 €". A Dutchman will write "€ 10.000,00". Etc.
So, to properly format a currency you need to know both the valuta and the region where the expression is used.
This information is in SwiftUI captured in NumberFormatter.locale, which contains both a language code and a country code. Examples in String form: "en-US", "en-GB", etc. The following code takes care of that.
A trick is used to update the TextField whenever another locale is chosen in the Picker. See the function setLocale(:). This is because the TextField does not monitor the .locale property of the NumberFormatter class object, and I know of no way to make it do so. Therefore amount, which is monitored, is changed and then changed back. An ugly hack, but I think safe and it works (at least until the compiler optimizes it away... and there are ways around that I suppose.)
Anyway, I would like to learn of a more Swifty way.
I hope this is what you are looking for!
import SwiftUI
struct ContentView: View {
private var numberFormatter: NumberFormatter
init(numberFormatter: NumberFormatter = NumberFormatter()) {
self.numberFormatter = numberFormatter
self.numberFormatter.usesGroupingSeparator = true
self.numberFormatter.numberStyle = .currency
self.numberFormatter.locale = Locale(identifier: "nl-NL")
}
@State private var amount = 1234567.89
let locales = ["nl-NL", "de-DE", "fr-FR", "en-US", "en-GB", "th-TH", "az-AZ"]
@State private var locale = "nl-NL"
@State private var newLocale = "nl-NL"
func setLocale(to locale: String) {
numberFormatter.locale = Locale(identifier: locale)
amount += 1
amount -= 1
}
var body: some View {
NavigationView {
Form {
Text("Current locale: \(locale)")
TextField("Amount", value: $amount, formatter: numberFormatter)
Picker("Choose your new locale:", selection: $newLocale) {
ForEach(locales, id: \.self) { locale in
Text(locale)
}
}
.onChange(of: newLocale) { newValue in
setLocale(to: newLocale)
locale = newLocale
}
}
}
}
}
Disclaimer: Only tested on the XCode simulator.
Do you mean the settings I mentioned? Or are there others I should look into?