2015-12-07 5 views
1

У меня есть форматирование валюты для евро в моем приложении. Когда пользователь изначально устанавливает его в евро из любой другой валюты, форматтер отображает его как €1000. Когда приложение перезапускается, оно меняет его на 1000 €, а иногда даже заканчивается €1000 €! Любая идея, что здесь происходит?Форвард валюты евро в iOS перемещает символ до/после номера

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

Создание «NSLocale» из кода валюты (например, GBP), кстати, не вернет действительный язык. См. 'NSLocale.availableLocaleIdentifiers()' для поддерживаемых идентификаторов – liamnichols

+0

Я перехожу в 'en_GB' или любой идентификатор локали, который мне нужен. это просто плохо названо, когда я действительно прошел через GBP в какой-то момент (что вызвало у меня некоторые странные проблемы). Спасибо за указание на это, я исправлю это –

ответ

7

Как 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"), чтобы убедиться, что он не отличается. Если вы не возражаете, что это немного более личное для ваших пользователей, тогда не беспокойтесь, указав локаль.

+0

. Я на самом деле только что изменил свое отношение к этому :) Проблемы, с которыми я столкнулся, состояли в том, что вручную добавили символ валюты в одном случае. Это также вызвало проблему, с которой я столкнулся, и именно поэтому я отошел от кода валюты в первую очередь! –

+0

Да, я вернусь к использованию языкового стандарта .. используя валютный код, он форматирует его как '1000 долларов США'. Я просто хочу $ –

+0

Не стоит хранить значения валюты как «Двойной», если вам нужна точность. – the4kman

0
+0

Это привело к другим проблемам для меня при переключении между валютами - в некоторых случаях это закончилось как £ S $ ... Однако я исправил свои проблемы. Оказалось, что в одном случае символ был добавлен вручную неправильно, а не с использованием форматирования. –

1

Ваша проблема в том, что разные страны отображают Евро по-другому. Формат «Евро» отсутствует. Существует формат немецкой валюты, формат валюты в валюте Франции и итальянский формат валюты и т. Д., И все они отображают Евро по-разному.

Смежные вопросы