iPhone: как получить символ местной валюты (т.е. «$» вместо «AU $») - PullRequest
27 голосов
/ 13 декабря 2010

Вот код того, как я теперь получаю символ валюты:

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 $ для Австралии). Итак, вопрос в том, как получить ЛОКАЛЬНЫЙ символ валюты. Есть идеи?

Заранее спасибо.

Ответы [ 7 ]

20 голосов
/ 16 июня 2012
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 € для Европы и т. Д.

12 голосов
/ 15 декабря 2010

Этот фрагмент возвращает символ валюты ¥ для локали "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.

10 голосов
/ 25 ноября 2011

Ваш код должен работать, однако идентификатор локали неверен.Это должно быть «en_AU».

См. «Использование объекта локали» в «Руководстве по интернационализации и локализации» (https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/InternationalizingLocaleData/InternationalizingLocaleData.html#//apple_ref/doc/uid/10000171i-CH13-SW4)

9 голосов
/ 15 декабря 2010

Это не идеальный вариант, поскольку он не выходит из системы, но, очевидно, вы можете создать собственную внутреннюю таблицу, используя список текущих символов валюты *.Поскольку у этого списка есть символы Unicode для него, это было бы просто вопросом соответствия списка локалей Apple со списком.

Знаешь, на тот случай, если предоставленные Apple на самом деле не доступны.

* Примечание : ссылка не предназначена для авторизации, см. Комментарии.

1 голос
/ 22 апреля 2018

Версия Swift, код адаптирован из ответа Валентина (проверено на Swift 4.1 ):

func formattedCurrency(amount: Double, locale: Locale) -> String? {
    let formatter = NumberFormatter()
    formatter.locale = locale
    formatter.maximumFractionDigits = 2
    formatter.minimumFractionDigits = 2
    formatter.alwaysShowsDecimalSeparator = true
    formatter.numberStyle = .currency
    return formatter.string(from: NSNumber(value: amount))
}

Дает приличный результат, хотя и не меняет положение валютыСимвол правильно для всех языков, несмотря на то, что написано в оригинальном ответе.Но Apple хочет, чтобы это было так, пусть будет так.

Австралийский доллар отображается в виде исходного вопроса, как "$ 1,50".

1 голос
/ 17 декабря 2010

Вы можете, при необходимости, создать файл .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];

Это имеет некоторые ограничения, но это может сработать для вас.

0 голосов
/ 20 декабря 2010

Не могли бы вы получить текущую строку и удалить ее из всех символов aZ?Если полученная строка имеет длину> 0, значит, у вас есть символ.В противном случае используйте исходную строку.

Это безвкусно, и я не уверен, что это будет работать для всех валют мира, но это может работать?

...