IPhone: как получить символ местной валюты (т.е. "$" не использовать "AU $" )
Вот код того, как я теперь получаю символ валюты:
NSLocale *lcl = [[[NSLocale alloc] initWithLocaleIdentifier:@"au_AU"] autorelease];
NSNumberFormatter *fmtr = [[[NSNumberFormatter alloc] init] autorelease];
[fmtr setNumberStyle:NSNumberFormatterCurrencyStyle];
[fmtr setLocale:lcl];
NSLog( @"%@", [lcl displayNameForKey:NSLocaleCurrencySymbol value:@"AUD"] );
NSLog( @"%@", [fmtr currencySymbol] );
Оба NSLogs возвращают "AU $". Как я понял из документации Apple по разработке, для каждой валюты есть по крайней мере два символа валюты (эти символы могут быть одинаковыми, хотя) - локальные (например, используются в стране. $Для Австралии) и международные (AU $для Австралии). Итак, вопрос в том, как получить ЛОКАЛЬНЫЙ символ валюты. Любые идеи?
Спасибо заранее.
Ответы
Ответ 1
Ваш код должен работать, однако неверный идентификатор локали. Он должен быть "en_AU".
См. "Использование локального объекта" в "Руководстве по интернационализации и локализации" (https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/InternationalizingLocaleData/InternationalizingLocaleData.html#//apple_ref/doc/uid/10000171i-CH13-SW4)
Ответ 2
NSNumberFormatter *currencyFormatter = [[[NSNumberFormatter alloc] init] autorelease];
[currencyFormatter setLocale:[NSLocale currentLocale]];
[currencyFormatter setMaximumFractionDigits:2];
[currencyFormatter setMinimumFractionDigits:2];
[currencyFormatter setAlwaysShowsDecimalSeparator:YES];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
NSNumber *someAmount = [NSNumber numberWithFloat:5.00];
NSString *string = [currencyFormatter stringFromNumber:someAmount];
Вы получите $5,00 за США, ¥ 5,00 для Японии, 5,00 евро за Европу и т.д.
Ответ 3
Этот фрагмент возвращает символ валюты ¥ для локали "ja_JP" (может быть любой другой локаль).
NSLocale* japanese_japan = [[[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"] autorelease];
NSNumberFormatter* fmtr = [[[NSNumberFormatter alloc] init] autorelease];
[fmtr setNumberStyle:NSNumberFormatterCurrencyStyle];
[fmtr setLocale:japanese_japan];
// Local currency symbol (what you're asking for)
NSString* currencySymbol = [fmtr currencySymbol];
NSLog( @"%@", currencySymbol ); // Prints '¥'
// International currency symbol
NSString* internationalCurrencySymbol = [fmtr internationalCurrencySymbol];
NSLog( @"%@", internationalCurrencySymbol ); // Prints 'JPY'
Несчастливо, что для au_AU вы получаете AU $в качестве символа местной валюты вместо $, но это должно быть так, как это должно отображаться в iOS. Однако обратите внимание, что международный символ, напечатанный для au_AU, не AU $, а AUD.
Ответ 4
Он не идеален тем, что он не выходит из системы, но, очевидно, вы можете создать свою собственную внутреннюю таблицу, используя список текущих символов валюты *. Поскольку в этом списке есть символы юникода, для него просто нужно сопоставить список локалей Apple со списком.
Знаете, на всякий случай предоставленные Apple не доступны.
* Примечание: ссылка не предназначена для авторизации, см. комментарии.
Ответ 5
Вы можете, если вам нужно, создать файл .strings
, который содержит валюту, и использовать функцию NSLocalizedString
для создания локализованной валюты. Что-то вроде этого:
en.lproj
myApp.strings:
"currencySymbol"="$"
"currencyFormat"="$%lf"
au_AU.lproj
myApp.strings:
"currencySymbol"="$"
"currencyFormat"="$%lf"
ja_JP.lproj
myApp.strings:
"currencySymbol"="¥"
"currencyFormat"="¥%lf"
И используйте это вот так:
NSString *money = [NSString stringWithFormat:@"%@%lf", NSLocalizedString:(@"currencySymbol"), myMoney];
Однако это означает, что для каждой поддерживаемой локализации вам нужен файл .strings
. Кроме того, это означает, что для некоторых локализаций символа валюты будет недостаточно для отображения надлежащего денежного формата, вам нужно будет использовать что-то вроде этого:
NSString *money = [NSString stringWithFormat:NSLocalizedString(@"CurrencyFormat"), myMoney];
У этого есть некоторые ограничения, но это может сработать для вас.
Ответ 6
Не могли бы вы получить текущую строку и удалить ее из всех символов a-Z?
Если результирующая строка имеет длину > 0, вы получите свой символ. В противном случае используйте оригинальную строку.
Он липкий, и я не уверен, что это будет работать для всех валют по всему миру, но это может сработать?