Chào mừng các bạn đến với các bài viết mở rộng cho chủ đề về ngôn ngữ Java của Yellow Code Books.
Thời gian qua có một số bạn nêu lên một thắc mắc khá thực tế, đó là làm sao để có thể in ra console các nội dung được định dạng theo mong muốn của chương trình. Thắc mắc này không những đến từ các bạn muốn được xuất chuỗi ra console đẹp hơn. Mà còn cả các bạn đang làm UI hẳn hoi, thậm chí Android nữa, muốn quản lý dữ liệu chuỗi được đẹp và hiệu quả trên giao diện ứng dụng của các bạn.
Vậy bài viết này mình xin tổng hợp lại các thắc mắc, cũng như nêu lên các cách mà ngôn ngữ Java hỗ trợ chúng ta trong việc định dạng này. Nếu bạn nào vẫn chưa thực sự hiểu phần giới thiệu này đang nói về điều gì thì có thể đến với mục tiếp theo, mình sẽ nói rõ hơn.
Tại Sao Phải Định Dạng String/Output
Để trả lời câu hỏi này, mình mời các bạn đến với một tình huống sau (mình có đưa ví dụ tình huống này ở mục Xuất trên console của Bài 7), khi đó mình muốn in ra console câu lệnh này.
public static void main(String[] args) { System.out.println("The result is " + (10000.0/3.0)); }
Kết quả consle sẽ xuất hiện nội dung: The result is 3333.3333333333335
.
Rất nhiều trường hợp chúng ta sẽ mong muốn con số in ra không quá dài như vậy, chúng ta muốn một con số được làm tròn. Ví dụ con số làm tròn ngắn hơn 3333.33, hay có thêm % như thế này 3333.33%.
Ví dụ tiếp theo cho thấy nhu cầu mong muốn được định dạng cũng xuất hiện ở việc sử dụng kiểu String (mặc dù mình vẫn dùng các phương thức in ra console, nhưng mình đã cố tình dùng biến kiểu String trước đó, để cho thấy tình huống sử dụng kiểu String như thế này có thể gặp đâu đó trong lập trình ứng dụng Java có giao diện, hoặc lập trình Android).
public static void main(String[] args) { String today = "Today is " + new Date(); System.out.println(today); }
Kết quả của biến today sẽ chứa nội dung: Today is Fri Nov 25 11:19:53 ICT 2022
.
Bạn có thích kiểu ngày tháng được lưu trữ trên String như vậy không? Dĩ nhiên bạn sẽ cần một định dạng thân thiện hơn với người dùng để hiện thị ra UI rồi.
Thật may mắn là mong muốn đó của chúng ta đã được Java hỗ trợ “tận răng”, nhưng không phải ai cũng biết mà sử dụng nó, hoặc biết nhưng chưa sử dụng hiệu quả. Mời các bạn cùng xem trước 2 ví dụ trên được mình viết lại như sau bằng cách sử dụng các cách để định dạng các Output cũng như định dạng String.
System.out.printf("The result is %.2f", 10000.0/3.0);
Kết quả in ra: The result is 3333.33
.
String today = String.format("Today is %1$tB %1$te, %1$tY", new Date()); System.out.println(today);
Kết qủa in ra: Today is November 25, 2022
.
Bạn có thấy kết quả in ra khác biệt và dễ hiểu hơn đúng không nào. Bạn cũng có nhìn thấy sự khác biệt giữa code được sử dụng ở từng trường hợp không. Sẽ không sao nếu bạn chưa hiểu tại sao các con số in ra lại đẹp như vậy. Nếu bài viết đúng với nhu cầu cần tìm hiểu của bạn, thì hãy cùng mình đi đến các bước tiếp theo về việc làm thế nào để có thể định dạng chúng nhé.
Giới Thiệu Các Phương Thức Định Dạng String/Output
Chắc chắn bạn đã hiểu định dạng String/Output là gì và tại sao chúng ta lại cần phải định dạng chúng để dữ liệu trông đẹp đẽ hơn rồi.
Mục này mình muốn giới thiệu với các bạn các phương thức cụ thể dùng vào việc định dạng này.
Hai Phương Thức Định Dạng String/Output
printf()
Như bạn cũng đã được làm quen. Thay vì sử dụng các phương thức “thông thường” là print() hay println() để xuất dữ liệu “thô” ra console, bạn có thể sử dụng printf() để định dạng lại dữ liệu cần xuất. Chữ f ở cuối phương thức là chữ viết tắt của format (định dạng).
String.format()
Một phương thức static hữu ích được bổ sung vào lớp String, cũng giúp chúng ta định dạng chuỗi để lưu vào một biến String nào đó.
Cách Sử Dụng Hai Phương Thức Định Dạng String/Output
Hai phương thức được nêu ở mục trên tuy cơ bản là dùng ở hai mục đích khác nhau, nhưng cách sử dụng chúng là như nhau. Các ví dụ tiếp theo của bài viết mình sẽ dùng luân phiên từng phương thức, nhưng bạn vẫn hoàn toàn có thể yên tâm áp dụng cách dùng đến phương thức còn lại nhé.
Quay lại cách sử dụng, cả hai phương thức trên đều có hai cách truyền vào các tham số như nhau.
- (String format, Object… args): cách này cho chúng ta truyền vào một chuỗi trong đó có chứa một hoặc nhiều dấu hiệu định dạng ở tham số format. Sau đó chúng ta sẽ truyền thêm vào các giá trị cần định dạng ở các tham số tiếp theo của phương thức.
- (Locale l, String format, Object… args): cách này có thêm tham số Locale ở đầu, giúp chúng ta chỉ định việc định dạng theo quốc gia cụ thể. Các quốc gia sẽ có sự khác nhau ở một số hiển thị như: dấu phân cách phần ngàn, dấu thập phân, hay hiển thị thứ, tháng dạng chữ, hiển thị ngày/đêm trong giờ,… Một lát nữa ở các ví dụ bên dưới bạn sẽ có cơ hội được trải nghiệm việc chỉ định Locale để định dạng hiển thị ngày tháng theo tiếng Việt.
Mục tiếp theo chúng ta sẽ đi qua các cách để định dạng String/Output.
Định Dạng String/Output
Đây là phần chính yếu và quan trọng của bài viết. Trước khi đi cụ thể vào từng cách thức định dạng, mình mời các bạn xem sơ qua về Sơ đồ cú pháp (syntax diagram) của việc định dạng như sau.

