Table of Contents
- Creating DecimalFormat Object
- Special Pattern Characters
- Common Pattern Examples
- Formatting Numbers Using Pattern
- Creating DecimalFormat for Locale
- DecimalFormat With Locale & Pattern
- Grouping Integer Numbers
- Using DecimalFormatSymbols for Pattern
- Rounding With DecimalFormat
- Setting Min/Max Fraction or Integer Digits
- Specifying String Literals Within Pattern
When you need to format decimal numbers, such as taking three or two decimal places for a number, showing only the integer part of a number, etc. such scenarios can be tackled with java.text.DecimalFormatclass, which can help you to format numbers using your specified pattern.
The java.text.DecimalFormat class is used to format numbers using a user specified formatting. This concrete subclass of NumberFormat allows formatting decimal numbers’ String representation using predefined patterns. It has a variety of features designed to make it possible to parse and format numbers in any locale.
Let us look at some of the main features of this class explained with code snippets and samples.
Creating DecimalFormat Object
The DecimalFormat object can be created simply by using its default constructor as
DecimalFormat decimalFormat = new DecimalFormat();
However if you need to format a number you can create a DecimalFormat instance by providing the pattern as string as shown below
String pattern = "###,###.###";
DecimalFormat decimalFormat = new DecimalFormat(pattern);
The pattern parameter passed as String to the DecimalFormat constructor is the number pattern according to which the numbers would be formatted.
Special Pattern Characters
Symbols | Description |
0 | Indicates digit. If not present 0 will be still displayed. |
# | Indicates digit. If not present then nothing printed (omitted). |
. | Decimal separator which is used to separate integer part and decimal fraction part. |
– | Format the number with a negative prefix. |
, | Marks grouping separator (e.g., thousand or hundreds separator). |
E | Separates mantissa and exponent in scientific notation (meaning power of 10). |
; | Separates positive and negative sub patterns. |
% | Multiply by 100 and show as percentage. |
\u2030 | Multiply by 1000 and show as per mille value. |
¤ (\u00A4) | Currency sign, replaced by currency symbol. |
‘ | Used to quote special characters in a prefix or suffix. |
Common Pattern Examples
Input Number | Pattern | Formatted Output |
3.14159 | #.##### | 3.14159 |
3.14159 | #.### | 3.141 |
23.2 | 00.00 | 23.20 |
2.3323345 | #.##% | 233.23% |
4.25 | 00.##0 | 04.250 |
233233.45 | ###,###.##0 | 233,233.450 |
Formatting Numbers Using Pattern
The format() method of the DecimalFormat class is used to format the numbers into desired pattern. Here are the examples using format() method –
import java.text.DecimalFormat; public class DecimalFormatter { public static void main(String[] args) { double dbNum = 170180.24523D; // number to be formatted /* Basic Formatting Process */ String strPattern = "######.#####"; // desired formatting pattern DecimalFormat decimalFormat = new DecimalFormat(strPattern); // DecimalFormat String strFormattedNum = decimalFormat.format(dbNum); // now format the number System.out.println(dbNum + " -> " + strFormattedNum); // output = 170180.24523 /* More Formatting Examples */ strPattern = "######.###"; // To print full integer but only 3 decimal places decimalFormat = new DecimalFormat(strPattern); strFormattedNum = decimalFormat.format(dbNum); System.out.println(dbNum + " -> " + strFormattedNum); // output = 170180.245 strPattern = "######.000000"; // To print extra 0 in decimal value decimalFormat = new DecimalFormat(strPattern); strFormattedNum = decimalFormat.format(dbNum); System.out.println(dbNum + " -> " + strFormattedNum); // output = 170180.245230 strPattern = "#"; // To print only integer value part decimalFormat = new DecimalFormat(strPattern); strFormattedNum = decimalFormat.format(dbNum); System.out.println(dbNum + " -> " + strFormattedNum); // output = 170180 strPattern = "0000000.###"; // extra zero in integer part & 3 decimal places decimalFormat = new DecimalFormat(strPattern); strFormattedNum = decimalFormat.format(dbNum); System.out.println(dbNum + " -> " + strFormattedNum); // output = 0170180.245 strPattern = "#.##%"; // multiply by 100 and display as % with 3 decimal places decimalFormat = new DecimalFormat(strPattern); strFormattedNum = decimalFormat.format(dbNum); System.out.println(dbNum + " -> " + strFormattedNum); // output = 17018024.52% } }
The above code produces the following output:
170180.24523 -> 170180.24523
170180.24523 -> 170180.245
170180.24523 -> 170180.245230
170180.24523 -> 170180
170180.24523 -> 0170180.245
170180.24523 -> 17018024.52%
Creating DecimalFormat for Locale
You can also create DecimalFormat object for a specific Locale, other then the currently running JVM locale by creating a NumberFormat object and casting it into a DecimalFormat as shown in the below example.
import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.Locale; public class DecimalFormatWithLocale { public static void main(String[] args) { double dbNum = 170180.24523D; NumberFormat nFormat = NumberFormat.getNumberInstance(Locale.GERMANY); DecimalFormat dFormat = (DecimalFormat) nFormat; // cast NumberFormat String strFormattedNum = dFormat.format(dbNum); System.out.println(strFormattedNum + " - " + Locale.GERMANY.getDisplayName()); } }
As you can see from the output below, as per Germany locale, the output number is formatted with dot(.) as the 100s separator for integer part, while the fraction part uses the comma(,) as the separator.
170.180,245 - German (Germany)
DecimalFormat With Locale & Pattern
Here is another example of DecimaFormat for using both Locale as well as user specified pattern together while formatting a decimal number –
import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.Locale; public class DecimalFormatPatternAndLocale2 { public static void main(String[] args) { double dbNum = 170180.24523D; String strPattern = "#.#####"; NumberFormat nFormat = NumberFormat.getNumberInstance(Locale.GERMANY); DecimalFormat dFormat = (DecimalFormat) nFormat; // cast NumberFormat String strFormattedNum = dFormat.format(dbNum); System.out.print("With GERMANY Locale = " + strFormattedNum + "\n"); dFormat.applyPattern(strPattern); strFormattedNum = dFormat.format(dbNum); System.out.println("With Locale & Pattern = " + strFormattedNum); } }
The above code produces the following output:
With GERMANY Locale = 170.180,245
With Locale & Pattern = 170180,24523
Grouping Integer Numbers
You can use setGroupingSize() method of DecimalFormat to change or set the number of digits you want to group in the integer part of the number. The below example demonstrates grouping integer part
You can also use setGroupingSize() along with pattern to specify format for both integer as well as decimal part of the number –
import java.text.DecimalFormat; public class DecimalFormatGrouping { public static void main(String[] args) { double dbNum = 170180.24551D; DecimalFormat dFormat = new DecimalFormat(); dFormat.setGroupingSize(4); String strFormattedNum = dFormat.format(dbNum); System.out.println(dbNum + " GroupSize(4) = " + strFormattedNum); } }
The above code gives the following output:
170180.24551 GroupSize(4) = 17,0180.246
Using DecimalFormatSymbols for Pattern
The DecimalFormatSymbols class can also be used to change the decimal separator and the integer grouping separator characters. Here is an example using following methods of DecimalFormatSymbols class:
- setDecimalSeparator()
- setMonetaryDecimalSeparator()
- setGroupingSeparator()
- setCurrencySymbol()
import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; public class DecimalFormatAndFormatSymbols { public static void main(String[] args) { double dbNum = 170180.24551D; String strPattern = "\u00A4#,###.###"; DecimalFormatSymbols dFSymbols = new DecimalFormatSymbols(); dFSymbols.setDecimalSeparator('-'); dFSymbols.setMonetaryDecimalSeparator('-'); dFSymbols.setGroupingSeparator(':'); dFSymbols.setCurrencySymbol("$"); DecimalFormat dFormat = new DecimalFormat(strPattern, dFSymbols); String strFormattedNum = dFormat.format(dbNum); System.out.println(strFormattedNum); } }
The above code gives the following output:
$170:180-246
Rounding With DecimalFormat
The DecimalFormat class also comes handy with setRoundingMode() method for rounding the decimal numbers. Either you can create a separate instance of the RoundingMode class and pass as parameter to this method or you can directly pass the desired rounding mode using the static fields of RoundingMode class as shown in below example –
Input Number | UP | DOWN | CEILING | FLOOR | HALF_UP | HALF_DOWN | HALF_EVEN |
---|---|---|---|---|---|---|---|
5.5 | 6 | 5 | 6 | 5 | 6 | 5 | 6 |
2.5 | 3 | 2 | 3 | 2 | 3 | 2 | 2 |
1.6 | 2 | 1 | 2 | 1 | 2 | 2 | 2 |
1.1 | 2 | 1 | 2 | 1 | 1 | 1 | 1 |
1.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
-1.0 | -1 | -1 | -1 | -1 | -1 | -1 | -1 |
-1.1 | -2 | -1 | -1 | -2 | -1 | -1 | -1 |
-1.6 | -2 | -1 | -1 | -2 | -2 | -2 | -2 |
-2.5 | -3 | -2 | -2 | -3 | -3 | -2 | -2 |
-5.5 | -6 | -5 | -5 | -6 | -6 | -5 | -6 |
import java.math.RoundingMode; import java.text.DecimalFormat; public class DecimalFormatRounding { public static void main(String[] args) { double dbNum = 170180.24551D; DecimalFormat dFormat = new DecimalFormat(); dFormat.setRoundingMode(RoundingMode.HALF_UP); String strFormattedNum = dFormat.format(dbNum); System.out.println(dbNum + " Rounded-UP " + strFormattedNum); dFormat.setRoundingMode(RoundingMode.DOWN); strFormattedNum = dFormat.format(dbNum); System.out.println(dbNum + " Rounded-DOWN " + strFormattedNum); } }
The above code gives the following output:
170180.24551 Rounded-UP 170,180.246
170180.24551 Rounded-DOWN 170,180.245
Setting Min/Max Fraction or Integer Digits
Probably one of the easiest way to set the minimum and maximum digits for both fraction as well as the Integer digits is by using the following methods provided in the DecimalFormat class as shown below –
- setMaximumFractionDigits(int newValue)
- setMaximumIntegerDigits(int newValue)
- setMinimumFractionDigits(int newValue)
- setMinimumIntegerDigits(int newValue)
import java.text.DecimalFormat; public class DecimalFormatSetMinMaxDigit { public static void main(String[] args) { double dbNum = 170180.24551D; DecimalFormat deciFormat = new DecimalFormat(); System.out.println("Original Num: " + dbNum); String strFormattedNum = deciFormat.format(dbNum); System.out.println("JVM Locale Formatted Num: " + strFormattedNum); String strPattern = "#,####.####"; deciFormat.applyPattern(strPattern); strFormattedNum = deciFormat.format(dbNum); System.out.println("Pattern Formatted Num: " + strFormattedNum); deciFormat.setMinimumFractionDigits(1); deciFormat.setMaximumFractionDigits(4); strFormattedNum = deciFormat.format(dbNum); System.out.println("With Min/Max Fraction Digits: " + strFormattedNum); deciFormat.setMinimumIntegerDigits(1); deciFormat.setMaximumIntegerDigits(3); strFormattedNum = deciFormat.format(dbNum); System.out.println("With Min/Max Integer & Fraction Digits: " + strFormattedNum); } }
The above code gives the following output:
Original Num: 170180.24551
JVM Locale Formatted Num: 170,180.246
Pattern Formatted Num: 17,0180.2455
With Min/Max Fraction Digits: 17,0180.2455
With Min/Max Integer & Fraction Digits: 180.2455
Specifying String Literals Within Pattern
Another feature of the DecimalFormat class pattern is that it allows you to specify your own custom string literals within your pattern. Here is an example –
import java.text.DecimalFormat; public class DecimalFormatAndStringLiteral { public static void main(String[] args) { double dbNum = 170180.24551D; String strPattern = "My formatted number is #,###.###"; DecimalFormat deciFormat = new DecimalFormat(strPattern); String strFormattedNum = deciFormat.format(dbNum); System.out.println(strFormattedNum); } }
The above code produces the following output:
My formatted number is 170,180.246