NumberFormat เป็น abstract base class สำหรับ format และ parse ตัวเลขตาม Locale ใช้สำหรับแสดงผลตัวเลข สกุลเงิน เปอร์เซ็นต์ ให้เหมาะกับภูมิภาค/ภาษาต่างๆ
Factory Methods หลัก
| เมธอด | คืนค่า | ใช้สำหรับ |
|---|---|---|
getInstance() |
NumberFormat | General number formatting (default locale) |
getInstance(Locale locale) |
NumberFormat | General number formatting (specified locale) |
getNumberInstance() |
NumberFormat | ตัวเลขทั่วไป (เหมือน getInstance) |
getCurrencyInstance() |
NumberFormat | สกุลเงิน (currency) |
getCurrencyInstance(Locale locale) |
NumberFormat | สกุลเงินตาม locale |
getPercentInstance() |
NumberFormat | เปอร์เซ็นต์ |
getCompactNumberInstance() |
NumberFormat | Compact notation (1.2K, 3.5M) - Java 12+ |
เมธอดสำคัญ
| เมธอด | คำอธิบาย |
|---|---|
String format(double number) |
Format double → String |
String format(long number) |
Format long → String |
StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) |
Format append to StringBuffer |
Number parse(String source) |
Parse String → Number (อาจโยน ParseException) |
Number parse(String source, ParsePosition parsePosition) |
Parse with position tracking |
void setMinimumFractionDigits(int) |
ตั้งค่าตำแหน่งทศนิยมขั้นต่ำ |
void setMaximumFractionDigits(int) |
ตั้งค่าตำแหน่งทศนิยมสูงสุด |
void setGroupingUsed(boolean) |
เปิด/ปิด grouping separator (เช่น 1,000,000) |
void setRoundingMode(RoundingMode) |
ตั้งค่า rounding mode (Java 8+) |
ตัวอย่างที่ 1: Currency Formatting
import java.text.NumberFormat;
import java.util.Locale;
public class Demo {
public static void main(String[] args) {
// France - Euro
NumberFormat n = NumberFormat.getCurrencyInstance(Locale.FRANCE);
double points = 2.15;
double totalPoints = points * 1000;
System.out.println(n.format(points)); // 2,15 €
System.out.println(n.format(totalPoints)); // 2 150,00 €
// US - Dollar
NumberFormat us = NumberFormat.getCurrencyInstance(Locale.US);
System.out.println(us.format(1234.56)); // $1,234.56
// Thailand - Baht
NumberFormat th = NumberFormat.getCurrencyInstance(new Locale("th", "TH"));
System.out.println(th.format(1234.56)); // ฿1,234.56
// Japan - Yen (ไม่มีทศนิยม)
NumberFormat jp = NumberFormat.getCurrencyInstance(Locale.JAPAN);
System.out.println(jp.format(1234.56)); // ¥1,235
}
}
Output
2,15 € 2 150,00 € $1,234.56 ฿1,234.56 ¥1,235
ตัวอย่างที่ 2: Number Formatting ตาม Locale
import java.text.NumberFormat;
import java.util.Locale;
public class Demo {
public static void main(String[] args) {
Locale enLocale = new Locale("en", "US"); // English US
Locale daLocale = new Locale("da", "DK"); // Danish Denmark
Locale deLocale = new Locale("de", "DE"); // German Germany
Locale thLocale = new Locale("th", "TH"); // Thai Thailand
double value = 1234567.89;
NumberFormat nf;
nf = NumberFormat.getInstance(enLocale);
System.out.println("US: " + nf.format(value)); // 1,234,567.89
nf = NumberFormat.getInstance(daLocale);
System.out.println("Denmark: " + nf.format(value)); // 1.234.567,89
nf = NumberFormat.getInstance(deLocale);
System.out.println("Germany: " + nf.format(value)); // 1.234.567,89
nf = NumberFormat.getInstance(thLocale);
System.out.println("Thailand: " + nf.format(value)); // 1,234,567.89
// Percent
NumberFormat pf = NumberFormat.getPercentInstance();
pf.setMinimumFractionDigits(2);
System.out.println("Percent: " + pf.format(0.12345)); // 12.35%
}
}
Output
US: 1,234,567.89 Denmark: 1.234.567,89 Germany: 1.234.567,89 Thailand: 1,234,567.89 Percent: 12.35%
ตัวอย่างที่ 3: Parsing (String → Number)
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;
public class ParseDemo {
public static void main(String[] args) {
NumberFormat nf = NumberFormat.getInstance(Locale.US);
try {
Number num = nf.parse("1,234.56");
System.out.println("Parsed: " + num); // 1234.56
System.out.println("Double: " + num.doubleValue()); // 1234.56
System.out.println("Long: " + num.longValue()); // 1234
} catch (ParseException e) {
e.printStackTrace();
}
// Parse with ParsePosition (lenient)
NumberFormat nf2 = NumberFormat.getInstance();
nf2.setParseIntegerOnly(true);
java.text.ParsePosition pos = new java.text.ParsePosition(0);
Number num2 = nf2.parse("1234.56", pos);
System.out.println("Integer only: " + num2); // 1234
System.out.println("Parse position: " + pos.getIndex()); // 4
}
}
DecimalFormat (Subclass สำคัญ)
สำหรับควบคุมรูปแบบรายละเอียด ใช้ DecimalFormat (subclass ของ NumberFormat):
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;
public class DecimalFormatDemo {
public static void main(String[] args) {
// Custom pattern
DecimalFormat df = new DecimalFormat("#,##0.00");
System.out.println(df.format(1234.5)); // 1,234.50
System.out.println(df.format(1234.567)); // 1,234.57
// Custom symbols (Thai digits)
DecimalFormatSymbols thaiSymbols = new DecimalFormatSymbols(new Locale("th", "TH"));
// thaiSymbols.setZeroDigit('๐'); // Thai digits ๐-๙
DecimalFormat thaiDf = new DecimalFormat("#,##0.00", thaiSymbols);
System.out.println(thaiDf.format(1234.56)); // 1,234.56 (ใช้ Western digits ถ้าไม่ set)
// Scientific notation
DecimalFormat sci = new DecimalFormat("0.###E0");
System.out.println(sci.format(123456)); // 1.235E5
// Percentage with custom pattern
DecimalFormat pct = new DecimalFormat("#.##%");
System.out.println(pct.format(0.1234)); // 12.34%
}
}
Best Practices
- ใช้
Localeให้ชัดเจนเสมอ ไม่ควรพึ่ง default locale - สำหรับ financial calculations ใช้
BigDecimal+NumberFormatสำหรับ display เท่านั้น - Thread-safety: NumberFormat ไม่ใช่ thread-safe - สร้าง instance ใหม่ต่อ thread หรือใช้ ThreadLocal
- Java 12+: ใช้
getCompactNumberInstance()สำหรับ short format (1.2K, 5.3M)