2012-10-02 8 views
9

Mam problemy z uzyskaniem domyślnego symbolu waluty systemu. jestem coraz symbol waluty w ten sposób:Symbol waluty lokalnej

Currency currency = Currency.getInstance(Locale.getDefault()); 
Log.v("TAG",currency.getSymbol()); 

Gdy język system jest w English (United States) prawo pokazuje się symbol ($). Ale kiedy wybiorę język Portuguese (Portugal), zwróci ten symbol ¤.

Co może być przyczyną?

+0

Może używasz UTF-8 zamiast UTF-16? Nie rozumiem, jak to się mogło stać, ale jest to myśl. – AedonEtLIRA

+0

Myślę, że to będzie dobre rozwiązanie dla Twojej odpowiedzi Currency.getInstance (nowe ustawienia regionalne ("TWÓJ JĘZYK", kod kraju)). GetSymbol(); –

+0

Możesz otrzymać odpowiedź na swoje pytanie z tego [link] (https://stackoverflow.com/questions/16832655/getting-currency-code-if-we-have-only-country-code-in-database/16833419# 16833419) –

Odpowiedz

2

Niektóre myśli;

  1. Czy to możliwe, że jesteś uzyskanie prawa do symbolu (Euro), ale czcionka/log nie ma i to tylko wygląda jak tego symbolu?

  2. Locale jest bardzo rozbrykany klasa, to konstruktorzy nie sprawdzanie błędów. Możesz łatwo zobaczyć ustawienia regionalne, które nie są obsługiwane lub w rzeczywistości nie istnieją w standardach (takich jak "de_US" w przypadku "niemieckiego w Stanach Zjednoczonych").

  3. Należy pamiętać, że dane locale niekoniecznie jest dostępny dla każdego z ustawień regionalnych wstępnie zdefiniowane jako stałe w tej klasie, z wyjątkiem en_us, który jest jedynym locale gwarancje Java jest zawsze dostępny, i różni się w różnych wydaniach Androida i może być również ograniczony przez operatora lub niestandardowe kompilacje. pt_PT was added in 2.3.

  4. Jeśli chodzi o opcję podane, jeśli sprawdzeniu Unicode's standards jak zostały one wdrożone w API8 iw górę, Portugalia istnieje tylko jako terytorium (a nie kombinacji).

  5. Może być lepiej, jeśli w związku z tym utworzysz częściową instancję ustawień regionalnych z samego kodu kraju, a następnie na przykład uzyskasz symbol waluty dla Portugalii. Nie będziesz w stanie spełnić wstępnie zdefiniowanego statics of Locale's class, ponieważ bardzo wąsko obsługuje różne ustawienia narodowe (To jest krótka lista), ale powinno działać, ponieważ te ustawienia narodowe mają dane, których szukasz w systemie.

  6. Spróbowałbym również sprawdzić, czy currency.toString() zwraca EUR (kod ISO 4217 waluty, zwykle trzyliterowy akronim).

13

To wydaje się być znany problem (http://code.google.com/p/android/issues/detail?id=38622 doszedłem do możliwego rozwiązania w ten sposób:.

Ponieważ problem jest w symbolu, a nie kod waluty, i rozwiązał ten problem tworząc statyczne Map gdzie kluczem jest CurrencyCode a wartość jest Symbol.

public static final Map<String, String> MYCURRENCIES = new HashMap<String, String>(){ 
     { 
      put("EUR","€"); 
      put("USD","$"); 
      (..) 
     } 
}; 

W celu uzyskania wszystkich (lub prawie) kody dostępne w informacji locales walutach można zrobić coś takiego:

for (Locale ll: Locale.getAvailableLocales()){ 
    try { 
     Currency a = Currency.getInstance(ll); 
     Log.v("MyCurrency",a.getCurrencyCode()+"#"+a.getSymbol()); 
    }catch (Exception e){ 
     // when the locale is not supported 
    } 
} 

Po stworzony Ci mapa z CurrencyCode i symbol po prostu trzeba coś takiego:

Currency currency = Currency.getInstance(Locale.getDefault()); 
String curSymbol = MYCURRENCIES.get(currency.getCurrencyCode()); 
+1

To jest całkiem fajne, dziękuję. ps: dla wszystkich pozostałych: zamiast Log.v po prostu MYCURRENCIES.put (a.getCurrencyCode(), a.getSymbol()); –

2
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(); 
    String cur = currencyFormatter.format(yourValue); 

ta formatuje INT/double do waluty opartej na urządzeniu Język

String currency = cur.replaceAll("[0-9.,]",""); 

I to jest jak się tylko symbol waluty, zastępując wszystkie cyfry, kropki i przecinki