Monday, February 24, 2014

How to Format and Display Number to Currency in Java - Example Tutorial

Displaying financial amount in respective currency is common requirement in Java based E-commerce applications. For example if you are selling products on-line globally, you will show price of product in their local currency rather than USD or some other currency. Storing price in every currency is not a good option because of maintenance, and more realistically fluctuation in exchange rates. That's why many of these application prefer stores price of books, electronic goods or whatever product they are selling in USD, and responsibility of converting that price to local currency and displaying is left to client side code. If your client is Java based client e.g. Swing GUI , Java FX client, or a JSP web page, you can use java.text.NumberFormat class to format currency in Java. NumberFormat class allows you to display price in multiple currency depending upon Locale supported by your Java version. All you need to do is to get correct Currency Instance based upon Locale, for example to display amount in US dollar, call NumberFormat.getCurrencyInstance() method with Locale as Locale.US, similarly to display currency as UK pound sterling, pass Locale.UK and for displaying money in Japanese Yen, pass Locale.JAPAN. Once you get the correct instance of currency formatter, all you need to do is call their format() method by passing your number. We will see an example of converting one currency to other and displaying amount in multiple currency in Java. It's actually very much similar to formatting date in Java, so if you are familiar to that part, it would be easy to format currency as well.



How to format  Currency in Java

how to format Currency in Java NumbeFormat Example
Here is our sample program to format a number e.g. double or int to Currency in Java e.g. USD or GBP with dollar and pound sign. When we say formatting currency or formatting number as currency, what we mean is to show respective currency sign in front of price/amount. For example to display prince in USD, you will show something like $100.25. Similarly to show same price to UK customer in Pound, you will show £60.15 and if you are doing business in Asia, and have  Japanese customers, you will show prince in their local currency as well e.g. Japanese Yen, like ¥10,279. Did you notice currency sign in front of amount or price? This is what makes that number and amount rather than just a number. Java also put comma, just like the way write a bigger amount. This type of Locale specific issue becomes really tricky if you are doing this by hard-coding. Suppose you started your business with USD, and then start selling your product on England, if you keep storing price in database in multiple currency you will face hell lot of issue. Instead of that, just keep price in one currency in database, get the latest FX rate and covert price in real time for display. Java API has rich support for formatting currency by java.text.NumberFormat class, and good knowledge of it will save lot of your time, so do invest some time on this class. Also this program is compiled using JDK 1.7, did you notice use of String in Switch case, though I am not a big fan of it in production code, it works perfectly in short tutorials.

import java.text.NumberFormat;
import java.util.Locale;

/**
 * How to format Number to different currency in Java. Following Java program
 * will show you, how you can display double value in different currency e.g.
 * USD, GBP and JPY. This example show price in multiple currency.
 * 
* @author
 */
public class Test {

    public static void main(String args[]) {
        double price = 100.25;

        showPriceInUSD(price, getExchangeRate("USD"));
        showPriceInGBP(price, getExchangeRate("GBP"));
        showPriceInJPY(price, getExchangeRate("JPY"));

    }

    /**
     * Display price in US Dollar currency
     *
     * @param price
     * @param rate
     */
    public static void showPriceInUSD(double price, double rate) {
        double priceInUSD = price * rate;
        NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(Locale.US);
        System.out.printf("Price in USD : %s %n", currencyFormat.format(priceInUSD));

    }

    /**
     * Display prince in British Pound
     *
     * @param price
     * @param rate
     */
    public static void showPriceInGBP(double price, double rate) {
        double princeInGBP = price * rate;
        NumberFormat GBP = NumberFormat.getCurrencyInstance(Locale.UK);
        System.out.printf("Price in GBP : %s %n", GBP.format(princeInGBP));
    }

    /**
     * Display prince in Japanese Yen
     *
     * @param price
     * @param rate
     */
    public static void showPriceInJPY(double price, double rate) {
        double princeInJPY = price * rate;
        NumberFormat currency = NumberFormat.getCurrencyInstance(Locale.JAPAN);
        System.out.printf("Price in JPY : %s %n", currency.format(princeInJPY));
    }

    /**
     * @return FX exchange rate for USD
     * @param currency
     */
    public static double getExchangeRate(String currency) {
        switch (currency) {
            case "USD":
                return 1;
            case "JPY":
                return 102.53;
            case "GBP":
                return 0.60;
            case "EURO":
                return 0.73;
            default:
                throw new IllegalArgumentException(String.format("No rates available for currency %s %n", currency));
        }
    }

}


Output
Price in USD : $100.25 
Price in GBP : £60.15  
Price in JPY : 10,279


That's all about how to display currency in Java, or how to format a number like integer or double to currency in Java. Remember, NumberFormat class is on java.text package and not on java.util package. I have instance when people searching for this class, thinking that by importing java.util.* they should get NumberFormat class as well. Let me know if you face any issue while formatting currency or displaying amount in multiple currency to Java clients e.g. Swing, Java FX or JSP pages.

4 comments :

UTHMx said...

Sir, how you highlight java code in blogger post? Seem nice to read. Share some magic with us.

Adarsh S said...

very useful..keep sharing this kind of magic :)

anandbhat87 said...

When i worked for the same code, I get the value as follows:
Price in JPY : ?3
Any idea how to correct this?

Javin Paul said...

@anandbhat87, could be issue with character encoding, which might not be supporting Yen symbol. Where are you running your program? Eclipse, command prompt? do you know what is the default character encoding you are using?

Post a Comment