Pytanie iPhone: jak uzyskać symbol waluty lokalnej (np. "$" unstead "AU $")


Oto kod, w jaki sposób otrzymuję teraz symbol waluty:

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

Oba pliki NSLog zwracają "AU $". Jak rozumiem w dokumentacji deweloperskiej Apple, istnieją co najmniej dwa symbole walut dla każdej waluty (te symbole mogą być jednakowe) - lokalne (używane w kraju, np. W Australii) i międzynarodowe (AU $ dla Australii). Pytanie więc, jak zdobyć symbol waluty LOKALNEJ. Jakieś pomysły?

Z góry dziękuję.


26
2017-12-13 10:04


pochodzenie


Może to w rzeczywistości błąd (np. Niedopatrzenie zespołu lokalizującego) w iOS. Czy próbowałeś tego samego z innymi ustawieniami regionalnymi, np. USA? Jeśli znajdziesz się tam raz "$" i raz "US $", wtedy rozważę to jako błąd i zarchiwizuję go na bugreport.apple.com, i dodam specjalną obsługę tego AU $ do twojego kodu. - Thomas Tempelmann
Tak - zdecydowanie błąd. Próbowałem tego i en_US zwraca $ - mackross
@Thomas Tempelmann: Właśnie zgłosiłem błąd. Dzięki. - kovpas


Odpowiedzi:


Twój kod powinien zadziałać, ale identyfikator lokalizacji jest błędny. Powinno to być "en_AU".

Zobacz "Korzystanie z obiektu lokalnego" w "Przewodniku po internacjonalizacji i lokalizacji" (https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/InternationalizingLocaleData/InternationalizingLocaleData.html#//apple_ref/doc/uid/10000171-CH13-SW4)


9
2017-11-25 04:27



Święty c ... Dziękuję człowieku :). Rozwiązałem ten problem w inny sposób, ale to naprawdę działa, właśnie sprawdziłem :). - kovpas
Połączona strona to 404'd - Isuru
NSString *currencySymbol = [[NSLocale currentLocale] objectForKey:NSLocaleCurrencySymbol]; - CyberMew


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

Otrzymasz 5,00 USD dla USA, 5,00 JPY dla Japonii, 5,00 EUR dla Europy, itp.


19
2018-06-16 09:38



Pytanie dotyczyło konkretnych ustawień lokalnych, a nie "[NSLocale currentLocale]". W każdym razie Nik dostarczył poprawną odpowiedź kilka miesięcy temu. Dzięki. - kovpas
¥ 5,00 dla Japonii jest szczerze błędne. 5 jenów to około 2 1/2 centów. Nie wyświetlasz jena z dwoma miejscami dziesiętnymi. 5,00 USD to około 1000 Yen, wyświetlane jako ¥ 1,000, a nie ¥ 1,000.00. Ustawienie regionalne wie, jak prawidłowo wydrukować Yen. - gnasher729
Naprawiono problem, w moim przypadku musiałem pobrać walutę dla mojego produktu iNApp, więc wymieniłem [currencyFormatter setLocale:[NSLocale currentLocale]]; z [currencyFormatter setLocale:_product.priceLocale]; - Ahsan Ebrahim


Ten fragment kodu zwraca symbol waluty ¥ dla locale "ja_JP" (mogą to być dowolne inne ustawienia narodowe).

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'

To niefortunne, że dla au_AU otrzymujesz AU $ jako symbol waluty lokalnej zamiast tylko $, ale musi to być sposób, w jaki ma być wyświetlany na iOS. Należy jednak pamiętać, że międzynarodowy symbol wydrukowany dla au_AU to nie AU, ale AUD.


12
2017-12-15 15:49



Tak, to dziwne, ponieważ JPY (i AUD) nie są symbolami waluty międzynarodowej. Są to kody walutowe (można je uzyskać za pomocą [fmtr currencyCode]). Dzięki za pomoc, ale nie jest to dokładnie to, czego szukałem. - kovpas


Nie jest to idealne rozwiązanie, ponieważ nie wychodzi z systemu, ale oczywiście można utworzyć własny wewnętrzny stół za pomocą lista aktualnych symboli walut*. Ponieważ ta lista ma symbole Unicode, będzie to po prostu kwestia dopasowania listy języków do listy języków w Apple.

No wiesz, na wypadek gdyby te dostarczone przez Apple nie były faktycznie dostępne.

*Uwaga: link nie ma być autorytatywny, patrz komentarze.