Tuy nhìn hơi rối nhưng thực sự sơ đồ trên giúp tóm gọn lại tất cả các cách định dạng, khiến chúng trở nên dễ nhớ và dễ sử dụng hơn. Chúng ta cùng nhau mổ xẻ sơ đồ nào, thông qua việc bám sát vào sơ đồ bạn sẽ tìm ra tất cả các trường hợp hữu dụng của việc định dạng đấy nhé.
Quy Ước Sử Dụng Sơ Đồ
Nhìn vào sơ đồ, bạn thấy có ba loại hình biểu diễn.
- Hình mũi tên cho thấy thứ tự xuất hiện của từng thành phần trong định dạng. Bạn thấy chúng ta sẽ nhìn theo chiều mũi tên từ trái sang phải để cho ra các trường hợp khác nhau của định dạng. Mũi tên có thể biểu diễn bởi chỉ một đường đi thẳng nếu bạn không có nhu cầu rẽ nhánh, hoặc mũi tên giúp rẽ xuống nhánh dưới hơn cho các nhu cầu khác nhau. Lát nữa bạn sẽ rõ từng nhánh nhu cầu.
- Hình tròn màu cam có hiển thị các ký tự. Đây là các ký tự được định sẵn. Bạn thấy bắt đầu của dấu hiệu định dạng luôn phải khai báo bởi ký tự % (bạn hãy nhìn lại một chút ví dụ có sử dụng định dạng ở trên sẽ rõ). Ký tự % này sẽ báo với hệ thống rằng, đến đây thì String hay Output không phải hiển thị chuỗi đang được khai báo nữa, mà sẽ được thay thế bởi một giá trị cần định dạng nào đó đã được khai báo ở các tham số tiếp theo của phương thức. % cũng giúp hệ thống bắt đầu nhìn vào các ký tự sau nó (chính là các ký tự được mô tả trong hình chữ nhật màu tím) mà định dạng giá trị cho bạn.
- Hình chữ nhật màu tím cho chúng ta điền vào các tùy chọn, giúp chúng ta tạo ra các định dạng mong muốn. Dĩ nhiên là chúng ta cần phải học cách sử dụng từng nội dung cụ thể của từng trường hợp rồi. Từng trường hợp tiếp sẽ nói rõ hơn các cách sử dụng đối với thành phần này.
Trường Hợp 1: %-conversion_character
Đầu tiên chúng ta hãy xem xét sơ đồ với một trường hợp đơn giản nhất. Chính là biểu diễn bởi đường này.

