it-swarm.com.de

iPhone: Wie erhalte ich ein lokales Währungssymbol (d. h. "$" statt "AU $")

Hier ist ein Code, wie ich jetzt das Währungssymbol bekomme:

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

Beide NSLogs geben "AU $" zurück. Wie ich aus der Apple-Entwicklungsdokumentation verstanden habe, gibt es mindestens zwei Währungssymbole für jede Währung (diese Symbole könnten jedoch die gleichen sein) - local (das wird innerhalb eines Landes verwendet. $ Für Australien zum Beispiel) und international (AU $ für Australien). Die Frage ist also, wie man das lokale Währungssymbol erhält. Irgendwelche Ideen?

Danke im Voraus.

27
kovpas

Ihr Code sollte funktionieren, die Gebietsschema-ID ist jedoch falsch. Es sollte "en_AU" sein.

Siehe "Das Gebietsschema-Objekt verwenden" im "Internationalization and Localization Guide" ( https://developer.Apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/InternationalizingLocaleData/InternationalizingLocaleData.html#//Apple_ref/ doc/uid/10000171i-CH13-SW4 )

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

Sie erhalten 5,00 US-Dollar, 5,00 ¥ für Japan, 5,00 € für Europa usw.

20

Dieses Snippet gibt das Währungssymbol ¥ für das Gebietsschema "ja_JP" zurück (möglicherweise ein anderes Gebietsschema).

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'

Es ist bedauerlich, dass für au_AU AU $ anstelle von $ als lokales Währungssymbol angezeigt wird. Dies muss jedoch auf iOS angezeigt werden. Beachten Sie jedoch, dass das internationale Symbol für au_AU nicht AU $, sondern AUD ist.

12
Julio Gorgé

Dies ist nicht ideal, da es nicht aus dem System kommt, aber Sie können natürlich Ihre eigene interne Tabelle mit einerListe der aktuellen Währungssymbole erstellen * . Da diese Liste die Unicode-Symbole enthält, muss lediglich die Liste der Gebietsschemata von Apple mit der Liste abgeglichen werden.

Weißt du, nur für den Fall, dass die von Apple bereitgestellten nicht wirklich zugänglich sind.

* Hinweis : Link ist nicht als verbindlich gedacht, siehe Kommentare.

9

Swift-Version, Code angepasst an Valentyns Antwort (getestet am 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))
}

Es gibt ein anständiges Ergebnis, obwohl es die Position des Währungssymbols nicht korrekt für alle Gebietsschemas ändert, obwohl in der ursprünglichen Antwort geschrieben wird. Aber so will Apple es sein, so sei es.

Der australische Dollar wird bei der ursprünglichen Frage als "1,50 $" angezeigt.

1
Alex

Sie können bei Bedarf eine .strings-Datei erstellen, die die Währung enthält, und die NSLocalizedString-Funktion zum Erstellen der lokalisierten Währung verwenden. Etwas wie das:

en.lproj
myApp.strings:

"currencySymbol"="$"
"currencyFormat"="$%lf"

au_AU.lproj
myApp.strings:

"currencySymbol"="$"
"currencyFormat"="$%lf"

ja_JP.lproj
myApp.strings:

"currencySymbol"="¥"
"currencyFormat"="¥%lf"

Und benutze das so:

NSString *money = [NSString stringWithFormat:@"%@%lf", NSLocalizedString:(@"currencySymbol"), myMoney];

Das bedeutet jedoch, dass Sie für jede unterstützte Lokalisierung eine .strings-Datei benötigen. Dies bedeutet auch, dass das Währungssymbol für einige Lokalisierungen nicht ausreicht, um das richtige Währungsformat anzuzeigen. Sie müssten etwa Folgendes verwenden:

NSString *money = [NSString stringWithFormat:NSLocalizedString(@"CurrencyFormat"), myMoney];

Dies hat einige Einschränkungen, kann aber für Sie funktionieren.

1

Könnten Sie den aktuellen String abrufen und alle a-Z-Zeichen entfernen? Wenn der resultierende String eine Länge> 0 hat, haben Sie Ihr Symbol. Andernfalls verwenden Sie die Originalzeichenfolge. 

Es ist schwierig und ich bin nicht sicher, ob dies für alle Währungen weltweit funktionieren würde, aber es könnte funktionieren?

0
mackross