CodeGym /Các khóa học /C# SELF /Interpolasi chuỗi nâng cao

Interpolasi chuỗi nâng cao

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

1. Nhớ lại interpolasi chuỗi

Rất thường xuyên tụi mình không chỉ cần in ra một chuỗi, mà còn phải chèn giá trị của biến vào đó nữa. Trước đây thì hay dùng phép cộng chuỗi (+) hoặc method string.Format. Nhưng từ khi C# có phép màu — interpolasi chuỗi (string interpolation), — cuộc sống lập trình viên vui hơn hẳn.

Interpolasi chuỗi hoạt động thế nào

Chỉ cần thêm ký tự $ trước chuỗi, và trong chuỗi thì dùng ngoặc nhọn {} để chèn biến hoặc thậm chí cả biểu thức.

So sánh kiểu cũ và kiểu mới khi in biến ra chuỗi

string name = "Anna";
int age = 24;

Console.WriteLine("Tên tôi là " + name + ", tôi " + age + " tuổi."); // Kiểu cũ
Console.WriteLine($"Tên tôi là {name}, tôi {age} tuổi."); // Kiểu mới!

Bạn có thể chèn luôn tính toán và biểu thức:


int a = 5, b = 10;
Console.WriteLine($"Tổng {a} + {b} = {a + b}");

2. Interpolasi chuỗi hoạt động thế nào

Đặt $ trước chuỗi, còn biến hoặc biểu thức thì để trong ngoặc nhọn {}:


string name = "Anna";
int age = 24;

Console.WriteLine($"Tên tôi là {name}, tôi {age} tuổi.");
  • Mọi thứ ngoài ngoặc nhọn — chỉ là text thôi.
  • Mọi thứ bên trong ngoặc nhọn sẽ được hiểu là code C#: có thể là tên biến, phép toán, gọi method, v.v.

Tính toán và biểu thức ngay trong chuỗi

Interpolasi không chỉ dừng lại ở biến đơn giản đâu! Bạn có thể làm như này:

Biểu thức toán học
int apples = 7;
int pears = 5;
Console.WriteLine($"Tôi có tổng cộng {apples + pears} trái cây."); // 12
Làm việc với chuỗi và method
string city = "Budapest";
Console.WriteLine($"Thành phố viết hoa: {city.ToUpper()}"); // BUDAPEST
Toán tử ba ngôi, điều kiện
int score = 90;
Console.WriteLine($"Điểm: {(score >= 60 ? "đạt" : "không đạt")}");
Gọi method
string FormatUser(string name, int age) => $"{name} ({age})";
Console.WriteLine($"Người dùng: {FormatUser("Eva", 19)}"); // Người dùng: Eva (19)
Làm việc với mảng và collection
int[] numbers = { 3, 5, 7 };
Console.WriteLine($"Tổng: {numbers.Sum()}");
Console.WriteLine($"Các phần tử: {string.Join(", ", numbers)}");
Biểu thức lồng nhau và cấu trúc phức tạp
var user = new { Name = "Oleg", Role = "Admin" };
Console.WriteLine($"Tên: {user.Name}, vai trò: {(user.Role == "Admin" ? "quản trị viên" : "người dùng")}");
Lưu ý:

biểu thức trong ngoặc nhọn nên ngắn gọn và dễ đọc. Nếu logic phức tạp — nên tính trước rồi gán vào biến, sau đó chèn biến vào chuỗi.

Biểu thức nhiều tầng
var student = new { Name = "Sasha", Info = new { Age = 21, Uni = "Harvard" } };
Console.WriteLine($"Tên: {student.Name}, trường: {student.Info.Uni}");
Chuyển đổi kiểu ngay trong chuỗi
double price = 19.99;
int count = 3;
Console.WriteLine($"Tổng giá: {price * count} euro");
Ngày giờ — đúng định dạng luôn
DateTime now = DateTime.Now;
Console.WriteLine($"Hôm nay: {now.Day}.{now.Month}.{now.Year}");
Ví dụ với vòng lặp
var days = new[] { "T2", "T3", "T4" };
Console.WriteLine($"Các ngày trong tuần: {string.Join(", ", days)}");

3. Định dạng trong interpolasi

Nhiều khi cần hiển thị số, ngày tháng, tiền tệ hay phần trăm cho đẹp.
Interpolasi cho phép bạn chỉ định format ngay trong ngoặc nhọn — sau dấu hai chấm.

