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 = "";
            do {
                //Lấy số hàng tỷ
                so = Convert.ToInt64(Math.Floor((double)so / 1000000000));
                //Lấy phần dư sau số hàng tỷ
                double ty = 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 + " đồng";
        }  
    }

Xem chi tiết trong Video

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

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

1 Share
Share via
Copy link
Powered by Social Snap