Найти валюту локали для iphone программно
Я хочу узнать языковой стандарт валюты на iphone пользователя программно. Это означает, что если пользователь находится в магазине США, локаль валюты должна быть USD, для Австралии она должна быть AUD. Моя цель этой задачи-попытаться преобразовать цену товара, указанную в нашем приложении, чтобы она почти соответствовала цене, которую запрашивает AppStore.
например, если мы продаем видео 3 usd, и австралиец хочет купить его, то я должен показать 2.8 AUD в моем экране приложения. Это позволит уменьшить расчет в пользователь над реальной ценой в своей стране. Кто-нибудь знает, как это сделать?
6 ответов:
В большинстве случаев символ валюты не хватит. Например, в Германии мы пишем наши цены так: 1,99€, но люди в США используют $1,99. Есть три различия в строке. Символ валюты, его положение и разделитель.
Если вы хотите сделать это правильно, вы должны использовать NSNumberFormatter. Он заботится обо всех различиях между форматами валют. И он делает это гораздо лучше, чем вы. Потому что он делает это для всех валют, а не только для 4 основных валюты, которые вы хотите поддержать.
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; [formatter setNumberStyle:NSNumberFormatterCurrencyStyle]; [formatter setLocale:[NSLocale currentLocale]]; NSString *localizedMoneyString = [formatter stringFromNumber:myCurrencyNSNumberObject];
Если вы хотите использовать это для покупки в приложении, вы не можете полагаться на текущую локаль пользователей, потому что можно использовать учетную запись в США на устройстве с De (немецкой) локалью. И цена вашего товара (фактическая цена составляет 0,79€ в Германии) будет отображаться как 0,99€ (потому что он стоит $0,99 в США). Это было бы неправильно. Вы получаете локализованную цену уже из магазина приложений, нет необходимости делать расчеты самостоятельно.
И вы получаете цену и priceLocale для каждого из ваших 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 и так далее.
я использовал эти ключи для извлечения символов/кодов валют из локалей
NSLocale *theLocale = [NSLocale currentLocale]; NSString *symbol = [theLocale objectForKey:NSLocaleCurrencySymbol]; NSString *code = [theLocale objectForKey:NSLocaleCurrencyCode];
я использовал ниже код в моем приложении, чтобы получить знак местной валюте и найти разделители. Я помогу тебе,
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: .00 NSLog(@"Current Locale : %@", [locale localeIdentifier]);//Eg: en_US
спасибо.
create macro first then use it #define CURRENCY_SYMBOL [[NSLocale currentLocale] objectForKey:NSLocaleCurrencySymbol] NSLog(@"%@ %.2f",CURRENCY_SYMBOL,25.50);
Matthias Bauch ответ в swift:
var formatter = NSNumberFormatter() formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle formatter.locale = product!.priceLocale var currencyString = "\(formatter.stringFromNumber(product!.price)!)"
спасибо за ваш ответ. Я, наконец, понял, что могу получить цену и код валюты непосредственно из 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