Chuyển số thành chuỗi bằng C#


Giới thiệu bài toán

Bài toán chuyển số thành chuỗi bạn sẽ hay gặp trong những phần mềm chuyên dụng như phần mềm bán hàng, phần mềm kế toán, quản lý kho … để in số tiền hoặc các con số ra dạng tường mình dạng chuỗi.
Ví dụ: 123 sẽ in ra thành “một trăm hai ba”
Trước khi bạn bắt tay vào lập trình, chúng ta phân tích một chút để tìm ra quy luật của bài toán:
Ví dụ:
123 => một trăm hai ba
567,123 => năm trăm sáu bảy nghìn một trăm hai ba
890,567,123 => tám trăm chín mươi triệu năm trăm sáu bảy nghìn một trăm hai ba
….
Bạn sẽ thấy quy luật đều bắt nguồn từ phần cơ sở là hàng trăm, hàng chục và hàng đơn vị. Các con số hàng nghìn, hàng triệu, hàng tỷ … đều được sinh theo quy luật như trên.

Code thuật toán chuyển số thành xâu


        //123 => một trăm hai ba đồng
        //1,123,000=>một triệu một trăm hai ba nghìn đồng
        //1,123,345,000 => một tỉ một trăm hai ba triệu ba trăm bốn lăm ngàn đồng
        string [] mNumText = "không;một;hai;ba;bốn;năm;sáu;bảy;tám;chín".Split(';');
        //Viết hàm chuyển số hàng chục, giá trị truyền vào là số cần chuyển và một biến đọc phần lẻ hay không ví dụ 101 => một trăm lẻ một
        private string DocHangChuc(double so,bool daydu)
        {
            string chuoi = "";
            //Hàm để lấy số hàng chục ví dụ 21/10 = 2
            Int64 chuc = Convert.ToInt64(Math.Floor((double)(so / 10)));
            //Lấy số hàng đơn vị bằng phép chia 21 % 10 = 1
            Int64 donvi = (Int64)so%10;
            //Nếu số hàng chục tồn tại tức >=20
            if (chuc>1) {
                chuoi = " " + mNumText[chuc] + " mươi";
                if (donvi==1) {
                    chuoi += " mốt";
                }
            } else if (chuc==1) {//Số hàng chục từ 10-19
                chuoi = " mười";
                if (donvi==1) {
                    chuoi += " một";
                }
            } else if (daydu && donvi>0) {//Nếu hàng đơn vị khác 0 và có các số hàng trăm ví dụ 101 => thì biến daydu = true => và sẽ đọc một trăm lẻ một
                    chuoi = " lẻ";
            }
            if (donvi==5 && chuc>=1) {//Nếu đơn vị là số 5 và có hàng chục thì chuỗi sẽ là " lăm" chứ không phải là " năm"
                chuoi += " lăm";
            } else if (donvi>1||(donvi==1&&chuc==0)) {
                chuoi += " " + mNumText[ donvi ];
            }
            return chuoi;
        }
        private string DocHangTram(double so,bool daydu)
        {
            string chuoi = "";
            //Lấy số hàng trăm ví du 434 / 100 = 4 (hàm Floor sẽ làm tròn số nguyên bé nhất)
            Int64 tram = Convert.ToInt64(Math.Floor((double)so/100));
            //Lấy phần còn lại của hàng trăm 434 % 100 = 34 (dư 34)
            so = so%100;
            if (daydu || tram>0) {
                chuoi = " " + mNumText[tram] + " trăm";
                chuoi += DocHangChuc(so,true);
            } else {
                chuoi = DocHangChuc(so,false);
            }
            return chuoi;
        }
        private string DocHangTrieu(double so,bool daydu)
        {
            string chuoi = "";
            //Lấy số hàng triệu
            Int64 trieu = Convert.ToInt64(Math.Floor((double)so/1000000));
            //Lấy phần dư sau số hàng triệu ví dụ 2,123,000 => so = 123,000
            so = so%1000000;
            if (trieu>0) {
                chuoi = DocHanTram(trieu,daydu) + " triệu";
                daydu = true;
            }
            //Lấy số hàng nghìn
            Int64 nghin = Convert.ToInt64(Math.Floor((double)so / 1000));
            //Lấy phần dư sau số hàng nghin 
            so = so%1000;
            if (nghin>0) {
                chuoi += DocHangTram(nghin,daydu) + " nghìn";
                daydu = true;
            }
            if (so>0) {
                chuoi += DocHangTram(so,daydu);
            }
            return chuoi;
       }
        public string ChuyenSoSangChuoi(double so)
        {
            if (so == 0)
                return mNumText[0];
            string chuoi = "", hauto = "";
            Int64 ty;
            do
            {
                //Lấy số hàng tỷ
                ty = Convert.ToInt64(Math.Floor((double)so / 1000000000));
                //Lấy phần dư sau số hàng tỷ
                so = so % 1000000000;
                if (ty > 0)
                {
                    chuoi = DocHangTrieu(so, true) + hauto + chuoi;
                }
                else
                {
                    chuoi = DocHangTrieu(so, false) + hauto + chuoi;
                }
                hauto = " tỷ";
            } while (ty > 0);
            return chuoi + " đồng";
        }  
    }

Xem chi tiết trong Video

Có thể bạn sẽ thích…

