Đọc số: chuyển từ số nguyên sang đọc bằng chữ (tiếng Việt)

Ngày 23 tháng 10 năm 2013 Trương Chương Dương
Đây là class để chuyển từ số nguyên sang số đọc bằng chữ, ví dụ:

67:  sáu mươi bảy
1234007:  một triệu hai trăm ba mươi bốn nghìn không trăm lẻ bảy
1234065:  một triệu hai trăm ba mươi bốn nghìn không trăm sáu mươi lăm
1234505:  một triệu hai trăm ba mươi bốn nghìn năm trăm linh năm
1234501:  một triệu hai trăm ba mươi bốn nghìn năm trăm lẻ một
51534001:  năm mươi mốt triệu năm trăm ba mươi bốn nghìn không trăm lẻ một
51000001:  năm mươi mốt triệu không trăm lẻ một
51000005:  năm mươi mốt triệu không trăm linh năm
120021120: một trăm hai mươi triệu không trăm hai mươi mốt nghìn một trăm hai mươi

Demo:

<?php

class Docso
{

    private static function doc3so($so)
    {
        $achu = array(" không ", " một ", " hai ", " ba ", " bốn ", " năm ", " sáu ", " bảy ", " tám ", " chín ");
        $aso = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");
        $kq = "";
        $tram = floor($so / 100); // Hàng trăm
        $chuc = floor(($so / 10) % 10); // Hàng chục
        $donvi = floor(($so % 10)); // Hàng đơn vị
        if ($tram == 0 && $chuc == 0 && $donvi == 0) $kq = "";
        if ($tram != 0) {
            $kq .= $achu[$tram] . "trăm";
            if (($chuc == 0))
            {
                if ($donvi == 5 || $donvi == 6)
                    $kq .= " linh";
                elseif ($donvi != 0)
                    $kq .= " lẻ";
            }
        }
        if (($chuc != 0) && ($chuc != 1)) {
            $kq .= $achu[$chuc] . "mươi";
        }
        if ($chuc == 1) $kq .= " mười";
        switch ($donvi) {
            case 1:
                if (($chuc != 0) && ($chuc != 1)) {
                    $kq .= " mốt ";
                } else {
                    $kq .= $achu[$donvi];
                }
                break;
            case 5:
                if ($chuc == 0) {
                    $kq .= $achu[$donvi];
                } else {
                    $kq .= " lăm";
                }
                break;
            default:
                if ($donvi != 0) {
                    $kq .= $achu[$donvi];
                }
                break;
        }

        return trim($kq);
    }

    public static function doc_so($so)
    {
        $so = preg_replace("([a-zA-Z{!@#$%^&*()_+<>?,.}]*)", "", $so);
        if (strlen($so) <= 21) {
            $kq = "";
            $c = 0;
            $d = 0;
            $tien = array("", " nghìn", " triệu", " tỷ", " nghìn tỷ", " triệu tỷ", " tỷ tỷ");
            for ($i = 0; $i < strlen($so); $i++) {
                if ($so[$i] == "0")
                    $d++;
                else break;
            }
            $so = substr($so, $d);
            for ($i = strlen($so); $i > 0; $i -= 3) {
                $a[$c] = substr($so, $i, 3);
                $so = substr($so, 0, $i);
                $c++;
            }
            $a[$c] = $so;
            for ($i = count($a); $i > 0; $i--) {
                if (!empty($a[$i]) && strlen(trim($a[$i])) != 0) {
                    if (self::doc3so($a[$i]) != "") {
                        if (($tien[$i - 1] == "")) {
                            if (count($a) > 2)
                            {
                                if (intval($a[$i]) < 10)
                                {
                                    if (intval($a[$i]) == 5)
                                        $kq .= " không trăm linh " . self::doc3so($a[$i]) . $tien[$i - 1];
                                    else
                                        $kq .= " không trăm lẻ " . self::doc3so($a[$i]) . $tien[$i - 1];
                                }
                                elseif (intval($a[$i]) < 100)
                                    $kq .= " không trăm " . self::doc3so($a[$i]) . $tien[$i - 1];
                                else $kq .= ' ' . self::doc3so($a[$i]) . $tien[$i - 1];
                            }
                            else $kq .= self::doc3so($a[$i]) . $tien[$i - 1];
                        } else if ((trim(self::doc3so($a[$i])) == "mười") && ($tien[$i - 1] == "")) {
                            if (intval($a[$i]) < 100)
                                $kq .= " không trăm " . doc3so($a[$i]) . $tien[$i - 1];
                            else $kq .= ' ' . self::doc3so($a[$i]) . $tien[$i - 1];
                        } else {
                            if (!empty($kq))
                            {
                                if (intval($a[$i]) < 10)
                                {
                                    if (intval($a[$i]) == 5)
                                        $kq .= " không trăm linh " . self::doc3so($a[$i]) . $tien[$i - 1];
                                    else
                                        $kq .= " không trăm lẻ " . self::doc3so($a[$i]) . $tien[$i - 1];
                                }
                                elseif (intval($a[$i]) < 100)
                                    $kq .= " không trăm " . self::doc3so($a[$i]) . $tien[$i - 1];
                                else $kq .= ' ' . self::doc3so($a[$i]) . $tien[$i - 1];
                            }
                            else $kq .= self::doc3so($a[$i]) . $tien[$i - 1];
                        }
                    }
                }
            }
            return $kq;
        } else {
            return "Số quá lớn!";
        }
    }

}

$so = 67;
echo $so . ": " . Docso::doc_so($so);
echo "\n";

$so = 1234007;
echo $so . ": " . Docso::doc_so($so);
echo "\n";

$so = 1234065;
echo $so . ": " . Docso::doc_so($so);
echo "\n";

$so = 1234505;
echo $so . ": " . Docso::doc_so($so);
echo "\n";

$so = 1234501;
echo $so . ": " . Docso::doc_so($so);
echo "\n";


$so = 51534001;
echo $so . ": " . Docso::doc_so($so);
echo "\n";

$so = 51000001;
echo $so . ": " . Docso::doc_so($so);
echo "\n";


$so = 51000005;
echo $so . ": " . Docso::doc_so($so);
echo "\n";


$so = 120021120;
echo $so . ": " . Docso::doc_so($so);
echo "\n";



Đang tải dữ liệu...
web site traffic statistics