Tất tần tật về Printf trong Java
Nhập xuất là nhu cầu bắt buộc của hầu hết mọi ngôn ngữ lập trình nói chung. Nó là những thao tác cơ bản và là câu lệnh khởi sự cho quá trình nhập môn được bắt đầu. Trong Java bấy lâu nay, đa phần chúng ta tiếp xúc và làm việc nhiều với hai câu lệnh xuất cơ bản là print
và println
.
Nhưng trên thực tế, mấy ai biết rằng Java còn hỗ trợ thêm cả phương phức PRINTF
, trông có vẻ giống người hàng xóm C
nhưng tính năng mà Java đem lại với PRINTF
là một làn gió mới.
1. Printf trong Java có tác dụng gì? Được sử dụng khi nào?
PRINTF
trong Java được xem như là bản nâng cấp của hai người anh em Print và Println. Trong khi Print và Println chỉ làm một nhiệm vụ duy nhất là in ra màn hình, PRINTF
thì lại khác, vừa in được ra màn hình, vừa định dạng được những thứ mà nó đã in ra – từ chuỗi đến số, ngày giờ và cả đối tượng. Wow, lợi hại chưa!
Thật hợp lý khi Java bổ sung thêm PRINTF
với những tính năng mới đầy tiện ích như vậy. Lập trình viên không cần phải loay hoay sử dụng thêm các hàm hay bất cứ thư viện nào khác cũng có thể in ra màn hình theo định dạng mà mình mong muốn, cái mà Print và Println không làm được.
Nói đến đây, chúng ta chỉ cần hiểu ngắn gọn là PRINTF
giúp việc in ra màn hình tiện lợi hơn theo một định dạng đã quy ước nào đó. Nó giúp việc code và xử lý trở nên đơn giản và linh hoạt hơn.
2. So sánh printf với println, print
Vậy, tới đây Java có tới ba cách in ra màn hình thì nên chọn cái nào trong trường hợp nào cho phù hợp. Để làm rõ điều này, chúng ta cùng điểm qua xem 3 anh em nhà đó khác nhau như thế nào:
- Với
Print
: xuất kết quả ra màn hình nhưng con trỏ chuột không xuống dòng. - Với
Println
: xuất kết quả ra màn hình đồng thời con trỏ chuột nhảy xuống dòng tiếp theo. - Với
Printf
: xuất ra màng hình kết quả đồng thời có thể định dạng được kết quả đó nhờ vào các đối số thích hợp.
Để thấy rõ sự khác nhau trên, chúng ta hãy làm thử một ví dụ nhỏ. Chẳng hạn như in 2 câu: “Tôi yêu lập trình. Thích Java và uống cafe” hiển thị dưới dạng 2 dòng trên màn hình console.
Print
:
1
2
3
4
5
6
public class Print {
public static void main(String[] args) {
System.out.print("Tôi yêu lập trình.");
System.out.print("Thích Java và uống cafe.");
}
}
Println
:
1
2
3
4
5
6
public class Println {
public static void main(String[] args) {
System.out.println("Tôi yêu lập trình.");
System.out.println("Thích Java và uống cafe.");
}
}
Printf
:
1
2
3
4
5
public class Printf {
public static void main(String[] args) {
System.out.printf("%s\n%s", "Tôi yêu lập trình.", "Thích Java và uống cafe.");
}
}
Hãy thử run trên máy tính cá nhân để kiểm tra kết quả như thế nào nhé!
Rõ ràng là PRINTF
có gì đó tiến bộ hơn đúng không? Ở đây chúng ta chỉ cần tập trung nhìn cho ra sự khác biệt giữa PRINTF
với phần còn lại, đặc biệt là ở cú pháp – có gì đó quen thuộc với những ai đã từng làm việc với ngôn ngữ C
.
3. Ví dụ sử dụng printf
Java không tự nhiên phát triển một lớp PRINTF
mới mà không có gì đặc biệt cả. Thông thường, những công nghệ ra đời sau luôn luôn chiếm được ưu thế và nổi trội do được cập nhật để tiên tiên hơn các thế hệ trước đó. Với PRINTF
thì Java cũng đã làm tương tự.
Bây giờ, chúng ta hãy cùng điểm qua xem PRINTF
có gì mới và khác biệt nhé.
Cú pháp:
1
System.out.printf(local, format, arguments1, arguments2,…, argumentsn);
Trong đó:
- Local: nếu khác null sẽ được tự động định dạng theo khu vực.
- format: quy định chuẩn định dạng đầu ra cho các đối số
- Các argument: đối số cần định dạng.
Các bộ định dạng có sẵn trong Printf
:
Ký hiệu | Ý nghĩa |
---|---|
%c |
Ký tự |
%d |
Số thập phân (số nguyên, cơ số 10) |
%e |
Dấu phẩy động theo cấp số nhân |
%f |
Dấu phẩy động |
%i |
Số nguyên (cơ sở 10) |
%o |
Số bát phân (cơ sở 8) |
%s |
Chuỗi |
%u |
Số thập phân (số nguyên, không dấu) |
%x |
Số trong hệ thập lục phân (cơ sở 16) |
%t |
Định dạng ngày / giờ |
%% |
Dấu phần trăm |
\% |
Dấu phần trăm (escape character) |
Và bây giờ, thời khắc quan trọng này, chúng ta nhau lướt qua các ví dụ để thấy sự mạnh mẽ của “kẻ sinh sau” – PRINTF
Có thế dùng biến local để in ra định dạng ngày của khu vực nào đó. Mình chọn Đức cho ví dụ sau.
1
2
3
4
5
6
7
8
9
import java.sql.Date;
import java.util.Locale;
public class Printf_Example {
public static void main(String[] args) {
Date data = new Date(0);
System.out.printf(Locale.GERMANY, "Ngày giờ hiện tại: %tc", data);
}
}
Chuỗi từ một chuỗi thường “Học lập trình là một hạnh phúc” thành chuỗi in hoa
1
2
3
4
5
6
public class Printf_Example {
public static void main(String[] args) {
String string = "Học lập trình là một hạnh phúc";
System.out.printf("%S\n", string);
}
}
In số nguyên và số thực ra màn hình (tương tự như C 😊)).
1
2
3
4
5
6
7
public class Printf_Example {
public static void main(String[] args) {
int x = 666;
double y = 33.99;
System.out.printf("%d\t%.2f", x, y);
}
}
Các ví dụ về dịnh dạng Boolean:
1
2
3
4
5
6
7
public class Printf_Example {
public static void main(String args[]){
System.out.printf("%b%n", false); // false
System.out.printf("%b%n", 0.5); // true
System.out.printf("%b%n", "false"); // true
}
}
Một số định dạng về ngày tháng:
1
2
3
4
5
6
7
8
9
10
11
12
import java.util.Date;
public class Printf_Example {
public static void main(String args[]){
Date date = new Date();
System.out.printf("%tT%n", date);
System.out.printf("H : %tH, M: %tM, S: %tS%n",date,date,date);
System.out.printf("%s %tB %<te, %<tY", "Ngày hiện tại: ", date);
System.out.printf("%1$td.%1$tm.%1$ty %n", date);
System.out.printf("%s %tb %<te, %<ty", "Ngày hiện tại: ", date);
}
}
Lời kết
Sau một loạt các lý thuyết và ví dụ thì mình thực sự thấy rằng PRINTF
hoàn toàn đánh bại Print và Println về mọi mặt. Chính xác là có thể dùng PRINTF
cho toàn bộ các hoạt động in dữ liệu ra màn hình, tuy nhiên, vì một lý do nào đó mà phần lớn vẫn còn dùng Print với Println – vì thói quen chẳng hạn.
Sau bài viết này, mình hi vọng các bạn sẽ có thể sử dụng được PRINTF
một cách thành thạo và phục vụ tốt cho việc coding của mình.
Bài viết mang tính chất “ghi chú, lưu trữ, chia sẻ và phi lợi nhuận”.
Nếu bạn thấy hữu ích, đừng quên chia sẻ với bạn bè và đồng nghiệp của mình nhé!
Happy coding! 😎 👍🏻 🚀 🔥