Định dạng ngày, số và tiền tệ tiếng Việt: Hướng dẫn CLDR
← Blog
🌏 Bản địa hóa5 phút đọc

Định dạng ngày, số và tiền tệ tiếng Việt: Hướng dẫn CLDR

💡 Tiếng Việt sử dụng định dạng ngày kiểu nhỏ đến lớn (dd/MM/yyyy), dấu chấm là phân cách hàng nghìn và dấu phẩy là dấu thập phân - ngược hoàn toàn với tiếng Anh. Đồng Việt Nam (VND, ₫) không có xu, nên giá luôn là số nguyên. Thiết lập đúng vi-VN CLDR trong ứng dụng giúp tránh các lỗi hiển thị âm thầm làm mất khách tại trang thanh toán.

Ý chính

  • Ngày tháng: dd/MM/yyyy (ngày trước) - 11/10/2026 = ngày 11 tháng 10, không phải tháng 11.
  • Số: dấu chấm = hàng nghìn, dấu phẩy = thập phân: 1.250.000,75 chứ không phải 1,250,000.75.
  • VND: luôn là số nguyên - hiển thị 1.250.000 ₫, không bao giờ 1.250.000,00 ₫.
  • Không có số nhiều ngữ pháp: dùng dạng other của CLDR cho mọi số lượng.
  • Dùng Intl.NumberFormat('vi-VN') và Intl.DateTimeFormat('vi-VN') - không hardcode dấu phân cách kiểu Mỹ.

Định dạng ngày tháng trong tiếng Việt là gì?

Tiếng Việt dùng thứ tự ngày-tháng-năm (little-endian). Mẫu ngắn trong Unicode CLDR cho locale vi là dd/MM/y. Ngày viết trước, tháng viết sau, năm bốn chữ số. Điều này giống hầu hết các nước châu Âu lục địa và khác với kiểu Mỹ (M/d/y).

Dạng viết đầy đủ theo mẫu: ngày [ngày] tháng [tháng] năm [năm]. Ví dụ: 11 tháng 10 năm 2026 viết là ngày 11 tháng 10 năm 2026. Tên thứ trong tuần đánh số từ thứ Hai đến thứ Bảy, Chủ Nhật là ngày cuối tuần. CLDR xác định thứ Hai là ngày đầu tuần tại Việt Nam.

Các ngữ cảnh chính thức và kỹ thuật dùng đồng hồ 24 giờ: 13:45 chứ không phải 1:45 PM. API Intl trong JavaScript tự động xử lý đúng khi truyền locale:

new Intl.DateTimeFormat('vi-VN').format(new Date('2026-10-11'));
// "11/10/2026"
new Intl.DateTimeFormat('vi-VN', { dateStyle: 'full' }).format(new Date('2026-10-11'));
// "Chủ Nhật, 11 tháng 10, 2026"

Tại sao dấu phân cách số tiếng Việt làm hỏng trang thanh toán?

Ký hiệu số trong CLDR cho vi-VN ngược với tiếng Anh. Trong tiếng Việt, dấu chấm (.) phân cách hàng nghìn và dấu phẩy (,) là dấu thập phân. Người dùng nhìn thấy 1,250.00 ₫ sẽ không đọc là "một triệu hai trăm năm mươi nghìn" - họ đọc là một số chỉ hơn một. Lỗi này gây mất chuyển đổi thực sự tại trang thanh toán, không chỉ là vấn đề thẩm mỹ.

Cách hiển thị đúng cho 1.250.500,75 (ký hiệu Việt Nam) là 1.250.500,75. API ECMA-402 Intl xử lý tự động mà không cần viết thêm code:

new Intl.NumberFormat('vi-VN').format(1250500.75);
// "1.250.500,75"

Không bao giờ hardcode dấu chấm thập phân hoặc phân cách hàng nghìn trong chuỗi tiền tệ hiển thị cho người dùng Việt Nam. Luôn để platform formatter xử lý theo locale.

VND (đồng Việt Nam) được định dạng như thế nào trong ứng dụng?

Đồng Việt Nam (VND, ₫) không có đơn vị phụ đang lưu hành. Tất cả giá bán lẻ và hóa đơn đều dùng số nguyên. Tiêu chuẩn CLDR cho VND đặt maximumFractionDigits: 0. Một số thư viện i18n mặc định hai chữ số thập phân cho mọi tiền tệ, nên cần override thủ công cho VND để tránh đuôi ",00" gây nhầm lẫn.

  • Đúng: 1.250.000 ₫
  • Gây nhầm: 1.250.000,00 ₫
new Intl.NumberFormat('vi-VN', {
  style: 'currency',
  currency: 'VND',
  maximumFractionDigits: 0
}).format(1250000);
// "1.250.000 ₫"

Các dạng viết tắt trong giao diện tiếng Việt: N (nghìn), Tr (triệu), Tỷ. "1,5 Tr ₫" nghĩa là 1.500.000 ₫. Nhiều trang thương mại điện tử Việt Nam hiển thị cả VND và USD song song vì một bộ phận người dùng quen với giá theo đô la từ các nền tảng quốc tế.

Số nhiều, từ loại đếm và trường địa chỉ