Cú pháp chung: {biểu_thức:định_dạng}

Định dạng số

double num = 1234.5678;
Console.WriteLine($"Làm tròn: {num:F2}");     // 1234.57
Console.WriteLine($"Dạng số mũ: {num:E1}"); // 1.2E+003
Console.WriteLine($"Có phân tách hàng nghìn: {num:N}"); // 1 234,57 (tùy theo culture)

Ví dụ định dạng:

  • F2 — hai số sau dấu phẩy
  • N0 — phân tách hàng nghìn, 0 số sau dấu phẩy
  • E1 — dạng số mũ, 1 số sau dấu chấm
  • P0 — phần trăm, 0 số sau dấu chấm
double ratio = 0.1234;
Console.WriteLine($"Phần trăm: {ratio:P1}"); // 12,3 %

Định dạng ngày tháng

DateTime d = new DateTime(2025, 6, 18, 15, 42, 0);
Console.WriteLine($"Ngày: {d:dd.MM.yyyy}");         // 18.06.2025
Console.WriteLine($"Giờ: {d:HH:mm}");             // 15:42
Console.WriteLine($"ISO: {d:yyyy-MM-ddTHH:mm:ss}"); // 2025-06-18T15:42:00

Tóm tắt định dạng ngày tháng:

  • dd — ngày (2 số)
  • MM — tháng
  • yyyy — năm
  • HH:mm — giờ:phút (24h)
  • d — ngày ngắn theo culture
  • D — ngày dài

Định dạng tiền tệ

decimal cost = 2999.5m;
Console.WriteLine($"Giá: {cost:C}"); // 2,999.50 $  (tùy theo culture)

Căn chỉnh và padding

Bạn có thể đặt độ rộng field, căn phải hoặc trái:

int val = 7;
Console.WriteLine($"[{val,5}]");  // [    7] — phải
Console.WriteLine($"[{val,-5}]"); // [7    ] — trái

Kết hợp nhiều định dạng

DateTime dt = DateTime.Now;
Console.WriteLine($"Hôm nay {dt:dddd, dd MMMM yyyy}, giờ {dt:HH:mm}");

Interpolasi với nhiều kiểu dữ liệu

bool ok = true;
Console.WriteLine($"Thao tác {(ok ? "thành công" : "lỗi")}");

Chuỗi nhiều dòng với interpolasi

Gần đây có thêm raw string literal và interpolasi chuỗi nhiều dòng:

string user = "Timur";
int score = 100;

Console.WriteLine($"""
    Chúc mừng, {user}!
    Kết quả của bạn: {score}
    """);

Interpolasi lồng nhau và tính toán

Bạn có thể gọi method, format kết quả rồi chèn vào chuỗi:

double[] temps = { 23.4, 25.1, 21.9 };
Console.WriteLine($"Nhiệt độ trung bình: {temps.Average():F1}°C");

Ví dụ với bảng (căn chỉnh + định dạng)

Định dạng và căn chỉnh trong bảng bằng interpolasi

double[] prices = { 123.4, 8.9, 5643.0 };
for (int i = 0; i < prices.Length; i++)
    Console.WriteLine($"Sản phẩm {i + 1}: {prices[i],10:F2} euro");

Kết quả:

Sản phẩm 1:    123.40 euro
Sản phẩm 2:      8.90 euro
Sản phẩm 3:   5643.00 euro

4. Escape và interpolasi cùng lúc

Bạn có thể dùng ký tự escape và interpolasi cùng lúc:

string user = "Masha";
Console.WriteLine($"Chào, \"{user}\"!\nRất vui được gặp bạn.");

Kết quả:

Chào, "Masha"!
Rất vui được gặp bạn.

Nếu kết hợp với chuỗi verbatim, chỉ cần đặt $ trước rồi @ (hoặc ngược lại — đều được):

string path = "C:\\Temp";
Console.WriteLine($@"Tìm thấy file ở địa chỉ: ""{path}""");
2
Nhiệm vụ
C# SELF, mức độ, bài học
Đã khóa
Định dạng số và ngày tháng trong nội suy chuỗi.
Định dạng số và ngày tháng trong nội suy chuỗi.
2
Nhiệm vụ
C# SELF, mức độ, bài học
Đã khóa
Bảng dữ liệu với căn lề và định dạng.
Bảng dữ liệu với căn lề và định dạng.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION