Complete Java DecimalStyle class tutorial covering all methods with examples. Learn about number formatting in Java.
Last modified: April 16, 2025
The java.time.format.DecimalStyle class provides symbols and styles for formatting and parsing numbers. It defines decimal digits, signs, and other symbols used in number representation. DecimalStyle is immutable and thread-safe.
DecimalStyle is used by number formatters like DecimalFormat and date-time formatters. It supports locale-specific symbols while maintaining consistency. The class handles digits, decimal separators, and other formatting elements.
DecimalStyle provides methods to get and customize number symbols. Key operations include getting default styles, modifying symbols, and checking validity. The class works with both standard and localized number formats.
public final class DecimalStyle { public static final DecimalStyle STANDARD; public static DecimalStyle ofDefaultLocale(); public static DecimalStyle of(Locale locale); public char getZeroDigit(); public char getDecimalSeparator(); public char getNegativeSign(); public char getPositiveSign(); public DecimalStyle withZeroDigit(char zeroDigit); public DecimalStyle withDecimalSeparator(char decimalSeparator); }
The code above shows key methods provided by DecimalStyle. These methods allow accessing and modifying number formatting symbols. The class provides both standard and locale-specific implementations.
DecimalStyle objects can be obtained in several ways. The standard instance uses ASCII digits and symbols. Locale-specific instances adapt to regional conventions.
Main.java
package com.zetcode;
import java.time.format.DecimalStyle; import java.util.Locale;
public class Main {
public static void main(String[] args) {
// Standard style (ASCII digits)
DecimalStyle standard = DecimalStyle.STANDARD;
System.out.println("Standard zero digit: " + standard.getZeroDigit());
// Default locale style
DecimalStyle defaultLocale = DecimalStyle.ofDefaultLocale();
System.out.println("Default locale decimal separator: " +
defaultLocale.getDecimalSeparator());
// Specific locale style
DecimalStyle french = DecimalStyle.of(Locale.FRENCH);
System.out.println("French decimal separator: " +
french.getDecimalSeparator());
}
}
This example demonstrates different ways to get DecimalStyle instances. The output shows how symbols vary between standard and locale-specific styles. The French locale typically uses comma as decimal separator.
A DecimalStyle can be queried for its formatting symbols. These include digits, signs, and separators. The symbols define how numbers are formatted and parsed.
Main.java
package com.zetcode;
import java.time.format.DecimalStyle;
public class Main {
public static void main(String[] args) {
DecimalStyle style = DecimalStyle.ofDefaultLocale();
// Get zero digit character
char zero = style.getZeroDigit();
System.out.println("Zero digit: " + zero);
// Get decimal separator
char separator = style.getDecimalSeparator();
System.out.println("Decimal separator: " + separator);
// Get negative sign
char negative = style.getNegativeSign();
System.out.println("Negative sign: " + negative);
// Get positive sign
char positive = style.getPositiveSign();
System.out.println("Positive sign: " + positive);
}
}
This example shows how to access various symbols from a DecimalStyle. The symbols are locale-dependent and affect number formatting. Most locales use ‘-’ for negative and ‘+’ for positive signs.
DecimalStyle supports creating modified instances with custom symbols. The with methods return new instances with changed symbols. Original instance remains unchanged.
Main.java
package com.zetcode;
import java.time.format.DecimalStyle;
public class Main {
public static void main(String[] args) {
DecimalStyle standard = DecimalStyle.STANDARD;
// Create style with custom zero digit
DecimalStyle customZero = standard.withZeroDigit('〇');
System.out.println("Custom zero: " + customZero.getZeroDigit());
// Create style with custom separator
DecimalStyle customSep = standard.withDecimalSeparator('|');
System.out.println("Custom separator: " + customSep.getDecimalSeparator());
// Chain modifications
DecimalStyle fullCustom = standard.withZeroDigit('A')
.withDecimalSeparator('@')
.withNegativeSign('~');
System.out.println("Fully custom style: " +
fullCustom.getZeroDigit() + " " +
fullCustom.getDecimalSeparator() + " " +
fullCustom.getNegativeSign());
}
}
This example demonstrates creating custom DecimalStyle instances. Each with method returns a new instance. The original STANDARD instance remains unchanged due to immutability.
DecimalStyle can be used with number formatters to customize formatting. While typically used internally, we can adapt formatters to use custom styles.
Main.java
package com.zetcode;
import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.time.format.DecimalStyle; import java.util.Locale;
public class Main {
public static void main(String[] args) {
DecimalStyle style = DecimalStyle.of(Locale.GERMAN);
// Create DecimalFormatSymbols from DecimalStyle
DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.GERMAN);
symbols.setZeroDigit(style.getZeroDigit());
symbols.setDecimalSeparator(style.getDecimalSeparator());
symbols.setMinusSign(style.getNegativeSign());
// Create formatter with custom symbols
DecimalFormat format = new DecimalFormat("#,##0.00", symbols);
String formatted = format.format(-1234.56);
System.out.println("Formatted number: " + formatted);
}
}
This example shows how to adapt a DecimalFormat to use symbols from DecimalStyle. The German locale typically uses comma as decimal separator. The formatted output reflects the locale’s conventions.
DecimalStyle is used internally by date-time formatters for number handling. We can examine how it affects date and time formatting patterns.
Main.java
package com.zetcode;
import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.time.format.DecimalStyle; import java.util.Locale;
public class Main {
public static void main(String[] args) {
LocalTime time = LocalTime.of(9, 5, 30);
// Standard formatting
DateTimeFormatter standardFmt = DateTimeFormatter.ofPattern("hh:mm:ss");
System.out.println("Standard format: " + standardFmt.format(time));
// With Arabic digits
DecimalStyle arabicStyle = DecimalStyle.STANDARD.withZeroDigit('٠');
DateTimeFormatter arabicFmt = standardFmt.withDecimalStyle(arabicStyle);
System.out.println("Arabic digits: " + arabicFmt.format(time));
}
}
This example demonstrates DecimalStyle’s effect on date-time formatting. The second formatter uses Eastern Arabic numerals. The same time is displayed with different digit characters.
When creating custom DecimalStyle instances, symbol validation is important. Invalid symbols can cause formatting and parsing issues.
Main.java
package com.zetcode;
import java.time.format.DecimalStyle;
public class Main {
public static void main(String[] args) {
try {
// Valid zero digit
DecimalStyle valid = DecimalStyle.STANDARD.withZeroDigit('A');
System.out.println("Valid zero digit: " + valid.getZeroDigit());
// Invalid zero digit (non-digit character)
DecimalStyle invalid = DecimalStyle.STANDARD.withZeroDigit('!');
System.out.println("This won't be printed");
} catch (IllegalArgumentException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
This example shows symbol validation in DecimalStyle. While the API doesn’t explicitly validate in all cases, using inappropriate symbols may cause issues. The zero digit should be a valid digit character.
Java DecimalStyle Class Documentation
In this article, we’ve covered the essential methods and features of the Java DecimalStyle class. Understanding these concepts is crucial for number formatting in Java applications.
My name is Jan Bodnar, and I am a dedicated programmer with many years of experience in the field. I began writing programming articles in 2007 and have since authored over 1,400 articles and eight e-books. With more than eight years of teaching experience, I am committed to sharing my knowledge and helping others master programming concepts.
List all Java tutorials.