CodeGym /Các khóa học /JAVA 25 SELF /Định dạng chuỗi

Định dạng chuỗi

JAVA 25 SELF
Mức độ , Bài học
Có sẵn

1. Vấn đề của việc nối chuỗi thủ công

Nếu chỉ cần in ra một–hai biến, toán tử + thực sự tiện. Nhưng khi dữ liệu nhiều, việc nối chuỗi sẽ nhanh chóng trở nên rối rắm, đặc biệt nếu cần định dạng số (ví dụ 2 chữ số sau dấu thập phân) hoặc xuống dòng.

String name = "Oleg";
int age = 25;
double balance = 12345.67;

System.out.println("Tên: " + name + ", tuổi: " + age + ", số dư: " + balance + " euro.");

Cố “vặn” thêm định dạng ngay trong phép nối chỉ làm giảm tính dễ đọc:

System.out.println("Tên: " + name + ", tuổi: " + age + ", số dư: " + String.format("%.2f", balance) + " euro.");

Kết luận: nối chuỗi đơn giản phù hợp cho việc nhỏ, nhưng với thông điệp phức tạp cần công cụ mạnh mẽ hơn — String.format().

2. String.format — định dạng chuỗi một cách bài bản

Phương thức String.format() cho phép tạo chuỗi theo mẫu và thay giá trị vào các vị trí chỉ định.

Dạng chung:

String result = String.format("Mẫu", znacheniya);
  • %s — chuỗi
  • %d — số nguyên
  • %f — số thực (float)
  • %n — xuống dòng (đa nền tảng)
String name = "Oleg";
int age = 25;
double balance = 12345.6789;

String info = String.format("Tên: %s, tuổi: %d, số dư: %.2f euro.", name, age, balance);
System.out.println(info);
// Sẽ in: Tên: Oleg, tuổi: 25, số dư: 12345.68 euro.

String result = String.format("Tên: %s, tuổi: %d, số dư: %.2f euro", name, age, balance);
// %s — chuỗi, %d — số nguyên, %.2f — số với 2 chữ số sau dấu thập phân

Định dạng số và chuỗi

Số thực với độ chính xác cố định:

double price = 99.999;
System.out.println(String.format("Giá: %.2f euro.", price)); // Giá: 100.00 euro.

Độ rộng trường và căn lề:

int n = 7;
System.out.println(String.format("Số: [%5d]", n));   // Số: [    7]
System.out.println(String.format("Số: [%-5d]", n));  // Số: [7    ]

[5d] — độ rộng trường 5, mặc định căn phải;
[-5d] — độ rộng trường 5, căn trái.

Chuỗi với căn lề:

String text = "Java";
System.out.println(String.format("[%10s]", text));  // [      Java]
System.out.println(String.format("[%-10s]", text)); // [Java      ]

Phần trăm:

double percent = 0.125;
System.out.println(String.format("Hoàn tất: %.1f%%", percent * 100)); // Hoàn tất: 12.5%

Để in ký tự phần trăm, hãy dùng %%.

Định dạng ngày (ngắn gọn)

import java.util.Date;
Date now = new Date();
System.out.println(String.format("Hôm nay: %tD", now)); // Hôm nay: 06/18/24
System.out.println(String.format("Thời gian: %tT", now));   // Thời gian: 15:42:07

Địa phương hóa và dấu phân cách

Mặc định dùng locale của hệ thống. Để đặt locale riêng (ví dụ dùng dấu phẩy làm dấu thập phân), hãy truyền locale — chẳng hạn Locale.FRANCE.

import java.util.Locale;
double price = 1234.56;
System.out.println(String.format(Locale.FRANCE, "%.2f", price)); // 1234,56

Ví dụ thực tế

Ví dụ 1: Báo cáo ngắn

String name = "Anna";
int tasks = 5;
double hours = 12.3456;

String report = String.format(
    "Nhân viên: %s%nSố nhiệm vụ hoàn thành: %d%nSố giờ đã dùng: %.1f",
    name, tasks, hours
);
System.out.println(report);

/* Kết quả:
Nhân viên: Anna
Số nhiệm vụ hoàn thành: 5
Số giờ đã dùng: 12.3
*/

Ví dụ 2: Bảng với căn lề

String header = String.format("%-10s | %5s | %8s", "Tên", "Điểm", "Thời gian");
String row1 = String.format("%-10s | %5d | %8.2f", "Oleg", 95, 10.5);
String row2 = String.format("%-10s | %5d | %8.2f", "Anna", 100, 9.75);

System.out.println(header);
System.out.println(row1);
System.out.println(row2);

/* Kết quả:
Tên        | Điểm  | Thời gian
Oleg       |    95 |    10.50
Anna       |   100 |     9.75
*/

Ví dụ 3: Văn bản hỗn hợp

int apples = 12;
int pears = 8;
System.out.println(String.format("Tôi có %d quả táo và %d quả lê.", apples, pears));

3. Thực hành: định dạng chuỗi trong ứng dụng của chúng ta

Thêm định dạng vào ứng dụng console: số dư luôn có hai chữ số sau dấu thập phân, xuống dòng — bằng %n.

Scanner console = new Scanner(System.in);

System.out.print("Nhập tên: ");
String name = console.nextLine();

System.out.print("Nhập tuổi: ");
int age = console.nextInt();

System.out.print("Nhập số dư: ");
double balance = console.nextDouble();

// In có định dạng
String info = String.format("Tên: %s, tuổi: %d, số dư: %.2f euro.", name, age, balance);
System.out.println(info);

Hãy thử:

  • Nhập các giá trị khác nhau và kiểm tra rằng số dư luôn hiển thị với hai chữ số sau dấu thập phân (%.2f).
  • Sửa mẫu để thêm xuống dòng bằng %n.

4. Những lỗi thường gặp khi định dạng chuỗi

Lỗi № 1: Không khớp kiểu và dấu định dạng.
Không thể truyền chuỗi vào %d hoặc số vào %s.

String.format("Tuổi: %d", "hai mươi"); // Lỗi: mong đợi số, nhưng truyền chuỗi

Lỗi № 2: Nhầm thứ tự đối số.
Mẫu %s %d, nhưng lại truyền trước số rồi mới chuỗi — sẽ gây lỗi hoặc in sai.

Lỗi № 3: Bỏ qua locale.
Mong đợi dấu phẩy làm dấu thập phân nhưng lại thấy dấu chấm — hãy đặt locale cần thiết tường minh qua tham số đầu của String.format(...).

Lỗi № 4: Ký tự phần trăm chưa escape.
Để in ký tự %, hãy dùng %%, nếu không việc định dạng sẽ lỗi.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION