Voici un code de comment obtenir le symbole monétaire maintenant:
NSLocale *lcl = [[[NSLocale alloc] initWithLocaleIdentifier:@"au_AU"] autorelease];
NSNumberFormatter *fmtr = [[[NSNumberFormatter alloc] init] autorelease];
[fmtr setNumberStyle:NSNumberFormatterCurrencyStyle];
[fmtr setLocale:lcl];
NSLog( @"%@", [lcl displayNameForKey:NSLocaleCurrencySymbol value:@"AUD"] );
NSLog( @"%@", [fmtr currencySymbol] );
Les deux NSLogs renvoient "AU $". Comme je l’ai compris dans la documentation de développement d’Apple, il existe au moins deux symboles monétaires pour chaque devise (ces symboles peuvent toutefois être identiques): local (utilisé dans un pays. pour l'Australie). La question est donc de savoir comment obtenir le symbole monétaire LOCAL. Des idées?
Merci d'avance.
Votre code devrait fonctionner, mais l'identificateur de paramètres régionaux est incorrect. Ce devrait être "en_AU".
Voir "Utilisation de l'objet Locale" dans le "Guide d'internationalisation et de localisation" ( https://developer.Apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/InternationalizingLocaleData/InternationalizingLocaleData.html#//Apple_ref/ doc/uid/10000171i-CH13-SW4 )
NSNumberFormatter *currencyFormatter = [[[NSNumberFormatter alloc] init] autorelease];
[currencyFormatter setLocale:[NSLocale currentLocale]];
[currencyFormatter setMaximumFractionDigits:2];
[currencyFormatter setMinimumFractionDigits:2];
[currencyFormatter setAlwaysShowsDecimalSeparator:YES];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
NSNumber *someAmount = [NSNumber numberWithFloat:5.00];
NSString *string = [currencyFormatter stringFromNumber:someAmount];
Vous recevrez 5,00 $ US pour les États-Unis, 5,00 ¥ japonais pour le Japon, 5,00 € pour l'Europe, etc.
Cet extrait renvoie le symbole monétaire pour l'environnement local "ja_JP" (il peut s'agir de tout autre environnement local).
NSLocale* japanese_japan = [[[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"] autorelease];
NSNumberFormatter* fmtr = [[[NSNumberFormatter alloc] init] autorelease];
[fmtr setNumberStyle:NSNumberFormatterCurrencyStyle];
[fmtr setLocale:japanese_japan];
// Local currency symbol (what you're asking for)
NSString* currencySymbol = [fmtr currencySymbol];
NSLog( @"%@", currencySymbol ); // Prints '¥'
// International currency symbol
NSString* internationalCurrencySymbol = [fmtr internationalCurrencySymbol];
NSLog( @"%@", internationalCurrencySymbol ); // Prints 'JPY'
Il est regrettable que pour au_AU vous obteniez AU $ comme symbole de la devise locale au lieu de seulement $, mais ce doit être ainsi qu'il doit être affiché sur iOS. Notez cependant que le symbole international imprimé pour au_AU n'est pas AU $ mais AUD.
Ce n’est pas idéal car il ne sort pas du système, mais vous pouvez évidemment créer votre propre table interne en utilisant uneliste des symboles monétaires actuels * . Etant donné que cette liste contient les symboles unicode, il s’agirait simplement de faire correspondre la liste de paramètres régionaux Apple à la liste.
Vous savez, juste au cas où ceux fournis par Apple ne sont pas réellement accessibles.
* Note : le lien n'est pas destiné à faire autorité, voir les commentaires.
Version Swift, code adapté de la réponse de Valentyn (testé sur Swift 4.1 ):
func formattedCurrency(amount: Double, locale: Locale) -> String? {
let formatter = NumberFormatter()
formatter.locale = locale
formatter.maximumFractionDigits = 2
formatter.minimumFractionDigits = 2
formatter.alwaysShowsDecimalSeparator = true
formatter.numberStyle = .currency
return formatter.string(from: NSNumber(value: amount))
}
Cela donne un résultat décent, bien que cela ne change pas la position du symbole monétaire correctement pour tous les paramètres régionaux, malgré ce qui est écrit dans la réponse originale. Mais c’est ce que veut Apple, qu’il en soit ainsi.
Le dollar australien est affiché dans la question initiale sous la forme "1,50 $".
Si vous le souhaitez, vous pouvez créer un fichier .strings
contenant la devise et utiliser la fonction NSLocalizedString
pour créer la devise localisée. Quelque chose comme ça:
en.lproj
myApp.strings:
"currencySymbol"="$"
"currencyFormat"="$%lf"
au_AU.lproj
myApp.strings:
"currencySymbol"="$"
"currencyFormat"="$%lf"
ja_JP.lproj
myApp.strings:
"currencySymbol"="¥"
"currencyFormat"="¥%lf"
Et utilisez ça comme ça:
NSString *money = [NSString stringWithFormat:@"%@%lf", NSLocalizedString:(@"currencySymbol"), myMoney];
Toutefois, cela signifie que pour chaque localisation prise en charge, vous avez besoin d’un fichier .strings
. De plus, cela signifie que pour certaines localisations, le symbole monétaire ne suffira pas pour afficher le format monétaire approprié, vous devrez utiliser quelque chose comme ceci:
NSString *money = [NSString stringWithFormat:NSLocalizedString(@"CurrencyFormat"), myMoney];
Cela a quelques limitations, mais cela pourrait marcher pour vous.
Pourriez-vous obtenir la chaîne en cours et la supprimer de tous les caractères a-Z? Si la chaîne résultante a une longueur> 0, alors vous avez votre symbole. Sinon, utilisez la chaîne d'origine.
C'est collant et je ne sais pas si cela fonctionnerait pour toutes les devises du monde, mais cela pourrait fonctionner?