Giải thuật đổi từ số sang chữ tiếng Việt
Trong một số trường hợp, bạn có một con số (ví dụ: 5787) và cần chuyển nó sang dạng chữ (năm nghìn bảy trăm tám mươi bảy)… Đó là một cách rất thường dùng trong các giấy tờ kế toán, cũng như nhiều trường hợp muốn tránh nhầm lẫn từ người dùng khi sử dụng để đọc ...
Trong một số trường hợp, bạn có một con số (ví dụ: 5787) và cần chuyển nó sang dạng chữ (năm nghìn bảy trăm tám mươi bảy)…
Đó là một cách rất thường dùng trong các giấy tờ kế toán, cũng như nhiều trường hợp muốn tránh nhầm lẫn từ người dùng khi sử dụng để đọc số tiền hay một cái gì đó tương tự.
Bài viết này, tôi xin giới thiệu một giải thuật đơn giản làm được việc này, và trong nỗ lực của mình, tôi cũng xin đưa ra một số đoạn code ví dụ để các nhà phát triển sử dụng trong trường hợp cần thiết (xem thêm quy định về giấy phép ở cuối bài này).
Thật ra, nguyên tắc đọc số trong tiếng Việt cũng tương đối phức tạp vì nó có quá nhiều trường hợp “ngoại lệ”, ví dụ như có lúc sử dụng “mươi” rồi “lẻ”… Tuy nhiên, không phải là không thể phân tích ra được (Thực tế là có khá nhiều người xài rồi và được ứng dụng rộng rãi trong các Phần mềm xử lý giao dịch).
$mangso = array('không','một','hai','ba','bốn','năm','sáu','bảy','tám','chín');
function dochangchuc($so,$daydu)
{
global $mangso;
$chuoi = "";
$chuc = floor($so/10);
$donvi = $so%10;
if ($chuc>1) {
$chuoi = " " . $mangso[$chuc] . " mươi";
if ($donvi==1) {
$chuoi .= " mốt";
}
} else if ($chuc==1) {
$chuoi = " mười";
if ($donvi==1) {
$chuoi .= " một";
}
} else if ($daydu && $donvi>0) {
$chuoi = " lẻ";
}
if ($donvi==5 && $chuc>1) {
$chuoi .= " lăm";
} else if ($donvi>1||($donvi==1&&chuc==0)) {
$chuoi .= " " . $mangso[$donvi];
}
return $chuoi;
}
function docblock($so,$daydu)
{
global $mangso;
$chuoi = "";
$tram = floor($so/100);
$so = $so%100;
if ($daydu || $tram>0) {
$chuoi = " " . $mangso[$tram] . " trăm";
$chuoi .= dochangchuc($so,true);
} else {
$chuoi = dochangchuc($so,false);
}
return $chuoi;
}
function dochangtrieu($so,$daydu)
{
$chuoi = "";
$trieu = floor($so/1000000);
$so = $so%1000000;
if ($trieu>0) {
$chuoi = docblock($trieu,$daydu) . " triệu";
$daydu = true;
}
$nghin = floor($so/1000);
$so = $so%1000;
if ($nghin>0) {
$chuoi .= docblock($nghin,$daydu) . " nghìn";
$daydu = true;
}
if ($so>0) {
$chuoi .= docblock($so,$daydu);
}
return $chuoi;
}
function docso($so)
{
global $mangso;
if ($so==0) return $mangso[0];
$chuoi = "";
$hauto = "";
do {
$ty = $so%1000000000;
$so = floor($so/1000000000);
if ($so>0) {
$chuoi = dochangtrieu($ty,true) . $hauto . $chuoi;
} else {
$chuoi = dochangtrieu($ty,false) . $hauto . $chuoi;
}
$hauto = " tỷ";
} while ($so>0);
return $chuoi;
}