2011-08-20 15 views
35

Mam aplikację, która drukuje obliczoną wartość pieniężną i chcę wyświetlić tę wartość z domyślnym formatem waluty.Jak sformatować wartość zmiennoprzecinkową za pomocą formatu waluty urządzenia?

Na przykład w Europie byłoby napisać:

1.000,95 €

W USA Myślę, że piszesz

1,000.95 $

w innych walutach są bardziej lub mniej wartości wyświetlane dla ułamka dziesiętnego, w USA będzie to 2, ale w Japonii będzie to 0.

Jak mogę uzyskać dokładną, jak to możliwe rmat dla wszystkich istniejących walut?

Odpowiedz

65

Znalazłem rozwiązanie. Klasa NumberFormat ma wiele predefiniowanych formaterów. Istnieje również format służący do formatowania wartości waluty.

Jeśli użyjesz statycznej metody getCurrencyInstance, klasa zwróci formater dla domyślnej waluty urządzenia. Używam następujący kod do ustawione mój wynik:

NumberFormat format = NumberFormat.getCurrencyInstance(); 
((TextView) findViewById(R.id.text_result)).setText(format.format(result)); 
+1

wynik jest zmienna w jakim formacie ?? –

+1

co się stanie w wyniku przypadku = 1000, a Twój telefon to FR, ale jesteś w USA? Czy napisze 1000 euro zamiast 1000 $? Format waluty nie będzie uwzględniał konwersji lub wyniku jest prawidłowy? –

2

Sprawdź DecimalFormat.

Posiada wiele funkcji zaprojektowanych w celu umożliwienia analizowania i formatu liczby w dowolnej lokalizacji, w tym wsparcie dla zachodnich, arabski, lub indyjskich cyfr. Obsługuje również różne smaki liczb: , w tym liczby całkowite ("123"), liczby stałe ("123.4"), notację naukową ("1,23E4"), wartości procentowe ("12%"), i kwoty w walucie ("123 $"). Wszystkie te smaki można łatwo zlokalizować.

39

W trosce o kompletność załóżmy, że chcemy wyświetlić ceny w aktualnej lokalizacji telefonu (poprawne znaku dziesiętnego i separatora tysięcy), ale z waluty do wyboru.

NumberFormat format = NumberFormat.getCurrencyInstance(Locale.getDefault()); 
format.setCurrency(Currency.getInstance("CZK")); 
String result = format.format(1234567.89); 

result będzie wtedy posiadać następujące wartości:

  • CZK1,234,567.89 z USA Locale
  • 1 234 567,89 Kč z Czech lokalizacji

Jeśli chcesz pominąć część dziesiętną o cenach (pokaż $199 zamiast $199.00) wywołaj to przed użyciem formatyzatora:

format.setMinimumFractionDigits(0); 

Wszystkie opcje są wymienione w NumberFormat docs.

+0

Ten link jest przydatny w przypadku Locale http://stackoverflow.com/questions/4212320/get-the-current-language-in-device?rq=1 –

+0

Jeśli ktoś ma problemy z uzyskaniem prawidłowych symboli walut, tutaj alternatywny https: //stackoverflow.com/questions/9777689/how-to-get-numberformat-instance-from-currency-code –

0

uzyskać locale urządzenie można użyć to:

@TargetApi(Build.VERSION_CODES.N) 
    public static Locale getCurrentLocale(Context c) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
      return c.getResources().getConfiguration().getLocales().get(0); 
     } else { 
      //noinspection deprecation 
      return c.getResources().getConfiguration().locale; 
     } 

a następnie zrobić format:

 double num = 1323.526; 

     NumberFormat defaultFormat = NumberFormat.getCurrencyInstance(getCurrentLocale(getContext())); 
     defaultFormat.format(num) 
Powiązane problemy