haltlos
(Alex)
1
Unfortunately, .currency and .currencyISOCode return "XXX" instead of an actual currency symbol or code (see NumberFormatter.Style in the Apple Developer documentation). Do you have an idea, why this occurs? Note that I changed the formatter locale from "en" (which is returned by Locale.current) to "de", but that still returns "XXX".
import SwiftUI
import Foundation
struct ExpenseRow: View {
var body: some View {
Text(amountAsCurrency())
}
fileprivate func amountAsCurrency() -> String {
let str = "\(format: 35.6689, using: .currency)"
print(str)
return str
}
}
// https://www.hackingwithswift.com/articles/178/super-powered-string-interpolation-in-swift-5-0
extension String.StringInterpolation {
mutating func appendInterpolation(format value: Float, using style: NumberFormatter.Style) {
let formatter = NumberFormatter()
//print("formatter.locale = \(formatter.locale!)")
//print("Locale.current = \(Locale.current)")
formatter.locale = Locale(identifier: "de")
formatter.numberStyle = style
if let result = formatter.string(from: value as NSNumber) {
appendLiteral(result)
}
}
}
Martin
(Martin R)
2
Is this really SwiftUI related, or “just” a problem with NumberFormatter?
What happens if you specify the locale as "de_DE", i.e. with language and region?
1 Like
haltlos
(Alex)
3
I've edited the following as you suggested and that lets the currency style show the currency symbol. Thanks @Martin
formatter.locale = Locale(identifier: "de_DE")
When I remove that line entirely, thinking that this should return something like $173.04, because formatter.locale defaults to "en", I get this (with actual mock data):


Is there an Xcode setting for the locale? The macOS region and language on the iMac I'm on is actually Germany/German.
Martin
(Martin R)
4
It seems that this a problem about NumberFormatter (which is part of the Foundation framework) and not a problem about the Swift language. The Apple Developer Forum: Cocoa may be a better place to get help.
haltlos
(Alex)
5
I just learned that the GPS position of the Simulator for Xcode is "US" by default and that is why
print("formatter.locale = \(formatter.locale!)")
print("Locale.current = \(Locale.current)")
return "en (current)".
On an actual iOS device, that should be "en_DE (current)"