我的应用中有欧元货币格式化程序。当用户最初使用任何其他货币将其设置为欧元时,格式化程序将其显示为€1000
。当应用重新启动时,它会将其更改为1000 €
,有时甚至会以€1000 €
结束!知道这里发生了什么吗?
func formatAsCurrency(currencyCode: String) -> String? {
let currencyFormatter = NSNumberFormatter()
let isWholeNumber: Bool = floor(self) == self
currencyFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
currencyFormatter.maximumFractionDigits = isWholeNumber ? 0 : 2
currencyFormatter.minimumFractionDigits = isWholeNumber ? 0 : 2
currencyFormatter.locale = NSLocale(localeIdentifier: currencyCode)
if let currencyString = currencyFormatter.stringFromNumber(self) {
return currencyString
}
return nil
}
答案 0 :(得分:8)
正如lgor所说,你想使用currencyCode
而不是locale
......这是否可以替代?
extension Double {
/// Formats the receiver as a currency string using the specified three digit currencyCode. Currency codes are based on the ISO 4217 standard.
func formatAsCurrency(currencyCode: String) -> String? {
let currencyFormatter = NSNumberFormatter()
currencyFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
currencyFormatter.currencyCode = currencyCode
currencyFormatter.maximumFractionDigits = floor(self) == self ? 0 : 2
return currencyFormatter.stringFromNumber(self)
}
}
300.00.formatAsCurrency("GBP") // "£300"
129.92.formatAsCurrency("EUR") // "€129.92"
(-532.23).formatAsCurrency("USD") // "-$532.23"
还值得指出为什么在修改locale
时看到奇怪的格式化行为。通过更改locale
,格式化程序将根据该本地化应用不同的格式规则。
通常,您希望将语言环境设置为其默认值(NSLocale.currentLocale()
),这样字符串的格式将本地化为用户语言。这通常用于differences in decimal and thousand separators
如果您特别希望以特定方式格式化数字,那么您应该覆盖语言环境以确保事物保持一致。如果您担心使用什么分隔符,使用什么货币符号或在符号中放置符号,请确保将区域设置设置为特定的或确保覆盖NSNumberFormatter
上的所有相关属性。
例如,如果我知道我希望我的数字格式化为美国英语语言环境,那么我会使用NSLocale(localeIdentifier: "en_US_POSIX")
来确保它没有区别。如果您不介意它对您的用户来说更加个性化,那么请不要指定区域设置。
答案 1 :(得分:1)
您的问题是不同国家以不同的方式展示欧元。 “欧元”没有格式。有德国货币格式,法国货币格式和意大利货币格式等等,它们都以不同方式显示欧元。
答案 2 :(得分:0)
对currencyFormatter使用currencyCode / internationalCurrencySymbol属性