Как 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")
, чтобы убедиться, что он не отличается. Если вы не возражаете, что это немного более личное для ваших пользователей, тогда не беспокойтесь, указав локаль.
Создание «NSLocale» из кода валюты (например, GBP), кстати, не вернет действительный язык. См. 'NSLocale.availableLocaleIdentifiers()' для поддерживаемых идентификаторов – liamnichols
Я перехожу в 'en_GB' или любой идентификатор локали, который мне нужен. это просто плохо названо, когда я действительно прошел через GBP в какой-то момент (что вызвало у меня некоторые странные проблемы). Спасибо за указание на это, я исправлю это –