Conversion character cho phép chúng ta chỉ định kiểu dữ liệu cần hiển thị. Mình xin liệt kê tất cả các conversion character ở bảng sau rồi đến các ví dụ để bạn rõ hơn về cách dùng (lưu ý mình không liệt kê đầy đủ các conversion character đâu nhé, có vài conversion character không dùng vào chỗ nào cả nên mình bỏ qua cho đỡ rối).
Conversion character | Mục đích | Ví dụ |
---|---|---|
d | Định dạng kiểu số nguyên (thập phân). | 159 |
x | Định dạng kiểu hexa (thập lục phân). | 9f |
o | Định dạng kiểu octal (bát phân). | 237 |
f | Định dạng kiểu số thực (với dấu chấm cố định). | 15.9 |
e | Định dạng kiểu số thực (với số mũ kèm theo). | 1.59e+01 |
s | Định dạng kiểu chuỗi. | Hello |
c | Định dạng kiểu ký tự. | H |
b | Định dạng kiểu boolean. | true |
% | Đây không phải % bắt đầu cho định dạng như đã nói trên kia. Ký tự này đặc biệt hơn, giúp hiển thị % ra cùng với kết quả được định dạng. | % |
Ví Dụ 1
Ví dụ sau kêu người dùng nhập vào tên, sau đó in ra console câu chào “Hello! <tên vừa nhập>!” (Mình lấy lại ví dụ của bài này để bạn so sánh).
Scanner scanner = new Scanner(System.in); System.out.print("Please enter your name here: "); String name = scanner.nextLine(); System.out.printf("Hello! %s!", name);
Bạn có thấy cách sử dụng của printf() ở dòng được tô sáng trong ví dụ trên không. Như mình có nói, String.format() cũng sẽ có cách dùng tương tự vậy.
Mình giải thích lại, nếu như bạn đã hiểu cách dùng của các phương thức định dạng rồi thì bỏ qua phần này.
printf() hay String.format() cho phép truyền vào nhiều tham số, nếu bỏ qua việc dùng tham số Locale thì tham số thứ nhất phải là một chuỗi mà nội dung có chứa dấu hiệu định dạng. Và như bạn cũng đã biết, cú pháp của dấu hiệu định dạng này bắt đầu bằng % và kèm theo các ký tự đã được quy định. Bạn thấy ở ví dụ trên có xuất hiện dấu hiệu định dạng là %s. %s được bắt đầu bởi % báo cho hệ thống biết chúng ta cần phải hiển thị một giá trị cần định dạng gì đó ở đây. Theo sau % là conversion character s, ý muốn nói hệ thống hãy hiển thị giá trị cần định dạng là một kiểu chuỗi. Giá trị cần định dạng chính là tham số tiếp theo, chính là biến name.
Số lượng xuất hiện của các dấu hiệu định dạng bên trong tham số thứ nhất của hai phương thức này là không giới hạn. Tuy nhiên bạn cũng cần phải khai báo nhất quán số lượng giá trị cần định dạng ở các tham số tiếp theo của phương thức sao cho đồng nhất với số lượng dấu hiệu định dạng, nếu bạn không muốn ứng dụng bị crash. Bạn hãy đến với ví dụ sau sẽ rõ hơn.
Ví Dụ 2
Ví dụ sau kêu người dùng nhập vào tên, rồi nhập vào tuổi, sau đó in ra console câu chào “Hello! <tên vừa nhập>! You are <tuổi vừa nhập> years old.”.
Scanner scanner = new Scanner(System.in); System.out.print("Please enter your name here: "); String name = scanner.nextLine(); System.out.print("How old are you? "); int age = scanner.nextInt(); System.out.printf("Hello! %s! You are %d years old", name, age);
Bạn có thấy xuất hiện hai dấu hiệu định dạng là %s và %d không. Và do đó các tham số name và age cũng phải được khai báo kèm theo ở 2 tham số tiếp theo của phương thức. Hai tham số name và age phải đảm bảo đúng số lượng và đúng thứ tự với %s và %d trong chuỗi định dạng.
Ví Dụ 3
Chúng ta hãy hiển thị giá trị của phép chia sau, đảm bảo kết quả có thêm dấu % sau cùng.
System.out.printf( "%s %f%%", "The result is: ", 1.0/4.0);
Kết quả như chúng ta mong muốn.
The result is: 0.250000%
Trường Hợp 2: %-argument_index-$-conversion_character
Mức độ khó nâng lên. Nếu nhìn tiêu đề của trường hợp này rối quá thì mời bạn xem lại một phần hướng đi của sơ đồ mà chúng ta muốn xem xét.

