Mục lục
Hiện nay có rất nhiều công ty, nhất là về những mảng liên quan đến tiền tệ ở Việt Nam đang gặp khó khăn trong việc từ một con số chuyển đổi sang dạng chữ.
Trong bài viết này mình sẽ hướng dẫn các bạn viết một hàm đơn giản để chuyển đổi một con số sang dạng chữ ở Việt Nam này nhé.
Về hướng thực hiện
Mình sẽ thực hiện theo hướng sau:
- Chia nhỏ con số đó thành các khối có độ dài là 3 và thêm vào một mảng để xử lý từng khối
- Viết hàm để chuyển khối 3 số thành kiểu chữ
- Lặp từng khối và chuyển đổi từng khối đấy ra kiểu chữ Việt Nam
- Thêm đuôi của từng khối
- Join mảng của các khối lại rồi replace những ký tự thừa nếu có
Các bước thực hiện
Bước 1: Viết hàm convert kiểu số thành chữ cho mỗi khối
Trước hết cần phải khai báo định dạng chữ của từng con số. Trong một khối có thể có 4 loại theo từng độ dài số của khối.
const defaultNumbers =' hai ba bốn năm sáu bảy tám chín';
const chuHangDonVi = ('1 một' + defaultNumbers).split(' ');
const chuHangChuc = ('lẻ mười' + defaultNumbers).split(' ');
const chuHangTram = ('không một' + defaultNumbers).split(' ');
fucntion convert_block_three(number) {
if(number == '000') return '';
var _a = number + ''; //Convert biến 'number' thành kiểu string
//Kiểm tra độ dài của khối
switch (_a.length) {
case 0: return '';
case 1: return chuHangDonVi[_a];
case 2: return convert_block_two(_a);
case 3:
var chuc_dv = '';
if (_a.slice(1,3) != '00') {
chuc_dv = convert_block_two(_a.slice(1,3));
}
var tram = chuHangTram[_a[0]] + ' trăm';
return tram + ' ' + chuc_dv;
}
}
function convert_block_two(number) {
var dv = chuHangDonVi[number[1]];
var chuc = chuHangChuc[number[0]];
var append = '';
// Nếu chữ số hàng đơn vị là 5
if (number[0] > 0 && number[1] == 5) {
dv = 'lăm'
}
// Nếu số hàng chục lớn hơn 1
if (number[0] > 1) {
append = ' mươi';
if (number[1] == 1) {
dv = ' mốt';
}
}
return chuc + '' + append + ' ' + dv;
}
Bước 2: Viết hàm nhận vào một số chuyển sang kiểu chữ
const dvBlock = '1 nghìn triệu tỷ'.split(' ');
function to_vietnamese(number) {
var str = parseInt(number) + '';
var i = 0;
var arr = [];
var index = str.length;
var result = [];
var rsString = '';
if (index == 0 || str == 'NaN') {
return '';
}
// Chia chuỗi số thành một mảng từng khối có 3 chữ số
while (index >= 0) {
arr.push(str.substring(index, Math.max(index - 3, 0)));
index -= 3;
}
// Lặp từng khối trong mảng trên và convert từng khối đấy ra chữ Việt Nam
for (i = arr.length - 1; i >= 0; i--) {
if (arr[i] != '' && arr[i] != '000') {
result.push(convert_block_three(arr[i]));
// Thêm đuôi của mỗi khối
if (dvBlock[i]) {
result.push(dvBlock[i]);
}
}
}
// Join mảng kết quả lại thành chuỗi string
rsString = result.join(' ');
// Trả về kết quả kèm xóa những ký tự thừa
return rsString.replace(/[0-9]/g, '').replace(/ /g,' ').replace(/ $/,'');
}
Như vậy là chúng ta đã viết xong hàm đơn giản để chuyển đổi kiểu số sang kiểu chữ đầy đủ của Việt Nam.
Chúng ta sẽ test thêm vài trường hợp:
console.log(to_vietnamese(22222222)); // hai mươi hai triệu hai trăm hai mươi hai nghìn hai trăm hai mươi hai
console.log(to_vietnamese(130213021302)); //một trăm ba mươi tỷ hai trăm mười ba triệu không trăm hai mươi mốt nghìn ba trăm lẻ hai
Như vậy là kết quả đúng như ta mong muốn. Hi vọng là bài viết sẽ giúp ích cho những bạn đang cần chuyển đổi kiểu số sang kiểu chữ ở việt nam trong Javascript.
Bài sau mình sẽ hướng dẫn các bạn đóng gói 1 function thành 1 package để publish lên Npmjs. Để khi nào cần dùng thì chỉ cần install package và gọi function vào là được.
Các bạn hãy đón chờ nhé!