Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

NumberFormat Class ใน Java (java.text)

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)