Trường hợp cú pháp này cho bạn thêm một tùy chọn định dạng, đó chính là argument index. Tham số này giúp bạn chỉ định vị trí của các giá trị cần định dạng. Nếu như với Trường hợp 1 bạn đã làm quen trên kia, khi không chỉ định argument index, bạn nhất thiết phải truyền vào phương thức các giá trị cần định dạng theo đúng số lượng và thứ tự của các dấu hiệu định dạng. Còn Trường hợp 2 này giúp bạn linh động hơn khi chỉ định vị trí của các tham số này.
Argument index không cần đến một bảng liệt kê gì cả, vì nó là vị trí nên bạn cũng đoán nó sẽ chứa các con số rồi. Nhưng ngoài số ra thì argument index cũng có một ký tự được quy định là ‘<‘, ký tự này dùng khi bạn muốn dùng lại giá trị vị trí của dấu hiệu định dạng đứng trước nó. Và có một lưu ý là argument index bắt đầu bằng 1 để chỉ định vị trí đầu tiên của tham số cần định dạng (không phải bắt đầu là 0 như với mảng).
Ví Dụ 4
Chúng ta hãy lấy lại Ví dụ 2 nhưng có chỉ định thêm argument index xem sao nhé.
Scanner scanner = new Scanner(System.in); System.out.print("Please enter your name here: "); String name = scanner.nextLine(); System.out.print("How old are you? "); int age = scanner.nextInt(); System.out.printf("Hello! %1$s! You are %2$d years old", name, age);
Bạn đã hiểu %1$s sẽ tìm và thay thế bởi tham số giá trị cần định dạng đầu tiên là name. Tương tự %2$d là age. Trong thực tế nếu muốn hiển thị định dạng như thế này thì mình thích dùng như Ví dụ 2 hơn, vì nó sẽ ngắn gọn hơn, mình sẽ rất ít dùng Ví dụ 3 trừ trường hợp nếu muốn hiển thị vị trí tường minh hơn, nhưng cũng sẽ rườm rà hơn. Tuy nhiên cách dùng argument index lại hiệu quả ở một số trường hợp, như với ví dụ tiếp theo.
Ví Dụ 5
Chúng ta sẽ đến một ví dụ thực tế hơn cho argument index này. Ví dụ này sẽ kêu người dùng nhập vào tên và họ, sau đó in ra câu chào hỏi và hiển thị lại đầy đủ họ tên như sau: “Hello <tên>! Your full name is <tên> <họ>.”. Bạn có thấy rằng tuy người dùng chỉ cần nhập vào hai biến là tên và họ, nhưng khi in ra console, chúng ta có nhu cầu xuất ra với 3 vị trí của dấu hiệu định dạng, trong đó có 2 vị trí trùng vào giá trị cần định dạng là tên. Chúng ta có thể sử dụng argument index để lấy vị trí giá trị cần định dạng tên như sau.
Scanner scanner = new Scanner(System.in); System.out.print("Please enter your first name: "); String firstName = scanner.nextLine(); System.out.print("Please enter your last name: "); String lastName = scanner.nextLine(); System.out.printf("Hello %1$s! Your full name is %1$s %2$s.", firstName, lastName);
Bạn có thấy mình dùng 2 dấu hiệu định dạng là %1$s ở 2 chỗ không, chúng đều có ý định rằng bạn muốn hiển thị cùng một giá trị cần định dạng thứ 1 vào 2 vị trí trong chuỗi cần định dạng. Nếu bạn không thích có thể viết như thế này:
System.out.printf("Hello %1$s! Your full name is %2$s.", firstName, (firstName + " " + lastName));
Hay thế này cũng được.
System.out.printf("Hello %s! Your full name is %s.", firstName, (firstName + " " + lastName));
Nhưng cách dùng lại vị trí %1$s theo mình là tường minh nhất. Cùng tùy bạn thôi. Nhưng như mình có nói, với cách dùng argument index thì còn có ký tự ‘<‘, cách dùng của ký tự này như sau.
System.out.printf("Hello %1$s! Your full name is %<s %2$s.", firstName, lastName);
Trường Hợp 3: %-flag-conversation_character
Sơ đồ cơ bản của trường hợp này như bạn đã biết như sau.