Tiếng Việt không có số nhiều ngữ pháp. Hình thức danh từ giống nhau dù số lượng là 1 hay một triệu. CLDR định nghĩa hai phạm trù số nhiều cho vi: "one" (i = 0 hoặc n = 1) và "other". Trong thực tế, chỉ cần dùng "other" cho mọi số lượng. Điều này đơn giản hóa đáng kể các chuỗi ICU MessageFormat:

  • Tiếng Anh: {count, plural, one {# item} other {# items}}
  • Tiếng Việt: {count, plural, other {# sản phẩm}}

Một điểm phức tạp: tiếng Việt dùng từ loại đếm (loại từ) thay đổi theo loại danh từ, không theo số lượng. Với người: "3 người"; với sách: "2 cuốn sách"; với vật phẳng: "5 tờ giấy". Dịch máy thường chọn sai loại từ với danh từ trừu tượng hoặc sản phẩm mới.

Với form địa chỉ, tiếng Việt dùng thứ tự từ nhỏ đến lớn: số nhà và tên đường, rồi phường hoặc xã, rồi quận hoặc huyện, rồi thành phố hoặc tỉnh. Ví dụ: "123 Lê Lợi, Phường Bến Nghé, Quận 1, TP. Hồ Chí Minh". Form địa chỉ hai dòng kiểu phương Tây không phù hợp với người dùng Việt Nam. Nên chia thành bốn trường riêng: Đường, Phường/Xã, Quận/Huyện và Tỉnh/Thành phố.

Bạn có thể tự làm gì và khi nào cần chuyên gia bản địa hóa?

Tất cả cấu hình đã mô tả ở trên - mẫu ngày tháng, dấu phân cách số, chữ số thập phân của VND, quy tắc số nhiều - là cấu hình kỹ thuật thuần túy. Đội kỹ thuật của bạn hoàn toàn có thể xử lý bằng Intl API hoặc thư viện tương thích ICU như Format.js, ICU4J hay Android ResourceBundle. Không cần nhà ngôn ngữ tiếng Việt ở lớp này.

Một chuyên gia bản địa hóa website tiếng Việt mang lại giá trị thực sự ở lớp nội dung:

  • Kiểm tra các chuỗi hỗn hợp khi số xuất hiện trong câu và ngữ pháp tiếng Việt xung quanh phải khớp.
  • Xác minh nhãn số viết tắt ("N", "Tr", "Tỷ") phù hợp với thói quen của đối tượng mục tiêu - tiếng Việt miền Bắc và miền Nam có một số khác biệt trong từ vựng tài chính thường ngày.
  • Phát hiện các tham chiếu đến Tết, lịch âm và ngày lễ cần ngôn ngữ phù hợp văn hóa thay vì chỉ chuyển đổi ngày.
  • Xác minh cách dùng loại từ trong bản sao thông báo và chuỗi đếm mà dịch tự động thường sai.

Câu hỏi thường gặp

Nên dùng vi hay vi-VN làm thẻ locale?

Cả hai đều cung cấp cùng dữ liệu CLDR. Khuyến nghị BCP 47 là dùng thẻ ngắn nhất có thể xác định locale: vi là đúng và tối giản. Dùng vi-VN nếu framework yêu cầu mã vùng rõ ràng. Cả hai đều hoạt động trong Intl API, next-intl, Format.js và ICU4J.

Tại sao thư viện của tôi hiển thị dấu chấm làm thập phân trong khi CLDR nói là dấu phẩy?

Một số thư viện i18n cũ mặc định dùng root locale hoặc locale của hệ điều hành thay vì dữ liệu CLDR. Hãy xác minh bạn đang truyền 'vi-VN' rõ ràng cho formatter và phiên bản thư viện sử dụng dữ liệu CLDR hiện tại. CLDR 48 là phiên bản ổn định mới nhất tính đến năm 2026.

Cửa hàng của tôi cho phép thanh toán bằng USD. Có cần hiển thị VND không?

Ngân hàng Nhà nước Việt Nam yêu cầu hàng hóa và dịch vụ bán tại Việt Nam phải niêm yết giá bằng VND. Chỉ hiển thị USD trên cửa hàng thị trường Việt Nam là không tuân thủ quy định và gây nhầm lẫn cho hầu hết người tiêu dùng trong nước. Hiển thị VND làm giá chính với ký hiệu ₫, có thể thêm USD nhỏ hơn để tham khảo. Luôn dùng không có chữ số thập phân cho VND.

Làm thế nào để xử lý lịch âm trong ứng dụng lịch hoặc đặt lịch?

Lịch Gregorian là lịch chính thức cho mọi mục đích pháp lý và kinh doanh tại Việt Nam. Lịch âm (Âm lịch) dùng cho các sự kiện văn hóa và lên kế hoạch Tết. CLDR hỗ trợ lịch Phật giáo như một xấp xỉ. Để chuyển đổi chính xác giữa lịch Gregorian và lịch âm, dùng thư viện chuyên dụng. Hiển thị cả ngày Gregorian và âm lịch song song là mẫu chuẩn trong ứng dụng lịch Việt Nam.

Đặt vi-VN trong Intl API có ảnh hưởng đến phần dịch thuật không?

Intl API chỉ kiểm soát định dạng: số, ngày tháng, tiền tệ. Nó không tải chuỗi đã dịch. Bạn vẫn cần hệ thống i18n riêng với từ điển tin nhắn tiếng Việt để dịch văn bản giao diện. Đặt vi-VN trong Intl.NumberFormat giúp định dạng số đúng nhưng không dịch "checkout" thành "thanh toán".

Nguồn

Written by Dao Huy (Lucas), Vietnamese translator & localization specialist (EN · ZH · FR → Vietnamese). See translation services →

Báo giáWhatsApp