How to format a Float Value with the device currency format?

AndroidLocalizationLocale

Android Problem Overview


I have an app that prints a calculated money value and I want to display that value with the default currency format.

For example in Europe you would write:

1.000,95€

In the US I think you would write

1,000.95$

In other currencies there are more or less values displayed for the decimal fraction, in US it would be 2 but in Japan it would be 0.

How can I obtain a exact as possible format for all existing currencies?

Android Solutions


Solution 1 - Android

For sake of completeness suppose you want to display a price in phone's current locale (correct decimal mark and thousand separator) but with a currency of your choice.

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

result would then hold these values:

  • CZK1,234,567.89 with US locale
  • 1 234 567,89 Kč with Czech locale

If you'd like to omit the decimal part for prices (show $199 instead of $199.00) call this before using the formatter:

format.setMinimumFractionDigits(0);

All options are listed in NumberFormat docs.

Solution 2 - Android

I found the solution. THe class NumberFormat has a multitude of predefined formatters. There is also one for formatting currency Values.

If you use the static method getCurrencyInstance the class will return a formatter for the device default currency. I use the following code to set my result:

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

Solution 3 - Android

Check out DecimalFormat.

> It has a variety of features designed to make it possible to parse and > format numbers in any locale, including support for Western, Arabic, > or Indic digits. It also supports different flavors of numbers, > including integers ("123"), fixed-point numbers ("123.4"), scientific > notation ("1.23E4"), percentages ("12%"), and currency amounts > ("$123"). All of these flavors can be easily localized.

Solution 4 - Android

to get device locale you could use this:

@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;
        }

and then to do format:

        double num = 1323.526;

		NumberFormat defaultFormat = NumberFormat.getCurrencyInstance(getCurrentLocale(getContext()));
		defaultFormat.format(num)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJanuszView Question on Stackoverflow
Solution 1 - AndroidEugen PechanecView Answer on Stackoverflow
Solution 2 - AndroidJanuszView Answer on Stackoverflow
Solution 3 - Androiduser658042View Answer on Stackoverflow
Solution 4 - AndroidMilos Simic SimoView Answer on Stackoverflow