9
2017-12-15 14:14



Tak, jasne, myślałem o tym, ale tego właśnie miałem nadzieję uniknąć. Cóż, jeśli nie będzie lepszego rozwiązania, wykorzystam to. Dzięki. - kovpas
Całkowicie niepowiązane - ale rozpoznaję twoją ikonę awatara. Znam twórców Carcassonne, oni są tutaj, w tym samym mieście co ja. To mili faceci i cieszę się, że podjęli się tej pracy. - Thomas Tempelmann
Zrobili świetną robotę z portem iOS, godną pochwały. Jest to jedna z dwóch ostatnich konwersji w grze planszowej. - Matthew Frederick
Twój link nie jest odpowiedni w niektórych przypadkach. OP wyszukuje symbol waluty lokalnej. Ale dla Szwajcarii jest źle. Mówi CHF, podczas gdy lokalnie jest skracany do Fr. lub SFr. Więc linki nie są naprawdę wiarygodne. - v1Axvw
Ach, niestety. Po prostu wskazałem na pierwszy wynik Google, zdecydowanie nie chcę polecać go jako autorytatywnego źródła. Przepraszam, jeśli domyślam się, że był prawidłowy. - Matthew Frederick


Możesz, jeśli musisz, utworzyć .strings plik zawierający walutę i użyj NSLocalizedString funkcja do tworzenia zlokalizowanej waluty. Coś takiego:

en.lproj
myApp.strings:

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

au_AU.lproj
myApp.strings:

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

ja_JP.lproj
myApp.strings:

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

I użyj tego w ten sposób:

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

Oznacza to jednak, że dla każdej obsługiwanej lokalizacji potrzebujesz .strings  plik. Oznacza to również, że w przypadku niektórych lokalizacji symbol waluty nie byłby wystarczający do wyświetlenia odpowiedniego formatu pieniężnego, należy użyć czegoś takiego:

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

Ma to pewne ograniczenia, ale może ci się przydać.


0
2017-12-17 14:04



Dzięki za rozwiązanie. To może zadziałać, ale na razie o wiele łatwiej wygląda rozwiązanie Matthew Fredericka - mam już tabelę walut w mojej bazie danych, więc dodam kolumnę z symbolem lokalnej waluty. W mojej sytuacji wygląda to łatwiej. Wygląda na to, że nie ma wbudowanego rozwiązania. - kovpas


Czy mógłbyś uzyskać bieżący ciąg i usunąć go ze wszystkich znaków a-Z? Jeśli wynikowy ciąg ma długość> 0, to masz swój symbol. W przeciwnym razie użyj oryginalnego napisu.

Jest tandetny i nie jestem pewien, czy to działałoby dla wszystkich walut na całym świecie, ale może działać?


0
2017-12-20 04:55



Nie, to nie zadziała. Oto lista walut w obiegu: ฿ · Br · ₵ · ¢ · C $ · ₡ · B /. · Ден. · · Ft · ₲ · Kč · ₭ · L · £ / ₤ · ₥ · ₦ · ₱ · P · R · RM · RSD · · ₨ · đ. · S /. · ৳ · R $ · $ · · · ₮ · ₩ · ¥ · zł · ₴ · Q · ₪ · TL. en.wikipedia.org/wiki/Currency_sign - kovpas
Co jeszcze bardziej zabrudzić? Użyj listy prawidłowych symboli walut. Jeśli to jeden z nich, użyj go. W przeciwnym razie usuń wszystkie znaki a-Z. - mackross
W moim konkretnym przypadku, jak wspomniałem powyżej, znacznie wygodniej jest utworzyć listę "CODE -> LOCAL_SYMBOL". Wygląda na to, że będę musiał rozwiązać mój problem w ten sposób. - kovpas
bez obaw :) Cieszę się, że znalazłeś rozwiązanie. czy zgłosiłeś to jako błąd do Apple? - mackross
Nie, nie zrobiłem tego. Zrobi to. Dzięki :) - kovpas


Wersja Swift, kod przyjęty z odpowiedzi Valentyna (testowany na 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))
}

Daje przyzwoity wynik, mimo że nie zmienia prawidłowo pozycji symbolu waluty dla wszystkich ustawień regionalnych, pomimo tego, co zostało napisane w oryginalnej odpowiedzi. Ale tak właśnie chce Apple, niech tak będzie.

Dolar australijski jest wyświetlany w pierwotnym pytaniu jako "1,50 USD".


0
2018-04-22 17:24