Tuy nhiên chúng ta cũng nên biết rằng do đường chạy của mũi tên khá linh động, nên dù cho chúng ta đang nói đến cách dùng flag trong trường hợp này, nó cũng có nghĩa chúng ta hoàn toàn có thể kết hợp lại với argument index trên kia nhé. Khi đó nó sẽ như thế này.

Nếu như conversion character giúp kiểm soát kiểu dữ liệu, argument index giúp chỉ định vị trí của tham số giá trị cần định dạng. Thì flag giúp chỉ định cách thức hiển thị của các giá trị cần xuất. Các cách hiển thị được mình tổng hợp lại trong bảng sau.
Flag | Mục đích | Ví dụ |
---|---|---|
+ | Hiện thị dấu cho số dương và âm. | +3333.33 |
Khoảng trắng | Nhớ là chỉ 1 khoảng trắng thôi. Thay vì hiển thị dấu thì cách này dùng để thêm 1 khoảng trắng trước số dương (không có khoảng trắng nào được thêm nếu nó là số âm). | | 3333.33| |
0 | Thêm số 0 vào trước số (kiểu này chỉ làm việc được khi đi kèm với width ở Trường hợp kế tiếp mà bạn sẽ làm quen). | 003333.33 |
– | Canh trái số (kiểu này cũng chỉ làm việc được khi đi kèm với width ở Trường hợp kế tiếp). | |3333.33 | |
( | Thay vì hiển thị dấu thì cách này giúp bao lấy số âm bởi cặp ngoặc tròn. | (3333.33) |
, | Phân tách phần ngàn của số bởi dấu (,). Rất hiệu quả khi bạn hiển thị số quá lớn. | 3,333.33 |
Ví Dụ 6
Bạn có thể thử tưởng tượng ra các cách để thử nghiệm cho vui. Như cách sau mình hiển thị kết quả của phép chia cho ra số âm với nhiều tùy chọn định dạng.
System.out.printf("The negative numbers:\n%1$+f\n%1$(f\n%1$(,f", (-10000.0/3.0));
Kết quả in ra console như sau.
The negative numbers: -3333.333333 (3333.333333) (3,333.333333)
Trường Hợp 4: %-width-conversion_character

Dĩ nhiên là Trường hợp 4 này cũng có thể dùng chung với các Trường hợp đã nói ở trên đấy nhé.
Trường hợp này giúp bạn chỉ định số lượng ký tự của giá trị cần định dạng.
Ví Dụ 7
Ví dụ sau đây chỉ định số lượng ký tự của phép chia.
System.out.printf("The result is %20f.", (10000.0/3.0));
Kết quả in ra sẽ là.
The result is 3333.333333.
Như dấu hiệu định dạng bạn chỉ định %20f, tức bạn muốn hiển thị 20 ký tự số lúc này. Mà kết quả của phép chia là 3333.333333 có tổng cộng 11 ký tự (kể cả dấu chấm thập phân). Chính vì vậy hệ thống sẽ phải thêm 9 ký tự trống vào trước kết quả.
Bạn có thể kết hợp với hai giá trị flag là 0 và – mà bảng ở Trường hợp 3 có mô tả. Bạn sẽ thấy với flag 0 thì hệ thống sẽ điền thêm 0 vào trước định dạng cho đủ số ký tự đã khai báo ở width. Còn flag – thì canh chỉnh số được canh trái trong khi thêm khoảng trắng vào bên phải số cho đủ số ký tự.
System.out.printf("The result is:\nOriginal: %1$20f.\nAdded 0: %1$020f.\nLeft alight: %1$-20f.", (10000.0/3.0));
Và kết quả.
The result is: Original: 3333.333333. Added 0: 0000000003333.333333. Left alight: 3333.333333 .
Trường Hợp 5: %-.-precision-conversion_character
Chúng ta hãy đến với sơ đồ của trường hợp này.

Trường hợp này ghi là precision, nhưng bạn có thể nhớ mục đích chính của nó là chỉ định số lượng chữ số sau dấu thập phân, và có thể làm tròn số khi cần. Ngoài ra thì định dạng này còn có thể áp dụng được với chuỗi hay kiểu giá trị khác, nhưng mình chưa gặp nhiều ứng dụng thực tế ở khoản này. Bạn có thể xem các ví dụ sau để hiểu rõ cách dùng.
Ví Dụ 8
Mình lấy lại code của mục Tại sao ở đầu bài viết.
System.out.printf("The result is %.2f", 10000.0/3.0);
Bạn cũng đã biết kết quả của câu lệnh xuất này là: The result is 3333.33
.
Giờ thì bạn đã hiểu %.2f đã chỉ định giá trị cần định dạng hãy hiển thị 2 chữ số sau dấu thập phân.
Bạn có thể kết hợp cả width lẫn precision như sau.
System.out.printf("The result is %20.2f", 10000.0/3.0);
Kết quả như bạn tưởng tượng, phần thập phân vẫn là 2 chữ số. Nhưng tổng cộng các chữ số khi in ra phải đảm bảo đủ 20 ký tự (bao gồm cả 2 ký tự thập phân và dấu chấm).
The result is 3333.33
Trường Hợp 6: %-t-conversion_character
Trường hợp này khá đặc biệt, nó khác với các Trường hợp đã nói ở trên. Thứ nhất, tuy nó có thể kết hợp giữa các Trường hợp 1-2-3-4, nhưng không kết hợp với Trường hợp 5 (bạn thấy nó đi một nhánh khác vòng qua Trường hợp 5 là vậy). Hơn nữa, nó không dùng lại conversion character mà chúng ta đã biết ở các Trường hợp trước, mà dùng một định nghĩa các conversion character khác, mình sẽ liệt kê bảng này ở bên dưới đây. Mời bạn xem sơ đồ.

Sử dụng đến kiểu định dạng này nếu bạn muốn định dạng sự xuất ra của kiểu Date (giúp hiển thị thời gian). Mời bạn xem qua bảng tổng hợp tất cả các ký tự định dạng như sau.
Conversion character | Mục đích | Ví dụ |
---|---|---|
c | Hiển thị đầy đủ ngày tháng. | Mon Nov 28 15:17:03 ICT 2022 |
F | Hiển thị theo chuẩn ISO 8601. | 2022-11-28 |
D | Hiển thị ngày theo chuẩn Mỹ (month/day/year). | 11/28/22 |
T | Hiển thị giờ theo 24-giờ. | 15:21:47 |
r | Hiển thị giờ theo 12-giờ. | 03:21:47 PM |
R | Hiển thị theo 24-giờ, nhưng không có giây. | 15:21 |
Y | Hiển thị năm với 4 ký tự. | 2022 |
y | Hiển thị năm với 2 ký tự. | 22 |
C | Hiển thị 2 ký tự đầu của năm. | 20 |
B | Hiển thị đầy đủ tháng dạng chữ. | November/tháng 11 |
b hay h | Hiển thị viết tắt của tháng dạng chữ. | Nov/thg 11 |
m | Hiển thị tháng dạng số với 2 ký tự (thêm 0 vào trước với tháng có 1 ký tự). | 02 |
d | Hiển thị ngày với 2 ký tự (thêm 0 vào trước với ngày có 1 ký tự). | 09 |
e | Hiển thị ngày (không thêm 0 vào trước với ngày có 1 ký tự). | 9 |
A | Hiển thị đầy đủ ngày trong tuần. | Monday/Thứ Hai |
a | Hiển thị viết tắt của ngày trong tuần. | Mon/Th 2 |
j | Hiển thị ngày của năm với 3 số (tự thêm 0 vào trước cho đủ). | 069 |
H | Hiển thị giờ với 2 ký tự, loại 24-giờ (thêm 0 vào trước với giờ có 1 số). | 15 |
k | Hiển thị giờ, loại 24-giờ (không thêm 0 vào trước với giờ có 1 số). | 15 |
I | Hiển thị giờ với 2 ký tự, loại 12-giờ (thêm 0 vào trước với giờ có 1 số). | 03 |
l | Hiển thị giờ với 2 ký tự, loại 12-giờ (không thêm 0 vào trước với giờ có 1 số). | 3 |
M | Hiển thị phút với 2 ký tự (thêm 0 vào trước với phút có 1 số). | 05 |
S | Hiển thị giây với 2 ký tự (thêm 0 vào trước với giây có 1 số). | 19 |
L | Hiển thị mili giây với 3 ký tự (thêm 0 vào trước cho đủ). | 047 |
p | Hiển thị sáng/tối. | pm/ch |
z | Hiển thị múi giờ. Hay nói đầy đủ nó là độ lệnh giờ của múi giờ hiện tại của bạn so với giờ GMT. | +0700 |
Z | Hiển thị tên của múi giờ. | ICT |
s | Hiển thị số giây tính từ 00:00:00 GMT ngày 01/01/1970. | 1669626632 |
Q | Hiển thị số mili giây tính từ 00:00:00 GMT ngày 01/01/1970. | 1669626632777 |
Ví Dụ 9
Chúng ta hãy cùng lấy lại code ở mục Tại sao ở đầu bài viết để hiểu rõ hơn.
System.out.printf("Today is %1$tB %1$te, %1$tY", new Date());
Giờ chắc bạn đã hiểu %1$tB giúp lấy tham số giá trị cần định dạng thứ nhất, chính là new Date(), việc khởi tạo một kiểu Date như thế này cho chúng ta thông tin của thời gian hiện tại. Sau đó định dạng tB tức là hiển thị dạng đầy đủ của tháng. Rồi đến te giúp hiển thị ngày. Cuối cùng tY là năm. Kết quả của câu lệnh là.
Today is November 28, 2022
Nếu bạn muốn hiển thị ngày tháng theo kiểu tiếng Việt ư, vậy thì hãy thêm Locale vào tham số đầu tiên của phương thức như sau nhé.
Locale locale = new Locale("vi", "VN"); System.out.printf(locale, "Hôm nay là ngày %1$te, %<tB, năm %<tY", new Date());
Kết quả sẽ là.
Hôm nay là ngày 28, tháng 11, năm 2022
Kết Luận
Dù khá là dài nhưng mình mong muốn được nêu lên đầy đủ nhất các trường hợp cần dùng của việc định dạng một giá trị. Hi vọng qua bài viết các bạn thêm tự tin hơn trong việc hiển thị dữ liệu cho người dùng, thông qua console hoặc UI của ứng dụng. Việc hiển thị theo định dạng như thế này giúp bạn nhanh chóng cho ra một giao diện mang tính chuyên nghiệp hơn cho người dùng, mà không làm thay đổi giá trị của dữ liệu được lưu trữ bên dưới.
Cảm ơn bạn đã đọc các bài viết của Yellow Code Books. Bạn hãy ủng hộ blog bằng cách:
– Đánh giá 5 sao ở mỗi bài viết nếu thấy thích.
– Comment bên dưới mỗi bài viết nếu có thắc mắc.
– Để lại địa chỉ email của bạn ở thanh bên phải để nhận được thông báo sớm nhất khi có bài viết mới.
– Chia sẻ các bài viết của Yellow Code Books đến nhiều người khác.
– Ủng hộ blog theo hướng dẫn ở thanh bên phải để blog ngày càng phát triển hơn.
Hay ad oii