Click here to find out more!

Newsletter sign-up
View all newsletters

Sign up for our technology specific newsletters.

Enterprise Java
Email Address:
Click here to find out more!

Make cents with BigDecimal

Write Java programs to calculate and format currency

  • Digg
  • Reddit
  • SlashDot
  • Stumble
  • del.icio.us
  • Technorati
  • dzone
To be able to write Java programs that deal with finances, you need to know about the BigDecimal class and numeric formatting. The first step to teaching you both of those topics is to first create BigDecimal objects. We will use the BigDecimal class in the java.math library to hold values. You can create a BigDecimal object in the following manner:
BigDecimal amount = new BigDecimal("1115.37");


In the above case, the String argument to the BigDecimal constructor determines the value of the object created. The value of "1115.37" might represent, for example, a monthly mortgage payment in dollars, or a checkbook balance. To display the amount, you can use the BigDecimal class's toString() method:

     System.out.println(amount.toString());


A program that creates and displays a BigDecimal amount is shown below:

import java.math.*;
public class Mortgage {
   public static void main(String[] args) {
      BigDecimal payment = new BigDecimal("1115.37");
      System.out.println(payment.toString());
   }
}


Output from the above program is:

1115.37


Formatting currency

Since we are dealing with money, it would be nice to have the amounts held by BigDecimal objects properly formatted, which for US currency would include a dollar sign and a comma as a thousands separator. (For other currencies, please see the section Currency of Other Countries below). The NumberFormat class, found in the java.text library, can create an appropriate object for US currency with the following code:

     NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US);  


Note that the Locale class, used as an argument for the getCurrencyInstance() method above, is found in the java.util library.

The NumberFormat's format() method, which we will be using next, takes a double or long primitive as an argument, so first we will turn the BigDecimal object into a double using BigDecimal's doubleValue() method:

double doublePayment = payment.doubleValue(); 


Now we use NumberFormat's format() method to create a String:

 String s = n.format(doublePayment); 


Putting these steps in a program, we then have:

import java.math.*;
import java.text.*;
import java.util.*;
public class Mortgage2 {
   public static void main(String[] args) {
      BigDecimal payment = new BigDecimal("1115.37");
      NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US); 
      double doublePayment = payment.doubleValue();
      String s = n.format(doublePayment);
      System.out.println(s);
   }
}


Output from the above program is:

,115.37


Readers should note that creating a double value involves a small loss in the value's accuracy. While the inaccuracies are too small to be seen in this article's examples, they are visible in very large amounts. Therefore, you cannot rely upon NumericFormat to produce accurate results with very large numbers (about 13 or more digits).

Currencies of other countries

In the previous example, we used Locale.US as the argument passed to the getCurrencyInstance() method to specify the currency of the country (United States) with which we'd be working. Java is not limited to working with US currency however. For example, you would use Locale.GERMANY, Locale.FRANCE, or Locale.ITALY to specify the currencies of Germany, France, and Italy, respectively. The topic of internationalization is a subject in its own right; see the Resources section for a link to more information.

  • Digg
  • Reddit
  • SlashDot
  • Stumble
  • del.icio.us
  • Technorati
  • dzone
Comments (4)
Login
Forgot your account info?

Too many typosBy Anonymous on August 19, 2009, 11:35 amMost significant digit truncated in many places.

Reply | Read entire comment

Helpful - Small typoBy Anonymous on August 7, 2009, 5:56 pmHelpful article - I think "The investor makes an additional 00.00 purchase of shares" should be "The investor makes an additional 200.00 purchase of shares"

Reply | Read entire comment

Nice one. Very helpfulBy Anonymous on June 21, 2009, 1:16 pmNice one. Very helpful

Reply | Read entire comment

Nice oneBy Anonymous on March 8, 2009, 2:53 pmNice one

Reply | Read entire comment

View all comments

Add comment
Anonymous comments subject to approval. Register here for member benefits.

Get a new challenge
Get an audio challengeGet a visual challenge
Help
Have a JavaWorld account? Log in here. Register now for a free account.
Resources
  • More JavaWorld articles by Robert Nielsen: