web-dev-qa-db-fra.com

Trouver la devise locale pour l'iphone par programmation

Je veux découvrir les paramètres régionaux de devise sur l'iphone de l'utilisateur par programmation. Cela signifie que si l'utilisateur se trouve dans le magasin américain, la devise locale doit être USD, pour l'Australie, il doit être AUD. Mon objectif de cette tâche est d'essayer de convertir le prix de l'article indiqué sur notre application pour qu'il corresponde presque au prix demandé par l'AppStore.

Par exemple, si nous vendons une vidéo 3 USD, et qu'un Australien veut l'acheter, alors je devrais afficher 2,8 AUD sur l'écran de mon application. Cela réduira le calcul de l'utilisateur sur le prix réel dans son pays. Quelqu'un sait-il comment le faire?

54
vodkhang

Dans la plupart des cas, le symbole monétaire ne suffira pas. Par exemple, en Allemagne, nous écrivons nos prix comme ceci: 1,99 € mais les gens aux États-Unis utilisent 1,99 $. Il existe trois différences dans la chaîne. Le symbole monétaire, sa position et le séparateur.

Si vous voulez le faire correctement, vous devez utiliser un NSNumberFormatter. Il prend en charge toutes les différences entre les formats monétaires. Et il le fait beaucoup mieux que vous. Parce qu'il le fait pour toutes les devises, pas seulement pour les 4 principales devises que vous souhaitez prendre en charge.

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

Si vous souhaitez l'utiliser pour l'achat in-app, vous ne pouvez pas vous fier aux paramètres régionaux actuels de l'utilisateur, car il est possible d'utiliser un compte basé aux États-Unis sur un appareil avec un paramètre régional DE (allemand). Et le prix de votre article (le prix réel est de 0,79 € en Allemagne) serait de 0,99 € (car il coûte 0,99 $ aux États-Unis). Ce serait faux. Vous obtenez déjà un prix localisé sur l'App Store, il n'est pas nécessaire de faire des calculs par vous-même.
Et vous obtenez un prix et un priceLocale pour chacun de vos produits SK.

Vous obtiendrez la chaîne de devise formatée correcte 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: puisque vous avez spécifiquement demandé le code devise.

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

127
Matthias Bauch

J'ai utilisé ces touches pour extraire les symboles/codes monétaires des paramètres régionaux

NSLocale *theLocale = [NSLocale currentLocale];
NSString *symbol = [theLocale objectForKey:NSLocaleCurrencySymbol];
NSString *code = [theLocale objectForKey:NSLocaleCurrencyCode];
46
tsakoyan
create macro first then use it
#define CURRENCY_SYMBOL [[NSLocale currentLocale] objectForKey:NSLocaleCurrencySymbol]

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

J'ai utilisé le code ci-dessous dans mon application pour récupérer le 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.

5
Yuvaraj.M

Matthias Bauch répond dans Swift:

var formatter = NSNumberFormatter()
    formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
    formatter.locale = product!.priceLocale
var currencyString = "\(formatter.stringFromNumber(product!.price)!)"
3
ZiggyST

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
1
vodkhang