How can I convert numbers to currency format in android

Viewed 73527

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

17 Answers

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

Currency formatter.

    public static String currencyFormat(String amount) {
        DecimalFormat formatter = new DecimalFormat("###,###,##0.00");
        return formatter.format(Double.parseDouble(amount));
    }
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

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

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())
}

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

}

}

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()

If you have the value stored in a String like me, which was coming from the server like "$20000.00". You can do something like this in Kotlin (JetpackCompose):

@Composable
fun PrizeAmount(
    modifier: Modifier = Modifier,
    prize: String,
) 
{
    val currencyFormat = NumberFormat.getCurrencyInstance(Locale("en", "US"))
    val text = currencyFormat.format(prize.substringAfter("$").toDouble())
    ...
}

Output: "$20,000.00"

NumberFormat.getCurrencyInstance(Locale("ES", "es")).format(number)

here is a kotlin version to Format Currency, here i'm getting an argument from another fragment from an input Field then it will be set in the textView in the main Fragment

fun formatArgumentCurrency(argument : String, textView: TextView) {

        val valueText = requireArguments().get(argument).toString()
        val dec = DecimalFormat("#,###.##")
        val number = java.lang.Double.valueOf(valueText)
        val value = dec.format(number)
        val currency = Currency.getInstance("USD")
        val symbol = currency.symbol
        textView.text = String.format("$symbol$value","%.2f" )

    }

Updated 2022 answer

Try this snippet. It formats a number in string complete with the currency & setting fractional digits.

Upvote if this helped you! :)

/**
     * Formats amount in string to human-readable amount (separated with commas
     * & prepends currency symbol)
     *
     * @param amount The amount to format in String
     * @return The formatted amount complete with separators & currency symbol added
     */
    public static String formatCurrency(String amount) {
        String formattedAmount = amount;
        try {
            if (amount == null || amount.isEmpty())
                throw new Exception("Amount is null/empty");
            Double amountInDouble = Double.parseDouble(amount);
            NumberFormat numberFormat = NumberFormat.getCurrencyInstance(new Locale("en", "IN"));
            numberFormat.setMaximumFractionDigits(2);
            numberFormat.setMinimumFractionDigits(2);
            formattedAmount = numberFormat.format(amountInDouble);
        } catch (Exception exception) {
            exception.printStackTrace();
            return formattedAmount;
        }
        return formattedAmount;
    }

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!

Related