12 phản hồi

  1. Hoàng viết:

    Hàm này add vào đâu thầy ơi. em add vào funtion không được.

  2. Hoàng viết:

    Em t hêm vào và chạy nó báo lỗi: System.NotImplementedException: ‘The method or operation is not implemented.’

  3. Tài viết:

    if (ty > 0)
    {
    chuoi = DocHangTrieu(so, true) + hauto + chuoi;
    }
    else
    {
    chuoi = DocHangTrieu(so, false) + hauto + chuoi;
    }
    -> chỗ này chưa đúng với trường hợp tiền tỷ

    • Tài viết:

      3,118,024,647.38
      Một trăm mười tám triệu không trăm hai mươi bốn nghìn sáu trăm bốn mươi
      bảy tỷ một trăm mười tám triệu không trăm hai mươi bốn nghìn sáu trăm bốn mươi bảy đồng

      • User Avatar Phan Tiến viết:

        Bạn thử thay thế đoạn code sau:

        
         public static string ChuyenSoSangChuoi(double so)
                {
                    if (so == 0)
                        return mNumText[0];
                    string chuoi = "", hauto = "";
                    Int64 ty;
                    //do
                    //{
                        //Lấy số hàng tỷ
                        ty = Convert.ToInt64(Math.Floor((double)so / 1000000000));
                        //Lấy phần dư sau số hàng tỷ
                        so = so % 1000000000;
                        if (ty > 0)
                        {
                            hauto = " tỷ";
                            chuoi = DocHangTrieu(ty, false) + hauto + DocHangTrieu(so,false);
                        }
                        else
                        {
                            chuoi = DocHangTrieu(so, false);// + hauto + chuoi;
                        }
                        
                    //} while (ty > 0);
                    return chuoi + " đồng";
                }
        
  4. Đạt viết:

    thầy ơi cho em hỏi với ạ e, làm đến form hóa đơn em xem video của thầy em chỉnh lỗi lưu hóa đơn nhưng khi làm theo thầy thì em lại bị lỗi này ạ hình
    https://drive.google.com/file/d/1WPVIxvQN82bx4uY9sIZGtei5laNhyEOh/view?usp=sharing
    và sau đó khi em ấn ok thì bị lỗi này ạ https://drive.google.com/file/d/19McdQPyrZ6-2GE-xLovWwm7BknZ4TtXu/view?usp=sharing
    và trong phần in ra ex thì em lại bị lỗi này ạ https://drive.google.com/file/d/1n4RtT9xZj2UBTuDrZiyZVbimPh177eds/view?usp=sharing
    thầy có thể giúp em dc luôn vid mai em phải nộp rồi ạ em cảm ơn thầy nhiều ạ

    • Cường viết:

      Lỗi hình thứ 1 là chuỗi ký tự nhập vào dài hơn số ký tự đã khai báo cột trong SQL.
      Lỗi hình thứ 2 là Chuỗi SQL sai định dạng format, kiểm tra lại chuỗi sau khi truyền biến vào.
      Lỗi hình thứ 3 là Câu truy vấn của bạn không có kết quả trả về, vấn đề này bạn phải ràng buộc lại nhé, (nếu tblThongTinHD.Rows.Count > 0 thì mới có thể gọi dòng tblThongTinHD.Rows[0][0] được)

  5. Ái viết:

    Em làm bài này trên giao diện WPF ạ. Mặc dù chương trình không hiện lỗi nhưng khi chạy chương trình thì button của em bị lỗi ạ. Mong thầy giúp đỡ ạ.
    Đây là link ảnh ạ: https://drive.google.com/file/d/1fWxTP5CSZ5ShkBHaYWU0QTwMd7R3JILD/view

  6. ngo da nhan viết:

    em coppy paste bi loi nhu v a loi 1
    Severity Code Description Project File Line Suppression State
    Error CS5001 Program does not contain a static ‘Main’ method suitable for an entry point baibon C:\Users\SV\source\repos\bai1\baibon\CSC 1 Active

  7. Đức Tuấn viết:

    Em có đoạn javaScript này. Mọi người có thể chuyển sang C# được ko ạ? Mọi người giúp đỡ. Đây cũng là code đọc sô rút tiền rút gọn
    Ví du: 5.000.000.000 thì sẽ ra kết quả là 5 tỷ

    Code
    isNumber: function (number) {
    for (var i = 0; i = “0” && temp 0 && parseInt(price, 0) > 900000000) {
    if (priceTrieu > 0) { getTrieu = “,” + priceTrieu / 100; } else { getTrieu = ”; }
    strTextPrice = strTextPrice + priceTy + getTrieu + ” Tỷ “;
    }
    if (priceTy == 0 && priceTrieu > 0) {
    if (priceNgan > 0) { getNgan = “,” + priceNgan / 100; } else { getNgan = ”; }
    strTextPrice = strTextPrice + priceTrieu + getNgan + ” Triệu “;
    }
    if (priceTrieu == 0 && priceNgan > 0) {
    if (priceDong > 0) { getDong = “,” + priceDong / 100; } else { getDong = ”; }
    strTextPrice = strTextPrice + priceNgan + getDong + ” Ngàn “;
    }
    if (priceNgan == 0 && priceDong > 0) {
    strTextPrice = strTextPrice + priceDong + ” Đồng”;
    }

    strTextPrice = strTextPrice.replace(/\./g, “”);
    return strTextPrice;
    },

Trả lời