55 votes

Trouver la devise locale pour iphone par programmation

Je veux trouver la monnaie locale de l'utilisateur de l'iphone par programmation. Cela signifie que, si l'utilisateur est dans le Magasin des états-unis, la monnaie locale doit être d'USD, pour l'Australie, il devrait être AUD. Mon but de cette tâche est d'essayer de convertir le prix de l'article figurant sur notre application pour être près de match avec le prix que l'AppStore demander.

Par exemple, si nous vendons une vidéo de 3 usd, et un Australien veut l'acheter, alors je devrais montrer 2.8 AUD dans mon écran d'application. Il permettra de réduire le calcul de l'utilisateur sur le prix réel de son pays. Quelqu'un sait comment faire?

127voto

Matthias Bauch Points 52145

Dans la plupart des cas, le symbole de la devise ne sera pas assez. Par exemple, en Allemagne, nous écrivons nos prix de ce genre: 1,99€, mais les gens dans les etats-unis utilisent à 1,99$. Il y a trois différences dans la chaîne. Le symbole de la monnaie, la position et le séparateur.

Si vous voulez le faire correctement, vous devez utiliser un NSNumberFormatter. Il prend soin de toutes les différences entre les formats en devise. Et il le fait beaucoup mieux que vous. Parce qu'il le fait pour toutes les monnaies, et pas seulement pour les 4 principales devises que vous souhaitez soutenir.

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

Si vous voulez l'utiliser pour achat in-app vous ne pouvez pas compter sur les utilisateurs locaux, car il est possible d'utiliser un compte basé sur un appareil avec un DE (allemand) paramètres régionaux. Et le prix de votre article (prix réel est de 0,79€ en Allemagne) montrerait que 0,99€ (parce qu'il en coûte $0.99 US). Ce serait une erreur. Vous obtenez un localisée prix déjà à partir de l'app store, il n'est pas nécessaire de faire des calculs sur votre propre.
Et vous obtenez un prix et un priceLocale pour chacun de vos SKProducts.

Vous obtenez la bonne formaté monnaie chaîne comme ceci:

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: depuis que vous avez spécifiquement demandé le code de la devise.

Vous pouvez vous le procurer NSString *currencyCode = [formatter currencyCode]; Cela vous donnera le code de la devise selon la norme ISO 4217. AUD, USD, EUR et ainsi de suite.

46voto

tsakoyan Points 1091

J'ai utilisé ces clés pour extraire les symboles / codes monétaires des lieux

 NSLocale *theLocale = [NSLocale currentLocale];
NSString *symbol = [theLocale objectForKey:NSLocaleCurrencySymbol];
NSString *code = [theLocale objectForKey:NSLocaleCurrencyCode];
 

5voto

Yuvaraj.M Points 2886

J'ai utilisé le code ci-dessous dans mon application pour récupérer un signe de devise locale et trouver les délimiteurs. Je t'aiderai,

 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
 

Merci.

5voto

Hardik Darji Points 774
create macro first then use it
#define CURRENCY_SYMBOL [[NSLocale currentLocale] objectForKey:NSLocaleCurrencySymbol]

NSLog(@"%@ %.2f",CURRENCY_SYMBOL,25.50);

1voto

vodkhang Points 11222

Merci pour votre réponse. J'ai finalement compris que je pouvais récupérer le prix et le code de devise directement auprès d'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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X