'How can I convert numbers to currency format in android

I want to show my numbers in money format and separate digits like the example below:

1000 -----> 1,000

10000 -----> 10,000

100000 -----> 100,000

1000000 -----> 1,000,000

Thanks



Solution 1:[1]

Another approach :

NumberFormat format = NumberFormat.getCurrencyInstance();
format.setMaximumFractionDigits(0);
format.setCurrency(Currency.getInstance("EUR"));

format.format(1000000);

This way, it's displaying 1 000 000 € or 1,000,000 €, depending on device currency's display settings

Solution 2:[2]

You need to use a number formatter, like so:

NumberFormat formatter = new DecimalFormat("#,###");
double myNumber = 1000000;
String formattedNumber = formatter.format(myNumber);
//formattedNumber is equal to 1,000,000

Hope this helps!

Solution 3:[3]

Currency formatter.

    public static String currencyFormat(String amount) {
        DecimalFormat formatter = new DecimalFormat("###,###,##0.00");
        return formatter.format(Double.parseDouble(amount));
    }

Solution 4:[4]

double number = 1000000000.0;
String COUNTRY = "US";
String LANGUAGE = "en";
String str = NumberFormat.getCurrencyInstance(new Locale(LANGUAGE, COUNTRY)).format(number);

//str = $1,000,000,000.00

Solution 5:[5]

Use this:

int number = 1000000000;
String str = NumberFormat.getNumberInstance(Locale.US).format(number);
//str = 1,000,000,000

Solution 6:[6]

This Method gives you the exact output which you need:

public String currencyFormatter(String num) {
    double m = Double.parseDouble(num);
    DecimalFormat formatter = new DecimalFormat("###,###,###");
    return formatter.format(m);
}

Solution 7:[7]

Try the following solution:

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

The class will return a formatter for the device default currency.

You can refer to this link for more information:

https://developer.android.com/reference/java/text/NumberFormat.html

Solution 8:[8]

Here's a kotlin Extension that converts a Double to a Currency(Nigerian Naira)

fun Double.toRidePrice():String{
    val format: NumberFormat = NumberFormat.getCurrencyInstance()
    format.maximumFractionDigits = 0
    format.currency = Currency.getInstance("NGN")

    return format.format(this.roundToInt())
}

Solution 9:[9]

Use a Formatter class For eg:

String s = (String.format("%,d", 1000000)).replace(',', ' ');

Look into: http://developer.android.com/reference/java/util/Formatter.html

Solution 10:[10]

The way that I do this in our app is this:

amount.addTextChangedListener(new CurrencyTextWatcher(amount));

And the CurrencyTextWatcher is this:

public class CurrencyTextWatcher implements TextWatcher {

private EditText ed;
private String lastText;
private boolean bDel = false;
private boolean bInsert = false;
private int pos;

public CurrencyTextWatcher(EditText ed) {
    this.ed = ed;
}

public static String getStringWithSeparator(long value) {
    DecimalFormat formatter = (DecimalFormat) NumberFormat.getNumberInstance(Locale.US);
    String f = formatter.format(value);
    return f;
}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    bDel = false;
    bInsert = false;
    if (before == 1 && count == 0) {
        bDel = true;
        pos = start;
    } else if (before == 0 && count == 1) {
        bInsert = true;
        pos = start;
    }
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    lastText = s.toString();
}

@Override
public void afterTextChanged(Editable s) {
    ed.removeTextChangedListener(this);
    StringBuilder sb = new StringBuilder();
    String text = s.toString();
    for (int i = 0; i < text.length(); i++) {
        if ((text.charAt(i) >= 0x30 && text.charAt(i) <= 0x39) || text.charAt(i) == '.' || text.charAt(i) == ',')
            sb.append(text.charAt(i));
    }
    if (!sb.toString().equals(s.toString())) {
        bDel = bInsert = false;
    }
    String newText = getFormattedString(sb.toString());
    s.clear();
    s.append(newText);
    ed.addTextChangedListener(this);

    if (bDel) {
        int idx = pos;
        if (lastText.length() - 1 > newText.length())
            idx--; // if one , is removed
        if (idx < 0)
            idx = 0;
        ed.setSelection(idx);
    } else if (bInsert) {
        int idx = pos + 1;
        if (lastText.length() + 1 < newText.length())
            idx++; // if one , is added
        if (idx > newText.length())
            idx = newText.length();
        ed.setSelection(idx);
    }
}

private String getFormattedString(String text) {
    String res = "";
    try {
        String temp = text.replace(",", "");
        long part1;
        String part2 = "";
        int dotIndex = temp.indexOf(".");
        if (dotIndex >= 0) {
            part1 = Long.parseLong(temp.substring(0, dotIndex));
            if (dotIndex + 1 <= temp.length()) {
                part2 = temp.substring(dotIndex + 1).trim().replace(".", "").replace(",", "");
            }
        } else
            part1 = Long.parseLong(temp);

        res = getStringWithSeparator(part1);
        if (part2.length() > 0)
            res += "." + part2;
        else if (dotIndex >= 0)
            res += ".";
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return res;
}

Now if you add this watcher to your EditText, as soon as user enter his number, the watcher decides whether it needs separator or not.

Solution 11:[11]

i used this code for my project and it works:

   EditText edt_account_amount = findViewById(R.id.edt_account_amount);
   edt_account_amount.addTextChangedListener(new DigitFormatWatcher(edt_account_amount));

and defined class:

    public class NDigitCardFormatWatcher implements TextWatcher {

EditText et_filed;

String processed = "";


public NDigitCardFormatWatcher(EditText et_filed) {
    this.et_filed = et_filed;
}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

}

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override
public void afterTextChanged(Editable editable) {

    String initial = editable.toString();

    if (et_filed == null) return;
    if (initial.isEmpty()) return;
    String cleanString = initial.replace(",", "");

    NumberFormat formatter = new DecimalFormat("#,###");

    double myNumber = new Double(cleanString);

    processed = formatter.format(myNumber);

    //Remove the listener
    et_filed.removeTextChangedListener(this);

    //Assign processed text
    et_filed.setText(processed);

    try {
        et_filed.setSelection(processed.length());
    } catch (Exception e) {
        // TODO: handle exception
    }

    //Give back the listener
    et_filed.addTextChangedListener(this);

}

}

Solution 12:[12]

private val currencyFormatter = NumberFormat.getCurrencyInstance(LOCALE_AUS).configure()

private fun NumberFormat.configure() = apply {
    maximumFractionDigits = 2
    minimumFractionDigits = 2
}

fun Number.asCurrency(): String {
    return currencyFormatter.format(this)
}

And then just use as

val x = 100000.234
x.asCurrency()

Solution 13:[13]

You can easily achieve this with this small simple library. https://github.com/jpvs0101/Currencyfy

Just pass any number, then it will return formatted string, just like that.

currencyfy (500000.78); // $ 500,000.78  //default

currencyfy (500000.78, false); // $ 500,001 // hide fraction (will round off automatically!)

currencyfy (500000.78, false, false); // 500,001 // hide fraction & currency symbol

currencyfy (new Locale("en", "in"), 500000.78); // ? 5,00,000.78 // custom locale

It compatible with all versions of Android including older versions!