NumberFormat และ printf
จัดรูปแบบตัวเลขสำหรับการแสดงผลด้วย NumberFormat, DecimalFormat และรูปแบบ printf
NumberFormat และ printf เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
NumberFormat และ printf
Java มีส่วนติดต่อการเขียนโปรแกรมสำหรับจัดรูปแบบตัวเลขที่หลากหลาย ได้แก่ NumberFormat สำหรับสกุลเงินและเปอร์เซ็นต์ตามภูมิภาค DecimalFormat สำหรับรูปแบบที่กำหนดเอง และ printf/String.format สำหรับการจัดรูปแบบสไตล์ภาษา C
พื้นฐานของ String.format
String.format() ใช้ตัวระบุรูปแบบเพื่อสร้างสตริง ตัวระบุที่ใช้บ่อย ได้แก่ %d (จำนวนเต็ม), %f (เลขทศนิยม), %s (สตริง) และ %n (ขึ้นบรรทัดใหม่)
String name = "Alice";
int score = 95;
double avg = 87.567;
String msg = String.format(
"Player: %s | Score: %d | Average: %.2f", name, score, avg);
System.out.println(msg);
// Player: Alice | Score: 95 | Average: 87.57
// printf is equivalent — formats directly to output
System.out.printf("%-10s %5d %8.2f%n", name, score, avg);
// Alice 95 87.57ความกว้าง การเติม และการจัดแนว
ตัวระบุรูปแบบรองรับการกำหนดความกว้างและธงการจัดแนว: %10d (จัดชิดขวาในพื้นที่ 10 อักขระ), %-10d (จัดชิดซ้าย) และ %010d (เติมด้วยเลขศูนย์)
// Table layout with padding
System.out.printf("%-20s %10s %10s%n", "Product", "Qty", "Price");
System.out.printf("%-20s %10d %10.2f%n", "Java Book", 3, 49.99);
System.out.printf("%-20s %10d %10.2f%n", "USB Hub", 1, 24.95);
System.out.printf("%-20s %10d %10.2f%n", "Mechanical Keyboard", 2, 129.00);
// Zero-padding for order IDs
int orderId = 42;
System.out.printf("Order: ORD-%08d%n", orderId); // Order: ORD-00000042NumberFormat สำหรับสกุลเงิน
NumberFormat.getCurrencyInstance(Locale) จัดรูปแบบตัวเลขเป็นสตริงสกุลเงิน โดยใช้สัญลักษณ์ ตัวคั่น และจำนวนตำแหน่งทศนิยมที่ถูกต้องตามภูมิภาคที่ระบุ
import java.text.*;
import java.util.*;
NumberFormat usd = NumberFormat.getCurrencyInstance(Locale.US);
NumberFormat eur = NumberFormat.getCurrencyInstance(Locale.GERMANY);
NumberFormat gbp = NumberFormat.getCurrencyInstance(Locale.UK);
double amount = 1234567.89;
System.out.println(usd.format(amount)); // $1,234,567.89
System.out.println(eur.format(amount)); // 1.234.567,89 EUR
System.out.println(gbp.format(amount)); // GBP1,234,567.89NumberFormat สำหรับเปอร์เซ็นต์
NumberFormat.getPercentInstance() จัดรูปแบบเลขทศนิยมเป็นสตริงเปอร์เซ็นต์ โดยส่งค่าในช่วง 0 ถึง 1
import java.text.*;
import java.util.*;
NumberFormat pct = NumberFormat.getPercentInstance(Locale.US);
pct.setMaximumFractionDigits(1);
System.out.println(pct.format(0.75)); // 75%
System.out.println(pct.format(0.1234)); // 12.3%
System.out.println(pct.format(1.0)); // 100%
// Conversion rate in e-commerce
double convRate = 3_456.0 / 42_000.0;
System.out.println("Conversion: " + pct.format(convRate)); // 8.2%DecimalFormat พร้อมรูปแบบที่กำหนดเอง
DecimalFormat ใช้สตริงรูปแบบ โดย # หมายถึงตัวเลขที่ไม่จำเป็นต้องมี และ 0 หมายถึงตัวเลขที่ต้องมี
import java.text.*;
DecimalFormat df1 = new DecimalFormat("#,###.00");
System.out.println(df1.format(1234567.5)); // 1,234,567.50
DecimalFormat df2 = new DecimalFormat("000.0");
System.out.println(df2.format(7.5)); // 007.5
DecimalFormat df3 = new DecimalFormat("0.00E0");
System.out.println(df3.format(0.000123)); // 1.23E-4
// Scientific notation for large values
DecimalFormat sci = new DecimalFormat("0.000E0");
System.out.println(sci.format(123456789)); // 1.235E8การแยกวิเคราะห์ตัวเลขจากสตริง
NumberFormat ยังสามารถแยกวิเคราะห์สตริงที่จัดรูปแบบตามภูมิภาคกลับเป็นตัวเลขได้ ความสามารถนี้จำเป็นอย่างยิ่งสำหรับการอ่านข้อมูลนำเข้าของผู้ใช้ในภูมิภาคต่าง ๆ
import java.text.*;
import java.util.*;
NumberFormat nf = NumberFormat.getInstance(Locale.GERMANY);
try {
// German uses comma as decimal separator
Number parsed = nf.parse("1.234,56");
System.out.println(parsed.doubleValue()); // 1234.56
// Parse US currency string
NumberFormat usd = NumberFormat.getCurrencyInstance(Locale.US);
Number amount = usd.parse("$1,234.56");
System.out.println(amount.doubleValue()); // 1234.56
} catch (ParseException e) {
System.out.println("Parse error: " + e.getMessage());
}สตริงที่จัดรูปแบบ (Java 15 ขึ้นไป)
Java 15 ขึ้นไปเพิ่ม String.formatted() ซึ่งเป็นทางเลือกแบบเมธอดอินสแตนซ์แทน String.format() และมีประโยชน์ในการต่อเมธอดกับสายการประมวลผลของ stream
record Product(String name, double price, int stock) {}
var products = List.of(
new Product("Laptop", 999.0, 5),
new Product("Mouse", 29.99, 42),
new Product("Monitor", 349.0, 8)
);
products.stream()
.map(p -> "%-15s $%8.2f [stock: %d]"
.formatted(p.name(), p.price(), p.stock()))
.forEach(System.out::println);
// Laptop $ 999.00 [stock: 5]
// Mouse $ 29.99 [stock: 42]
// Monitor $ 349.00 [stock: 8]การจัดกลุ่มตัวเลขและภูมิภาค
การจัดกลุ่มตัวเลข (ตัวคั่นหลักพัน) แตกต่างกันไปตามภูมิภาค ควรใช้ NumberFormat สำหรับผลลัพธ์ที่แสดงต่อผู้ใช้เสมอ แทนการกำหนดเครื่องหมายจุลภาคตายตัว
import java.text.*;
import java.util.*;
long users = 1_234_567;
for (Locale locale : new Locale[]{Locale.US, Locale.FRANCE, Locale.GERMANY}) {
NumberFormat nf = NumberFormat.getIntegerInstance(locale);
System.out.printf("%-10s: %s%n", locale, nf.format(users));
}
// en_US : 1,234,567
// fr_FR : 1 234 567
// de_DE : 1.234.567ตัวอย่างการสร้างใบแจ้งหนี้
นำทุกอย่างมาประกอบกัน: การสร้างใบแจ้งหนี้ที่จัดรูปแบบแล้ว พร้อมสกุลเงิน เปอร์เซ็นต์ และการจัดแนวตารางอย่างถูกต้อง
import java.text.*;
import java.util.*;
NumberFormat curr = NumberFormat.getCurrencyInstance(Locale.US);
NumberFormat pct = NumberFormat.getPercentInstance();
pct.setMaximumFractionDigits(0);
double subtotal = 1259.97;
double discount = 0.10;
double discountAmt = subtotal * discount;
double taxRate = 0.08;
double taxAmt = (subtotal - discountAmt) * taxRate;
double total = subtotal - discountAmt + taxAmt;
System.out.println("=== INVOICE ===");
System.out.printf("%-20s %15s%n", "Subtotal", curr.format(subtotal));
System.out.printf("%-20s %15s%n", "Discount (" + pct.format(discount) + ")",
"-" + curr.format(discountAmt));
System.out.printf("%-20s %15s%n", "Tax (" + pct.format(taxRate) + ")",
curr.format(taxAmt));
System.out.printf("%-20s %15s%n", "TOTAL", curr.format(total));ข้อผิดพลาดที่พบบ่อย
โปรดระวังข้อผิดพลาดในการจัดรูปแบบที่พบบ่อยเหล่านี้:
- การใช้
String.formatกับตัวระบุชนิดข้อมูลไม่ถูกต้อง (เช่น ใช้%dกับdouble) จะทำให้เกิดIllegalFormatConversionException - ตัวจัดรูปแบบเฉพาะภูมิภาคอาจให้ผลลัพธ์แตกต่างกันในเครื่องแต่ละเครื่อง
- อินสแตนซ์ของ NumberFormat ไม่ปลอดภัยต่อการทำงานหลายเธรด — ให้สร้างหนึ่งอินสแตนซ์ต่อเธรด หรือใช้
ThreadLocal
// Wrong specifier
try {
String.format("%d", 3.14); // IllegalFormatConversionException
} catch (java.util.IllegalFormatConversionException e) {
System.out.println("Wrong format specifier!");
}
// Thread-safe pattern using ThreadLocal
ThreadLocal<NumberFormat> localFmt = ThreadLocal
.withInitial(() -> NumberFormat.getCurrencyInstance(Locale.US));
// each thread gets its own NumberFormat instanceตรวจสอบอย่างรวดเร็ว
String.format("%08.2f", 3.5) ให้ผลลัพธ์เป็นอะไร
ทบทวน: NumberFormat และ printf
ประเด็นสำคัญ:
- String.format / printf ใช้ตัวระบุรูปแบบ: %d, %f, %s, %.2f
- ธงกำหนดความกว้างและการจัดแนว: %10d (ชิดขวา), %-10d (ชิดซ้าย), %010d (เติมด้วยเลขศูนย์)
- NumberFormat.getCurrencyInstance() สำหรับแสดงสกุลเงินตามภูมิภาค
- NumberFormat.getPercentInstance() สำหรับแสดงเปอร์เซ็นต์
- DecimalFormat ใช้รูปแบบตัวเลข # (ไม่จำเป็น) และ 0 (จำเป็น)
- NumberFormat ยังสามารถแยกวิเคราะห์สตริงที่จัดรูปแบบตามภูมิภาคกลับเป็นตัวเลขได้
คำถามที่พบบ่อย
บทเรียน “NumberFormat และ printf” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “NumberFormat และ printf” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “NumberFormat และ printf”
จัดรูปแบบตัวเลขสำหรับการแสดงผลด้วย NumberFormat, DecimalFormat และรูปแบบ printf คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “NumberFormat และ printf” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐานสำคัญของคลาส Math
- การคำนวณจำนวนเต็มและโอเวอร์โฟลว์
- BigDecimal สำหรับการคำนวณทางการเงิน
- NumberFormat และ printf