44.1 NumberFormat Basics

NumberFormat provides locale-aware formatting for numbers, currencies, and percentages.


44.1.1 Basic Number Formatting

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

NumberFormat nf = NumberFormat.getInstance(Locale.US);
String s = nf.format(1234567.89); // "1,234,567.89"

NumberFormat nfDE = NumberFormat.getInstance(Locale.GERMANY);
String sDE = nfDE.format(1234567.89); // "1.234.567,89"

44.1.2 Currency Formatting

NumberFormat currency = NumberFormat.getCurrencyInstance(Locale.US);
String usd = currency.format(1234.56); // "$1,234.56"

NumberFormat currencyEU = NumberFormat.getCurrencyInstance(Locale.FRANCE);
String eur = currencyEU.format(1234.56); // "1 234,56 €"

44.1.3 Percent Formatting

NumberFormat percent = NumberFormat.getPercentInstance(Locale.US);
String pct = percent.format(0.1234); // "12%" (default rounds)

percent.setMaximumFractionDigits(2);
String pct2 = percent.format(0.1234); // "12.34%"

44.1.4 Parsing

NumberFormat nf = NumberFormat.getInstance(Locale.US);
try {
  Number num = nf.parse("1,234.56");
  double d = num.doubleValue(); // 1234.56
} catch (java.text.ParseException e) {
  // handle
}

44.1.5 Thread Safety

NumberFormat instances are NOT thread-safe. Use ThreadLocal or create per-thread instances:

ThreadLocal<NumberFormat> formatters = ThreadLocal.withInitial(
  () -> NumberFormat.getCurrencyInstance(Locale.US)
);