Hàm chuyển số thành chữ javascript

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é!

Kịch bản này cho phép bạn linh hoạt trong việc trình bày các số

Rất nhiều lập trình liên quan đến tính toán với số, và bạn có thể dễ dàng định dạng số để hiển thị bằng cách thêm dấu phẩy, số thập phân, dấu âm và các ký tự thích hợp khác tùy thuộc vào loại số đó.

Nhưng bạn không phải lúc nào cũng trình bày kết quả của mình như là một phần của một phương trình toán học. Web cho người dùng nói chung là nhiều hơn về từ hơn là về con số, vì vậy đôi khi một số được hiển thị dưới dạng một số không phù hợp.

Trong trường hợp này, bạn cần tương đương với số trong từ, chứ không phải bằng chữ số. Đây là nơi bạn có thể gặp khó khăn. Làm thế nào để bạn chuyển đổi các kết quả số của các phép tính của bạn khi bạn cần số hiển thị trong các từ?

Việc chuyển đổi một số thành các từ không chính xác là các nhiệm vụ đơn giản nhất, nhưng nó có thể được thực hiện bằng cách sử dụng JavaScript không quá phức tạp.

JavaScript để chuyển đổi số thành từ

Nếu bạn muốn có thể thực hiện các chuyển đổi này trên trang web của mình, bạn sẽ cần một mã JavaScript có thể thực hiện chuyển đổi cho bạn. Cách đơn giản nhất để thực hiện việc này là sử dụng mã bên dưới; chỉ cần chọn mã và sao chép nó vào một tệp có tên là toword.js.

> // Chuyển đổi số thành từ
// bản quyền ngày 25 tháng 7 năm 2006, bởi Stephen Chapman //javascript.about.com
// quyền sử dụng Javascript này trên trang web của bạn được cấp
// với điều kiện là tất cả mã [bao gồm cả thông báo bản quyền này] là
// được sử dụng chính xác như được hiển thị [bạn có thể thay đổi hệ thống đánh số nếu bạn muốn]

> // Hệ thống đánh số của Mỹ
var th = ['', 'nghìn', 'triệu', 'tỷ', 'nghìn tỷ'];
// bỏ ghi chú dòng này cho English Number System
// var th = ['', 'nghìn', 'triệu', 'milliard', 'tỷ'];

> var dg = ['không', 'một', 'hai', 'ba', 'bốn',
'năm', 'sáu', 'bảy', 'tám', 'chín']; var tn =
['mười', 'mười một', 'mười hai', 'mười ba', 'mười bốn', 'mười lăm', 'mười sáu',
'mười bảy', 'mười tám', 'mười chín']; var tw = ['twenty', 'thirty', 'forty', 'fifty',
'sáu mươi', 'bảy mươi', 'tám mươi', 'chín mươi']; function toWords [s] {s = s.toString []; s =
s.replace [/ [\,] / g, '']; if [s! = parseFloat [s]] trả về 'không phải là một số'; var x =
s.indexOf ['.']; if [x == -1] x = s.length; nếu [x> 15] trả về 'quá lớn'; var n =
s.split ['']; var str = ''; var sk = 0; cho [var i = 0; i
[[xi]% 3 == 2] {if [n [i] == '1'] {str + = tn [Số [n [i + 1]]] + ''; i ++; sk = 1;}
else if [n [i]! = 0] {str + = tw [n [i] -2] + ''; sk = 1;}} khác nếu [n [i]! = 0] {str + =
dg [n [i]] + ''; if [[xi]% 3 == 0] str + = 'hundred'; sk = 1;} if [[xi]% 3 == 1] {if [sk]
str + = th [[xi-1] / 3] + ''; sk = 0;}} nếu [x! = s.length] {var y = s.length; str + =
'điểm '; cho [var i = x + 1; istr.replace [/ \ s + / g, ''];}

Tiếp theo, liên kết tập lệnh vào phần đầu của trang bằng cách sử dụng mã sau:

Bước cuối cùng là gọi tập lệnh để thực hiện chuyển đổi thành các từ cho bạn. Để có được một số được chuyển đổi thành các từ bạn chỉ cần gọi hàm chuyển qua số bạn muốn chuyển đổi và các từ tương ứng sẽ được trả về.

> var words = toWords [num];

Giới hạn số từ

Lưu ý rằng chức năng này có thể chuyển đổi các số lớn 999.999.999.999.999 thành các từ và với số thập phân như bạn muốn. Nếu bạn cố gắng chuyển đổi một số lớn hơn số đó, nó sẽ trả về "quá lớn".

Các số, dấu phẩy, dấu cách và một dấu chấm đơn cho dấu thập phân là các ký tự duy nhất được chấp nhận có thể được sử dụng cho số đang được chuyển đổi. Nếu nó chứa bất kỳ thứ gì ngoài các ký tự này, nó sẽ trả về "không phải là số".

Số âm

Nếu bạn muốn chuyển đổi số âm của các giá trị tiền tệ thành các từ, bạn nên xóa các ký hiệu đó khỏi số đầu tiên và chuyển đổi các từ đó thành các từ riêng biệt.

Chủ Đề