Programowo znajdź walutę lokalną Dla iphone ' a

Chcę programowo dowiedzieć się, jaka jest waluta na iPhonie użytkownika. Oznacza to, że jeśli użytkownik jest w sklepie amerykańskim, waluta powinna być USD, dla Australii powinna to być AUD. Moim celem tego zadania jest próba przekonwertowania ceny przedmiotu podanej w naszej aplikacji, aby była prawie zgodna z ceną, którą pyta AppStore.

Na przykład, jeśli sprzedamy film 3 usd, a Australijczyk chce go kupić, to powinienem pokazać 2.8 AUD na ekranie aplikacji. Zmniejszy to obliczenie u użytkownika nad prawdziwa cena w jego kraju. Czy ktoś wie jak to zrobić?

Author: vodkhang, 2011-02-18

6 answers

W większości przypadków symbol waluty nie wystarczy. Na przykład w Niemczech piszemy nasze ceny tak: 1,99€ , ale ludzie w USA używają $1.99. Istnieją trzy różnice w ciągu. Symbol waluty, jej położenie i separator.

Jeśli chcesz zrobić to dobrze powinieneś użyć NSNumberFormatter. Zajmuje się wszystkimi różnicami między formatami walut. I robi to znacznie lepiej niż ty. Ponieważ robi to dla wszystkich walut, nie tylko dla 4 głównych waluty, które chcesz obsługiwać.

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

Jeśli chcesz użyć tego w zakupie aplikacji, nie możesz polegać na bieżących ustawieniach regionalnych użytkowników, ponieważ możliwe jest użycie konta w USA na urządzeniu z ustawieniami regionalnymi DE (niemiecki). A cena Twojego produktu (rzeczywista cena wynosi 0,79€ w Niemczech) pokazałaby się jako 0,99€ (ponieważ kosztuje $0.99 w USA). To byłoby złe. Otrzymujesz zlokalizowaną cenę już z app store, nie ma potrzeby samodzielnego wykonywania obliczeń.
I dostajesz Cena i priceLocale dla każdego z Twoich produktów skp.

Otrzymałbyś poprawny sformatowany ciąg waluty w następujący sposób:

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];

EDIT: skoro prosiłeś o Kod waluty.

Możesz go uzyskać za pomocą NSString *currencyCode = [formatter currencyCode]; to da Ci kod waluty zgodnie z ISO 4217. AUD, USD, EUR i tak dalej.

 126
Author: Matthias Bauch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-30 18:19:59

Użyłem tych kluczy do wyodrębnienia symboli/kodów walut z lokalizacji

NSLocale *theLocale = [NSLocale currentLocale];
NSString *symbol = [theLocale objectForKey:NSLocaleCurrencySymbol];
NSString *code = [theLocale objectForKey:NSLocaleCurrencyCode];
 45
Author: tsakoyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-18 05:29:37

Użyłem poniższego kodu w mojej aplikacji, aby pobrać lokalny znak waluty i znaleźć ograniczniki. Pomogę ci,

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
Dzięki.
 5
Author: Yuvaraj.M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-20 11:03:57
create macro first then use it
#define CURRENCY_SYMBOL [[NSLocale currentLocale] objectForKey:NSLocaleCurrencySymbol]

NSLog(@"%@ %.2f",CURRENCY_SYMBOL,25.50);
 4
Author: Hardik Darji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-06 10:26:25

Matthias Bauch odpowiedź w języku swift:

var formatter = NSNumberFormatter()
    formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
    formatter.locale = product!.priceLocale
var currencyString = "\(formatter.stringFromNumber(product!.price)!)"
 2
Author: ZiggyST,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-28 12:17:20

Dzięki za odpowiedź. W końcu zorientowałem się, że mogę pobrać cenę i Kod waluty bezpośrednio z 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
 1
Author: vodkhang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-21 23:41:42