Hai cách định dạng
Java định dạng chuỗi từ một mẫu (template) chứa các specifier định dạng (các chỗ giữ chỗ %) cùng với các giá trị cần điền vào. Có hai cách gọi, và chúng dùng cú pháp giống hệt nhau:
String.format(template, values...)trả về mộtStringmới.System.out.printf(template, values...)in kết quả ra trực tiếp.
Cả hai cho ra cùng một văn bản. String.format trả nó lại để bạn lưu; printf ghi nó ra console. Để ý %n ở cuối mẫu printf: đó là ký tự xuống dòng không phụ thuộc nền tảng (nên dùng nó thay cho \n trong chuỗi định dạng).
Các specifier thông dụng
Mỗi specifier bắt đầu bằng % và kết thúc bằng một chữ cái cho biết loại giá trị cần nhận:
Ba specifier dùng hằng ngày là %s (mọi giá trị, thông qua toString của nó), %d (số nguyên) và %f (số thập phân). Dùng %% để in ra một dấu phần trăm. Truyền sai kiểu, ví dụ một String cho %d, sẽ ném ra IllegalFormatConversionException lúc chạy.
Kiểm soát số chữ số thập phân
%f mặc định hiển thị sáu chữ số thập phân, hiếm khi đó là điều bạn muốn. Đặt .N trước f để cố định độ chính xác (giá trị được làm tròn):
Thêm cờ dấu phẩy để có dấu phân cách nhóm cho các số lớn:
Độ rộng và đệm
Một số đặt giữa % và chữ cái chỉ kiểu sẽ quy định độ rộng tối thiểu của trường, đệm bằng khoảng trắng để các cột thẳng hàng. Dấu - ở đầu căn trái; số 0 ở đầu đệm số bằng các chữ số 0:
Đây là thứ giúp các bảng đã định dạng và báo cáo căn thẳng hàng dễ đọc, nhất là khi bạn in từng hàng bên trong một vòng lặp for:
%-8s căn trái tên trong một cột rộng 8, còn %5d căn phải điểm số trong một cột rộng 5, nên các con số thẳng hàng bất kể có bao nhiêu chữ số.
Thứ tự đối số
Mặc định các specifier lấy giá trị lần lượt từ trái sang phải. Bạn có thể lặp lại hoặc đổi thứ tự một giá trị bằng N$ (chỉ số bắt đầu từ 1), tiện khi cùng một giá trị xuất hiện hai lần:
%1$s trỏ đến đối số thứ nhất ở cả hai lần, nên echo được in hai lần.
Phương thức formatted()
Từ Java 15, mọi chuỗi đều có phương thức formatted: cùng bộ máy với String.format, chỉ là viết thành lời gọi phương thức trên chính mẫu:
Nó đặc biệt hợp với text block (chuỗi nhiều dòng đặt trong ba dấu nháy) khi tạo đầu ra đã định dạng có kích thước lớn.
Khi nào không nên dùng String.format
Với những lần nối đơn giản, nối chuỗi thông thường bằng + rõ ràng và nhanh hơn:
String greeting = "Hi, " + name + "!"; // simpler than String.format here
Hãy dùng String.format / printf khi bạn cần định dạng thật sự: số chữ số thập phân cố định, đệm, căn lề, phân nhóm, chứ không chỉ để ghép vài giá trị với nhau.
Tiếp theo: toán tử
Định dạng biến giá trị thành văn bản. Để tính ra các giá trị đó ngay từ đầu, bạn cần các toán tử của Java: số học, so sánh và logic. Đó là nội dung của trang tiếp theo.
Câu hỏi thường gặp
Định dạng chuỗi trong Java như thế nào?
Dùng String.format(template, values...), phương thức này trả về một chuỗi mới, trong đó mỗi specifier định dạng được thay bằng một giá trị: String.format("%s is %d", name, age). Để in trực tiếp thay vì tạo chuỗi, dùng System.out.printf(...) với cùng mẫu đó. Từ Java 15 bạn cũng có thể gọi template.formatted(values...).
Định dạng số với hai chữ số thập phân trong Java như thế nào?
Dùng specifier %.2f: String.format("%.2f", 3.14159) cho ra "3.14". Số sau dấu chấm là số chữ số thập phân cần giữ, và giá trị được làm tròn. Để có dấu phân cách hàng nghìn, thêm cờ dấu phẩy: %,.2f cho ra "1,234.57".
String.format và printf trong Java khác nhau thế nào?
Chúng dùng chính xác cùng các specifier định dạng. String.format(...) trả về văn bản đã định dạng dưới dạng một String mới mà bạn có thể lưu lại hoặc truyền đi. System.out.printf(...) ghi văn bản đã định dạng thẳng ra đầu ra chuẩn và không trả về gì hữu ích. Dùng String.format để tạo chuỗi, printf để in chuỗi.