Menu

Định dạng chuỗi trong Java: String.format, printf và specifier

Cách định dạng chuỗi trong Java với String.format và printf: các specifier định dạng cho số, đệm khoảng trắng, số chữ số thập phân, text block và phương thức formatted.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

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ột String mớ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.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu