DecimalFormat class which is extended from NumberFormat allows you to format a number (both decimal and integer) into a beautified String. It can be used to display in reports in general. DecimalFormat also helps to parse number from String literals.
It can be used in localized application also. That is you can use it based on a particular locale. It is one of the main highlight of this class. You can format a range of numbers like integers (1234), decimal numbers (1234.56), scientific notation (1.23E4), percentages (98%), and currency amounts ($1234).
When formatting a number to a String, first you need to get an instance of the DecimalFormat. Then you can associate a pattern to that formatter. Using this format instance numbers can be formatted. The key here is learning about the pattern symbols available and how they can be used with one another.
Easiest way to learn this is by example. I have given a pretty long example source code to learn formatting. Following are detail of common pattern characters.
0 – to signify a digit
# – digit or absence of a number
. – decimal point (you should use always . signify a decimal point in pattern, but the formatted character will be based on Locale
E – separates mantissa and exponent in scientific notation
, – digits group separator
% – multiplies the number by 100 and adds a ‘%’ at the end
‘ – to use a pattern character itself in a pattern. Just a escape character!
import java.text.DecimalFormat; import java.text.NumberFormat; import java.text.ParseException; import java.util.Locale; public class DecimalFormatExample { public static void main(String args[]) { NumberFormat formatter; // parsing a negative integer from String formatter = new DecimalFormat("#,##0;(#,##0)"); try { System.out.println(formatter.parse("(1,234)")); } catch (ParseException e) { } // formatting to an integer from a decimal // with a prefix of 0s //uses default RoundingMode RoundingMode.HALF_EVEN formatter = new DecimalFormat("00000"); System.out.println(formatter.format(-123.456)); // print a example number using different formats // for the current Locale Locale currentLocale = Locale.getDefault(); System.out.println("Format based on locale " + currentLocale.getDisplayName()); double exampleNumber = -1234.56; for (int j = 0; j < 4; ++j) { switch (j) { case 0: formatter = NumberFormat.getInstance(currentLocale); break; case 1: formatter = NumberFormat.getIntegerInstance(currentLocale); break; case 2: formatter = NumberFormat.getCurrencyInstance(currentLocale); break; default: formatter = NumberFormat.getPercentInstance(currentLocale); break; } String pattern = ((DecimalFormat) formatter).toPattern(); String formatted = formatter.format(exampleNumber); System.out.print(pattern + " -> " + formatted); try { Number parsedNumber = formatter.parse(formatted); System.out.println(" -> parsed back from String to Number " + parsedNumber); } catch (ParseException e) { } } // setting an explicit + sign for a positive number // and using () for negative number formatter = new DecimalFormat("+0.0;(0.0)"); System.out.println(formatter.format(1234.5)); System.out.println(formatter.format(-1234.5)); } }
-1234 -00123 Format based on locale English (United States) #,##0.### -> -1,234.56 -> parsed back from String to Number -1234.56 #,##0 -> -1,235 -> parsed back from String to Number -1235 ¤#,##0.00;(¤#,##0.00) -> ($1,234.56) -> parsed back from String to Number -1234.56 #,##0% -> -123,456% -> parsed back from String to Number -1234.56 +1234.5 (1234.5)
Comments are closed for "Formatting Decimal Numbers".
In what way DecimalFormat and NumberFormat are different?
While surfing for some specific question I came across your site today, its been almost 2 hrs that I have been reading through it and still want to read further.
I appreciate the simplicity of language and the appropriate examples provided by you.All I can say is:
I’m loving It!!!