Найти валюту для iphone программно - PullRequest
54 голосов
/ 18 февраля 2011

Я хочу узнать локаль валюты на iphone пользователя программно.Это означает, что если пользователь находится в магазине США, языковой стандарт должен быть долларом США, для Австралии - AUD.Моя цель этой задачи - попытаться преобразовать цену товара, указанную в нашем приложении, чтобы она почти соответствовала цене, которую запрашивает AppStore.

Например, если мы продаем видео за 3 доллара США, и австралиец хочет его купить, то я должен показать 2.8 AUD на экране моего приложения.Это уменьшит расчет у пользователя над реальной ценой в его стране.Кто-нибудь знает, как это сделать?

Ответы [ 6 ]

127 голосов
/ 18 февраля 2011

В большинстве случаев символа валюты будет недостаточно. Например, в Германии мы пишем наши цены следующим образом: 1,99 €, но люди в США используют 1,99 $. Есть три различия в строке. Символ валюты, ее положение и разделитель.

Если вы хотите сделать это правильно, вы должны использовать NSNumberFormatter. Он заботится обо всех различиях между форматами валюты. И это делает это намного лучше, чем вы. Потому что он делает это для всех валют, а не только для 4 основных валют, которые вы хотите поддерживать.

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[formatter setLocale:[NSLocale currentLocale]];
NSString *localizedMoneyString = [formatter stringFromNumber:myCurrencyNSNumberObject];

Если вы хотите использовать это для покупки приложения, вы не можете полагаться на текущий языковой стандарт пользователя, поскольку можно использовать учетную запись из США на устройстве с немецким языковым стандартом. А цена вашего товара (фактическая цена 0,79 € в Германии) будет отображаться как 0,99 € (потому что в США это стоит 0,99 $). Это было бы неправильно. Вы уже получаете локализованную цену в магазине приложений, нет необходимости делать расчеты самостоятельно.
И вы получаете цену и цену на каждый из ваших SKProducts.

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

SKProduct *product = [self.products objectAtIndex:indexPath.row];
NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
[formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[formatter setLocale:product.priceLocale];
currencyString = [formatter stringFromNumber:product.price];

РЕДАКТИРОВАТЬ: так как вы специально попросили код валюты.

Вы можете получить его с помощью NSString *currencyCode = [formatter currencyCode]; Это даст вам код валюты в соответствии с ISO 4217. AUD, USD, EUR и так далее.

46 голосов
/ 18 февраля 2011

Я использовал эти ключи для извлечения символов / кодов валют из локалей

NSLocale *theLocale = [NSLocale currentLocale];
NSString *symbol = [theLocale objectForKey:NSLocaleCurrencySymbol];
NSString *code = [theLocale objectForKey:NSLocaleCurrencyCode];
5 голосов
/ 06 февраля 2014
create macro first then use it
#define CURRENCY_SYMBOL [[NSLocale currentLocale] objectForKey:NSLocaleCurrencySymbol]

NSLog(@"%@ %.2f",CURRENCY_SYMBOL,25.50);
5 голосов
/ 20 декабря 2011

Я использовал приведенный ниже код в своем приложении, чтобы получить знак местной валюты и найти разделители.Я помогу тебе,

NSDecimalNumber *amount = [NSDecimalNumber decimalNumberWithString:@"50.00"];
NSNumberFormatter *currencyFormat = [[NSNumberFormatter alloc] init];
NSLocale *locale = [NSLocale currentLocale];
[currencyFormat setNumberStyle:NSNumberFormatterCurrencyStyle];
[currencyFormat setLocale:locale];
NSLog(@"Amount with symbol: %@", [currencyFormat stringFromNumber:amount]);//Eg: $50.00
NSLog(@"Current Locale : %@", [locale localeIdentifier]);//Eg: en_US

Спасибо.

3 голосов
/ 21 сентября 2015

ответ Матиаса Бауха в быстром:

var formatter = NSNumberFormatter()
    formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
    formatter.locale = product!.priceLocale
var currencyString = "\(formatter.stringFromNumber(product!.price)!)"
1 голос
/ 22 февраля 2011

спасибо за ваш ответ. Я наконец понял, что могу получить цену и код валюты непосредственно от Apple:

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {    
    NSArray *products = response.products;
    if (products && products.count != 0) {
        product = [products objectAtIndex:0];
        [[NSNotificationCenter defaultCenter] postNotificationName:PRICE_UPDATED object:product.LocalizedPrice];    
    } 

    // finally release the reqest we alloc/init’ed in requestProUpgradeProductData
    [productsRequest release];
}



@implementation SKProduct (LocalizedPrice)

- (NSString *)LocalizedPrice
{
    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
    [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
    [numberFormatter setLocale:self.priceLocale];
    NSString *formattedString = [numberFormatter stringFromNumber:self.price];
    [numberFormatter release];
    return formattedString;
}

@end
...