Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 28 kết quả

Đề tài: Code chuyển tiền số sang chữ trên C#

  1. #1
    Ngày gia nhập
    05 2011
    Bài viết
    23

    Mặc định Code chuyển tiền số sang chữ trên C#

    Mình vừa viết 1 class về chuyển tiền dạng số sang chữ rất tiện cho bạn nào viết chương trình quản lý liên quan tới tiền..hoặc là xuất báo cáo rất hay sử dụng...
    VD: 123,000 > Một trăm hai mươi ba nghìn đồng
    Đầu tiên viết hàm chữ
    Visual C# Code:
    1.         private static string Chu(string gNumber)
    2.         {
    3.             string result = "";
    4.             switch (gNumber)
    5.             {
    6.                 case "0":
    7.                     result = "không";
    8.                     break;
    9.                 case "1":
    10.                     result = "một";
    11.                     break;
    12.                 case "2":
    13.                     result = "hai";
    14.                     break;
    15.                 case "3":
    16.                     result = "ba";
    17.                     break;
    18.                 case "4":
    19.                     result = "bốn";
    20.                     break;
    21.                 case "5":
    22.                     result = "năm";
    23.                     break;
    24.                 case "6":
    25.                     result = "sáu";
    26.                     break;
    27.                 case "7":
    28.                     result = "bảy";
    29.                     break;
    30.                 case "8":
    31.                     result = "tám";
    32.                     break;
    33.                 case "9":
    34.                     result = "chín";
    35.                     break;
    36.             }
    37.             return result;
    38.         }
    sau đó là hàm đơn vị
    Visual C# Code:
    1.       private static string Donvi(string so)
    2.         {
    3.             string Kdonvi = "";
    4.  
    5.             if (so.Equals("1"))
    6.                 Kdonvi = "";
    7.             if (so.Equals("2"))
    8.                 Kdonvi = "nghìn";
    9.             if (so.Equals("3"))
    10.                 Kdonvi = "triệu";
    11.             if (so.Equals("4"))
    12.                 Kdonvi = "tỷ";
    13.             if (so.Equals("5"))
    14.                 Kdonvi = "nghìn tỷ";
    15.             if (so.Equals("6"))
    16.                 Kdonvi = "triệu tỷ";
    17.             if (so.Equals("7"))
    18.                 Kdonvi = "tỷ tỷ";
    19.  
    20.             return Kdonvi;
    21.         }
    sau đó là tách ra
    Visual C# Code:
    1.         private static string Tach(string tach3)
    2.         {
    3.             string Ktach = "";
    4.             if (tach3.Equals("000"))
    5.                 return "";
    6.             if (tach3.Length == 3)
    7.             {
    8.                 string tr = tach3.Trim().Substring(0, 1).ToString().Trim();
    9.                 string ch = tach3.Trim().Substring(1, 1).ToString().Trim();
    10.                 string dv = tach3.Trim().Substring(2, 1).ToString().Trim();
    11.                 if (tr.Equals("0") && ch.Equals("0"))
    12.                     Ktach = " không trăm lẻ " + Chu(dv.ToString().Trim()) + " ";
    13.                 if (!tr.Equals("0") && ch.Equals("0") && dv.Equals("0"))
    14.                     Ktach = Chu(tr.ToString().Trim()).Trim() + " trăm ";
    15.                 if (!tr.Equals("0") && ch.Equals("0") && !dv.Equals("0"))
    16.                     Ktach = Chu(tr.ToString().Trim()).Trim() + " trăm lẻ " + Chu(dv.Trim()).Trim() + " ";
    17.                 if (tr.Equals("0") && Convert.ToInt32(ch) > 1 && Convert.ToInt32(dv) > 0 && !dv.Equals("5"))
    18.                     Ktach = " không trăm " + Chu(ch.Trim()).Trim() + " mươi " + Chu(dv.Trim()).Trim() + " ";
    19.                 if (tr.Equals("0") && Convert.ToInt32(ch) > 1 && dv.Equals("0"))
    20.                     Ktach = " không trăm " + Chu(ch.Trim()).Trim() + " mươi ";
    21.                 if (tr.Equals("0") && Convert.ToInt32(ch) > 1 && dv.Equals("5"))
    22.                     Ktach = " không trăm " + Chu(ch.Trim()).Trim() + " mươi lăm ";
    23.                 if (tr.Equals("0") && ch.Equals("1") && Convert.ToInt32(dv) > 0 && !dv.Equals("5"))
    24.                     Ktach = " không trăm mười " + Chu(dv.Trim()).Trim() + " ";
    25.                 if (tr.Equals("0") && ch.Equals("1") && dv.Equals("0"))
    26.                     Ktach = " không trăm mười ";
    27.                 if (tr.Equals("0") && ch.Equals("1") && dv.Equals("5"))
    28.                     Ktach = " không trăm mười lăm ";
    29.                 if (Convert.ToInt32(tr) > 0 && Convert.ToInt32(ch) > 1 && Convert.ToInt32(dv) > 0 && !dv.Equals("5"))
    30.                     Ktach = Chu(tr.Trim()).Trim() + " trăm " + Chu(ch.Trim()).Trim() + " mươi " + Chu(dv.Trim()).Trim() + " ";
    31.                 if (Convert.ToInt32(tr) > 0 && Convert.ToInt32(ch) > 1 && dv.Equals("0"))
    32.                     Ktach = Chu(tr.Trim()).Trim() + " trăm " + Chu(ch.Trim()).Trim() + " mươi ";
    33.                 if (Convert.ToInt32(tr) > 0 && Convert.ToInt32(ch) > 1 && dv.Equals("5"))
    34.                     Ktach = Chu(tr.Trim()).Trim() + " trăm " + Chu(ch.Trim()).Trim() + " mươi lăm ";
    35.                 if (Convert.ToInt32(tr) > 0 && ch.Equals("1") && Convert.ToInt32(dv) > 0 && !dv.Equals("5"))
    36.                     Ktach = Chu(tr.Trim()).Trim() + " trăm mười " + Chu(dv.Trim()).Trim() + " ";
    37.  
    38.                 if (Convert.ToInt32(tr) > 0 && ch.Equals("1") && dv.Equals("0"))
    39.                     Ktach = Chu(tr.Trim()).Trim() + " trăm mười ";
    40.                 if (Convert.ToInt32(tr) > 0 && ch.Equals("1") && dv.Equals("5"))
    41.                     Ktach = Chu(tr.Trim()).Trim() + " trăm mười lăm ";
    42.  
    43.             }
    44.  
    45.  
    46.             return Ktach;
    47.  
    48.         }
    Giờ là hàm mình sử dụng
    Visual C# Code:
    1.         public static string So_chu(double gNum)
    2.         {
    3.             if (gNum == 0)
    4.                 return "Không đồng";
    5.  
    6.             string lso_chu = "";
    7.             string tach_mod = "";
    8.             string tach_conlai = "";
    9.             double Num = Math.Round(gNum, 0);
    10.             string gN = Convert.ToString(Num);
    11.             int m = Convert.ToInt32(gN.Length / 3);
    12.             int mod = gN.Length - m * 3;
    13.             string dau = "[+]";
    14.  
    15.             // Dau [+ , - ]
    16.             if (gNum < 0)
    17.                 dau = "[-]";
    18.             dau = "";
    19.  
    20.             // Tach hang lon nhat
    21.             if (mod.Equals(1))
    22.                 tach_mod = "00" + Convert.ToString(Num.ToString().Trim().Substring(0, 1)).Trim();
    23.             if (mod.Equals(2))
    24.                 tach_mod = "0" + Convert.ToString(Num.ToString().Trim().Substring(0, 2)).Trim();
    25.             if (mod.Equals(0))
    26.                 tach_mod = "000";
    27.             // Tach hang con lai sau mod :
    28.             if (Num.ToString().Length > 2)
    29.                 tach_conlai = Convert.ToString(Num.ToString().Trim().Substring(mod, Num.ToString().Length - mod)).Trim();
    30.  
    31.             ///don vi hang mod
    32.             int im = m + 1;
    33.             if (mod > 0)
    34.                 lso_chu = Tach(tach_mod).ToString().Trim() + " " + Donvi(im.ToString().Trim());
    35.             /// Tach 3 trong tach_conlai
    36.  
    37.             int i = m;
    38.             int _m = m;
    39.             int j = 1;
    40.             string tach3 = "";
    41.             string tach3_ = "";
    42.  
    43.             while (i > 0)
    44.             {
    45.                 tach3 = tach_conlai.Trim().Substring(0, 3).Trim();
    46.                 tach3_ = tach3;
    47.                 lso_chu = lso_chu.Trim() + " " + Tach(tach3.Trim()).Trim();
    48.                 m = _m + 1 - j;
    49.                 if (!tach3_.Equals("000"))
    50.                     lso_chu = lso_chu.Trim() + " " + Donvi(m.ToString().Trim()).Trim();
    51.                 tach_conlai = tach_conlai.Trim().Substring(3, tach_conlai.Trim().Length - 3);
    52.  
    53.                 i = i - 1;
    54.                 j = j + 1;
    55.             }
    56.             if (lso_chu.Trim().Substring(0, 1).Equals("k"))
    57.                 lso_chu = lso_chu.Trim().Substring(10, lso_chu.Trim().Length - 10).Trim();
    58.             if (lso_chu.Trim().Substring(0, 1).Equals("l"))
    59.                 lso_chu = lso_chu.Trim().Substring(2, lso_chu.Trim().Length - 2).Trim();
    60.             if (lso_chu.Trim().Length > 0)
    61.                 lso_chu = dau.Trim() + " " + lso_chu.Trim().Substring(0, 1).Trim().ToUpper() + lso_chu.Trim().Substring(1, lso_chu.Trim().Length - 1).Trim() + " đồng chẵn.";
    62.  
    63.             return lso_chu.ToString().Trim();
    64.  
    65.         }
    hehee giờ sử dung rất đơn giản So_chu(123) trả về là một trăm hai mươi ba...Hi vong giúp ích được các bạn

  2. #2
    Ngày gia nhập
    10 2010
    Nơi ở
    Unallocated Memory
    Bài viết
    47

    Mình đã test thử chương trình bạn viết và chạy rất tốt.
    Tuy nhiên gặp phải một vấn đề nhỏ như sau:
    Ví dụ như trường hợp sau:
    +Bill gate có gia tài khoảng hơn 50 tỉ $.
    +Với mệnh giá quy đổi làm tròn là 1$=20.000 vnd
    +Vậy 50 tỉ $ sẽ quy ra 50*20.000=1 triệu tỉ vnd
    Chương trình của bạn sẽ báo lỗi vì 1 triệu tỉ vượt quá khả năng lưu trữ của kiểu double.

    Nếu bạn có thể sửa lại lưu kiểu string thay cho double thì sẽ tốt hơn.
    Chúc bạn gặp nhiều may mắn.
    Attached Thumbnails Attached Thumbnails read.jpg  
    Nghìn dặm phong ba cách tiếng lòng
    Vạn sầu thương nhớ nỗi hư không
    Nhìn phương xa ấy, mình ta ngóng
    Cố với tay theo một bóng hồng

  3. #3
    Ngày gia nhập
    05 2011
    Bài viết
    23

    Trích dẫn Nguyên bản được gửi bởi puss Xem bài viết
    Mình đã test thử chương trình bạn viết và chạy rất tốt.
    Tuy nhiên gặp phải một vấn đề nhỏ như sau:
    Ví dụ như trường hợp sau:
    +Bill gate có gia tài khoảng hơn 50 tỉ $.
    +Với mệnh giá quy đổi làm tròn là 1$=20.000 vnd
    +Vậy 50 tỉ $ sẽ quy ra 50*20.000=1 triệu tỉ vnd
    Chương trình của bạn sẽ báo lỗi vì 1 triệu tỉ vượt quá khả năng lưu trữ của kiểu double.

    Nếu bạn có thể sửa lại lưu kiểu string thay cho double thì sẽ tốt hơn.
    Chúc bạn gặp nhiều may mắn.
    THank ý kiến của bạn rất nhiều mình sẽ ghi nhận...

    Trích dẫn Nguyên bản được gửi bởi vietjc Xem bài viết
    1 chức năng mà tách ra quá nhiều hàm, code quá dài, không khả thi, mình thấy 1 bạn Bách Khoa viết bằng C# code có 20 dòng, đã xử lý tất cả các trường hợp
    Thank bạn..bạn có thể chia sẽ code 20 dòng mà xử lý hết tất cả trường hợp được không..mình muốn tối ưu và học hỏi thêm mà

  4. #4
    Ngày gia nhập
    05 2011
    Nơi ở
    Sài Thành
    Bài viết
    17

    Angry Chương trình đọc số - Mã nguồn C#

    Trích dẫn Nguyên bản được gửi bởi vietjc Xem bài viết
    1 chức năng mà tách ra quá nhiều hàm, code quá dài, không khả thi, mình thấy 1 bạn Bách Khoa viết bằng C# code có 20 dòng, đã xử lý tất cả các trường hợp
    Thứ nhất, mình thấy, trong tiếng Việt, có rất nhiều quy tắc đọc số.
    Ví dụ:
    20000 đọc là HAI MƯƠI NGÀN (hay NGHÌN) - chứ không đọc là HAI MƯƠI KHÔNG NGÀN KHÔNG TRĂM KHÔNG MƯƠI KHÔNG.
    100001 - MỘT TRĂM NGÀN KHÔNG TRĂM LINH MỘT hay MỘT TRĂM NGÀN LẺ MỘT mà không phải là MỘT TRĂM KHÔNG MƯƠI KHÔNG NGÀN KHÔNG TRĂM KHÔNG MƯƠI MỘT...
    Rồi 11 là MƯỜI MỘT, 21 lại là HAI MƯƠI MỐT (không ai đọc HAI MƯƠI MỘT)
    rồi với số 15, 25, khác với 05...

    Thứ hai, đùa một chút, C# cho phép viết nhiều câu lệnh trên 1 dòng... Đếm số dòng không chính xác bằng đếm số câu lệnh đâu :p

    À, nói thêm là, mình nghĩ, viết mã thì viết các hàm để làm việc mới là hay chứ. Viết suông một hơi từ trên xuống ai mà chẳng viết được. Và lập trình "hướng thủ tục" là một hướng cao cấp hơn lập trình tuần tự mà.

    Nếu muốn đọc đúng các quy tắc đó thì cần khá nhiều câu lệnh. Mình cũng đang viết một mã nguồn cho chuyện này. Nhưng vẫn còn lỗi một số trường hợp.
    Ví dụ:
    1.000.000.000.000.000.000 (một tỉ tỉ) và 1.000.000.000.000.000 (một triệu tỉ) thì thiếu chữ tỉ... ("một triệu" thôi). Nhưng với các con số khác zero và 1 thì nó khá ổn. Còn chữ "mốt" vẫn chưa giải quyết xong.

    Phạm vi đọc của chương trình mình đang làm tới 999.999.999.999.999.999

    Mọi người xem và góp ý thêm nha. Mình đang tiếp tục hoàn thiện nó.

    Sau đây là mã nguồn.

    Lớp NHÓM 3 CHỮ SỐ, dùng để chứa từng lớp đơn vị, lớp ngàn, lớp triệu...
    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Collections;
    6.  
    7. namespace Coding
    8. {
    9.     class Nhom3So
    10.     {
    11.         //Các Property ứng với các chữ số hàng đơn vị, hàng chục và hàng trăm
    12.         public int hd { get; set; }
    13.         public int hc { get; set; }
    14.         public int ht { get; set; }
    15.  
    16.         //Phương thức khởi tạo: Nhập nhóm 3 chữ số, đưa từng chữ số trong nhóm
    17.         //vào các thuộc tính
    18.         public Nhom3So() { }
    19.  
    20.         public Nhom3So(int nhom)
    21.         {
    22.             this.hd = nhom % 10;
    23.             this.hc = nhom / 10 % 10;
    24.             this.ht = nhom / 100;
    25.         }
    26.  
    27.         public Nhom3So(string stringNhom)
    28.         {
    29.             int nhom = int.Parse(stringNhom);
    30.             this.hd = nhom % 10;
    31.             this.hc = nhom / 10 % 10;
    32.             this.ht = nhom / 100;
    33.         }
    34.     }
    35. }


    Phần chính. Một số đoạn ngắn còn lỗi, và vài đoạn không cần thiết, mình đưa vào chú thích.
    Có chú thích trong mã.

    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Windows.Forms;
    9. using System.Collections;
    10.  
    11. namespace Coding
    12. {
    13.     public partial class DocSo : Form
    14.     {
    15.         public DocSo()
    16.         {
    17.             InitializeComponent();
    18.         }
    19.        
    20.         //Khởi tạo Hashtable chứa các key và value dùng để đọc từng con số
    21.         int[] kyso = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    22.         string[] kytu1 = { "không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín" };
    23.         string[] kytu2 = { "", "mốt", "hai", "ba", "bốn", "lăm", "sáu", "bảy", "tám", "chín" };
    24.  
    25.         public Dictionary<int, string> h1 = new Dictionary<int, string>();
    26.         public Dictionary<int, string> hdv = new Dictionary<int, string>();
    27.        
    28.         public void KhoiTao_h1_hdv()
    29.         {
    30.             for (int i = 0; i <= 9; i++)
    31.             {
    32.                 h1.Add(kyso[i], kytu1[i]);
    33.                 hdv.Add(kyso[i], kytu2[i]);
    34.             }
    35.         }
    36.  
    37.         //Kiểm tra hai số liên tiếp có bằng 0 hay không
    38.         private int Ktrazero(Nhom3So nhom)
    39.         {
    40.             if (nhom.ht == nhom.hc && nhom.ht==0 && nhom.hd!=0)
    41.                 return 0;
    42.             if (nhom.hc == nhom.hd && nhom.hc==0 && nhom.ht!=0)
    43.                 return 1;
    44.             if (nhom.ht == nhom.hc && nhom.hc == nhom.hd && nhom.ht == 0)
    45.                 return 2;
    46.             else return 3;
    47.         }
    48.        
    49.         //Đọc hàng đơn vị
    50.         private string Docdv(Nhom3So nhom)
    51.         {
    52.             if (nhom.hc != 0)
    53.                 return hdv[nhom.hd].ToString();
    54.             else
    55.                 return h1[nhom.hd].ToString();
    56.         }
    57.  
    58.         private string Doc1so(int so)
    59.         {
    60.                 return h1[so].ToString();
    61.         }
    62.  
    63.         private string Doc3so(Nhom3So nhom, bool lopdautien, bool lopdonvi) //Kiểm tra xem lớp đang đọc có phải lớp bên trái cùng
    64.         {
    65.             BaSo0 = false;
    66.             if (Ktrazero(nhom) == 0)
    67.                 if (lopdautien)
    68.                     return Docdv(nhom);
    69.                 else
    70.                     return "không trăm linh " + Docdv(nhom);
    71.             else
    72.                 if (Ktrazero(nhom) == 1)
    73.                     return Doc1so(nhom.ht) + " trăm";
    74.                 else
    75.                     if (Ktrazero(nhom) == 2)
    76.                     {
    77.                         BaSo0 = true;
    78.                         return "";
    79.                     }
    80.                     else
    81.                         if (nhom.ht == 0)
    82.                         {
    83.                             if (lopdautien)
    84.                             {
    85.                                 if (nhom.hc == 1)
    86.                                     if (nhom.hd != 1)
    87.                                         return " mười " + Docdv(nhom);
    88.                                     else
    89.                                         return " mười một ";
    90.                                 else
    91.                                     if (nhom.hc == 0)
    92.                                         return " linh " + Docdv(nhom);
    93.                                     else
    94.                                         return Doc1so(nhom.hc) + " mươi " + Docdv(nhom);
    95.                             }
    96.                             else
    97.                             {
    98.                                 if (nhom.hc == 1)
    99.                                     if (nhom.hd != 1)
    100.                                         return " mười " + Docdv(nhom);
    101.                                     else
    102.                                         if (!lopdonvi)
    103.                                             return " không trăm mười một";
    104.                                         else
    105.                                             return "mười một";
    106.                                 else
    107.                                     if (nhom.hc == 0)
    108.                                         return " không trăm linh " + Docdv(nhom);
    109.                                     else
    110.                                         return " không trăm " + Doc1so(nhom.hc) + " mươi " + Docdv(nhom);
    111.                             }
    112.                         }
    113.                         else
    114.                             if (nhom.hc == 0)
    115.                                 return Doc1so(nhom.ht) + " trăm linh " + Docdv(nhom);
    116.                             else
    117.                                 if (nhom.hc == 1)
    118.                                     return Doc1so(nhom.ht) + " trăm mười một";
    119.                                 else
    120.                                     return Doc1so(nhom.ht) + " trăm " + Doc1so(nhom.hc) + " mươi " + Docdv(nhom);
    121.  
    122.  
    123.         }
    124.  
    125.         Nhom3So[] nhomso = new Nhom3So[0];
    126.  
    127.         //Đếm số nhóm của số cần đọc và TRỪ ĐI 1
    128.         private int DemSoNhom(string so)
    129.         {
    130.             if (so.Length % 3 == 0)
    131.                 return so.Length / 3 - 1;
    132.             else
    133.                 return so.Length / 3;
    134.         }
    135.  
    136.         //Đảo nhóm 3 chữ số
    137.         //private string DaoNhom(string nhom)
    138.         //{
    139.         //    string kq = "";
    140.         //    for (int i = nhom.Length - 1; i >= 0; i--)
    141.         //        kq += nhom[i];
    142.         //    return kq;
    143.         //}
    144.  
    145.         //Tách số thành từng nhóm 3 số, đưa các nhóm 3 số này vào mảng nhomso
    146.         private void TachNhom(string so)
    147.         {
    148.             if (DemSoNhom(so) < 1)
    149.             {
    150.                 Stack<char> temp2 = new Stack<char>();
    151.                 for (int i = so.Length - 1; i >= 0; i--)
    152.                     temp2.Push(so[i]);
    153.                 Array.Resize<Nhom3So>(ref nhomso, nhomso.Length + 1);
    154.                 StringBuilder sb = new StringBuilder();
    155.                 while (temp2.Count > 0)
    156.                     sb.Append(temp2.Pop());
    157.                 nhomso[nhomso.Length - 1] = new Nhom3So(sb.ToString());
    158.                 Array.Reverse(nhomso);
    159.             }
    160.             else
    161.             {
    162.                 for (int i = 0; i < DemSoNhom(so); i++)
    163.                 {
    164.                     Stack<char> temp = new Stack<char>();
    165.                     for (int j = so.Length - (1 + i * 3); j >= so.Length - (3 + i * 3); j--)
    166.                         temp.Push(so[j]);
    167.                     Array.Resize<Nhom3So>(ref nhomso, nhomso.Length + 1);
    168.                     StringBuilder sb = new StringBuilder();
    169.                     while (temp.Count>0)
    170.                         sb.Append(temp.Pop());
    171.                     nhomso[nhomso.Length - 1] = new Nhom3So(sb.ToString());
    172.                 }
    173.                 Stack<char> temp2 = new Stack<char>();
    174.                 for (int i = so.Length - (1 + DemSoNhom(so) * 3); i >= 0; i--)
    175.                     temp2.Push(so[i]);
    176.                 Array.Resize<Nhom3So>(ref nhomso, nhomso.Length + 1);
    177.                 StringBuilder sb2 = new StringBuilder();
    178.                 while (temp2.Count > 0)
    179.                     sb2.Append(temp2.Pop());
    180.                 nhomso[nhomso.Length - 1] = new Nhom3So(sb2.ToString());
    181.                 Array.Reverse(nhomso);
    182.             }
    183.         }
    184.  
    185.         //Khởi tạo Hashtable dùng để đọc tên lớp nghìn, triệu, tỉ...
    186.         int[] solop = { 0, 1, 2, 3 }; //Số nhóm đã đếm với DemSoNhom()
    187.         string[] tenlop = { "", " nghìn ", " triệu ", " tỉ " };
    188.  
    189.         public Dictionary<int, string> hlop = new Dictionary<int, string>();
    190.         private void KhoiTao_hlop()
    191.         {
    192.             for (int i = 0; i <= solop.Length - 1; i++)
    193.                 hlop.Add(solop[i], tenlop[i]);
    194.         }
    195.  
    196.         //Cách đọc lớp
    197.         private string DocLop(int so) //Nhập vào CHỈ SỐ (INDEX) của nhóm (tính từ phải sang trái)
    198.         {
    199.             if (so <= 3)
    200.                 return hlop[so].ToString();
    201.             else
    202.                 if (so % 3 == 0)
    203.                     return hlop[3].ToString();
    204.                 else
    205.                     return hlop[so % 3].ToString();
    206.         }
    207.  
    208.         public bool BaSo0 = false;
    209.  
    210.         private void DocSo_Load(object sender, EventArgs e)
    211.         {
    212.             KhoiTao_h1_hdv();
    213.             KhoiTao_hlop();
    214.         }
    215.  
    216.         //Bỏ các số 0 vô nghĩa bên trái cùng
    217.         private string Boso0(string so)
    218.         {
    219.             while (so[0] == '0')
    220.             {
    221.                 string temp="";
    222.                 for (int i = 1; i < so.Length; i++)
    223.                     temp += so[i];
    224.                 so = temp;
    225.             }
    226.             return so;
    227.         }
    228.  
    229.         //Định dạng chuỗi "không có khoảng trắng thừa, viết hoa kí tự đầu tiên"
    230.         private string DinhDang(string s)
    231.         {
    232.             while (s[0] == ' ')
    233.             {
    234.                 string temp = "";
    235.                 for (int i = 1; i < s.Length; i++)
    236.                     temp += s[i];
    237.                 s = temp;
    238.             }
    239.             //while (s.IndexOf("  ") !=-1)
    240.             //    s.Replace("  ", " ");
    241.  
    242.             string temp2 = "";
    243.             temp2 += char.ToUpper(s[0]);
    244.             for (int i = 1; i < s.Length; i++)
    245.                 temp2 += s[i];
    246.             s = temp2;
    247.             return s;
    248.         }
    249.  
    250.         private void btnDocSo_Click(object sender, EventArgs e)
    251.         {
    252.             Array.Resize<Nhom3So>(ref nhomso, 0);
    253.             string stringSo = Boso0(txtSo.Text);
    254.             TachNhom(stringSo);
    255.             StringBuilder sb = new StringBuilder();
    256.             for (int i = 0; i < nhomso.Length; i++)
    257.             {
    258.                 if (i == 0 && i == DemSoNhom(stringSo))
    259.                     sb.Append(Doc3so(nhomso[i], true, true));
    260.                 else
    261.                     if (i == 0 && i != DemSoNhom(stringSo))
    262.                         sb.Append(Doc3so(nhomso[i], true, false));
    263.                     else
    264.                         if (i != 0 && i == DemSoNhom(stringSo))
    265.                             sb.Append(Doc3so(nhomso[i], false, true));
    266.                         else
    267.                             sb.Append(Doc3so(nhomso[i], false, false));
    268.                 if (!BaSo0)
    269.                     sb.Append(DocLop(DemSoNhom(stringSo) - i));
    270.             }
    271.             txtChu.Text = DinhDang(sb.ToString());
    272.         }
    273.  
    274.  
    275.     }
    276. }
    Attached Thumbnails Attached Thumbnails screenshot.3.jpg   screenshot.5.jpg   screenshot.6.jpg  
    Đã được chỉnh sửa lần cuối bởi cosmos : 17-06-2011 lúc 11:03 AM. Lý do: Bổ sung vài câu.

  5. #5
    Ngày gia nhập
    10 2010
    Nơi ở
    Unallocated Memory
    Bài viết
    47

    Xin mạo muội post 1 đoạn code đọc số hồi xưa mình viết.
    Hồi xưa viết = java, chuyển code qua C# chắc cũng sai sót vài chỗ, mong mọi người chỉ giáo.

    Visual C# Code:
    1. private string ChuyenSo(string number)
    2. {
    3.     string[] dv = { "", "mươi", "trăm", "nghìn", "triệu", "tỉ"};
    4.     string[] cs = { "không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín" };
    5.     string doc;
    6.     int i, j, k, n, len, found, ddv, rd;
    7.  
    8.     len = number.Length;
    9.     number += "ss";
    10.     doc = "";
    11.     found=0;
    12.     ddv=0;
    13.     rd=0;
    14.  
    15.     i = 0;
    16.     while (i < len)
    17.     {
    18.         //So chu so o hang dang duyet
    19.         n = (len - i + 2) % 3 + 1;
    20.  
    21.         //Kiem tra so 0
    22.         found = 0;
    23.         for (j = 0; j < n; j++)
    24.         {
    25.             if (number[i + j] != '0')
    26.             {
    27.                 found = 1;
    28.                 break;
    29.             }
    30.         }
    31.  
    32.         //Duyet n chu so
    33.         if (found == 1)
    34.         {
    35.             rd = 1;
    36.             for (j = 0; j < n; j++)
    37.             {
    38.                 ddv=1;
    39.                 switch(number[i+j])
    40.                 {
    41.                     case '0':
    42.                         if (n-j==3) doc+=cs[0]+" ";
    43.                         if (n-j==2)
    44.                         {
    45.                             if (number[i+j+1]!='0') doc+="lẻ ";
    46.                             ddv=0;
    47.                         }
    48.                         break;
    49.                     case '1':
    50.                         if (n-j==3) doc+=cs[1] + " ";
    51.                         if (n-j==2)
    52.                         {
    53.                             doc+="mười ";
    54.                             ddv=0;
    55.                         }
    56.                         if (n-j==1)
    57.                         {
    58.                             if (i + j == 0) k = 0;
    59.                             else k = i + j - 1;
    60.  
    61.                             if (number[k]!='1' && number[k]!='0')
    62.                                 doc += "mốt ";
    63.                             else
    64.                                 doc+=cs[1]+" ";
    65.                         }
    66.                         break;
    67.                     case '5':
    68.                         if (i+j==len-1)
    69.                             doc+="lăm ";
    70.                         else
    71.                             doc+=cs[5]+" ";
    72.                         break;
    73.                     default:
    74.                         doc+=cs[(int)number[i+j]-48]+" ";
    75.                         break;
    76.                 }
    77.  
    78.                  //Doc don vi nho
    79.                 if (ddv==1)
    80.                 {
    81.                     doc+=dv[n-j-1]+" ";
    82.                 }
    83.             }
    84.         }
    85.        
    86.  
    87.         //Doc don vi lon
    88.         if (len-i-n>0)
    89.         {
    90.             if ((len - i - n ) % 9 == 0)
    91.             {
    92.                 if (rd==1)
    93.                     for (k = 0; k < (len - i - n) / 9; k++)
    94.                         doc += "tỉ ";
    95.                 rd=0;
    96.             }
    97.             else
    98.                 if (found!=0) doc+=dv[((len-i-n+1)%9)/3+2]+" ";
    99.         }
    100.  
    101.         i+=n;
    102.     }
    103.  
    104.     if (len == 1)
    105.         if (number[0] == '0' || number[0] == '5') return cs[(int)number[0] - 48];
    106.  
    107.     return doc;
    108. }

    Chỉ cần copy hàm này vào, sau đó khi nào muốn dùng thì chỉ việc gọi hàm ChuyenSo(number);
    Tham số truyền vào là 1 string chứa các con số, rất tiện lợi với việc đọc những con số hàng trăm chữ số.
    Đã được chỉnh sửa lần cuối bởi puss : 10-07-2011 lúc 08:31 PM.
    Nghìn dặm phong ba cách tiếng lòng
    Vạn sầu thương nhớ nỗi hư không
    Nhìn phương xa ấy, mình ta ngóng
    Cố với tay theo một bóng hồng

  6. #6
    Ngày gia nhập
    02 2010
    Bài viết
    52

    Mặc định Code chuyển tiền số sang chữ trên C#

    đoạn code của chủ thớt thì dài quá, tui có đoạn code viết bằng vb, bữa nào rảnh chuyển sang C# ^^

  7. #7
    Ngày gia nhập
    05 2011
    Nơi ở
    Sài Thành
    Bài viết
    17

    Code của bạn Puss mình test thử thấy ổn với các số dưới trăm triệu tỉ thôi :p Mà vậy cũng đọc tiền được rồi. Chưa tìm thấy lỗi đọc Cảm ơn vì đóng góp của bạn.

    Nếu thêm hàm "làm đẹp" text xuất ra thì tuyệt

  8. #8
    Ngày gia nhập
    10 2010
    Nơi ở
    Unallocated Memory
    Bài viết
    47

    Trích dẫn Nguyên bản được gửi bởi cosmos Xem bài viết
    Code của bạn Puss mình test thử thấy ổn với các số dưới trăm triệu tỉ thôi :p Mà vậy cũng đọc tiền được rồi. Chưa tìm thấy lỗi đọc Cảm ơn vì đóng góp của bạn.

    Nếu thêm hàm "làm đẹp" text xuất ra thì tuyệt
    Với các số trên trăm triệu tỉ thì hàm này vẫn xử lý tốt mà bạn. Trên trăm triệu tỉ là đơn vị tỉ tỉ đó bạn.
    Còn hàm "làm đẹp" bạn nói nghĩa là sao? Bạn có thể nói rõ được không? Có gì bạn cứ nói cụ thể ra mọi người cùng thảo luận.
    Nghìn dặm phong ba cách tiếng lòng
    Vạn sầu thương nhớ nỗi hư không
    Nhìn phương xa ấy, mình ta ngóng
    Cố với tay theo một bóng hồng

  9. #9
    Ngày gia nhập
    02 2010
    Bài viết
    52

    tui mới code lại bằng C# nên share cho mọi người xem thử
    chương trình này mình làm chạy đến số tỷ tỷ nếu muốn thêm cho dài thêm nữa thì sửa lại 1 chút là được

    code chính:
    Visual C# Code:
    1. txtkq.Text = replace_special_word(join_unit(txtn.Text)).ToUpper().Trim();

    các phương thức phụ:
    Visual C# Code:
    1.         private string join_unit(string n)
    2.         {
    3.             int sokytu = n.Length;
    4.             int sodonvi = (sokytu % 3 > 0) ? (sokytu / 3 + 1) : (sokytu / 3);
    5.             n = n.PadLeft(sodonvi * 3, '0');
    6.             sokytu = n.Length;
    7.             string chuoi = "";
    8.             int i = 1;
    9.             while (i <= sodonvi)
    10.             {
    11.                 if (i == sodonvi) chuoi = join_number((int.Parse(n.Substring(sokytu - (i * 3), 3))).ToString()) + unit(i) + chuoi;
    12.                 else chuoi = join_number(n.Substring(sokytu - (i * 3), 3)) + unit(i) + chuoi;
    13.                 i += 1;
    14.             }
    15.             return chuoi;
    16.         }
    17.  
    18.  
    19.         {
    20.             string chuoi = "";
    21.             if (n == 1) chuoi = " đồng ";
    22.             else if (n == 2) chuoi = " nghìn ";
    23.             else if (n == 3) chuoi = " triệu ";
    24.             else if (n == 4) chuoi = " tỷ ";
    25.             else if (n == 5) chuoi = " nghìn tỷ ";
    26.             else if (n == 6) chuoi = " triệu tỷ ";
    27.             else if (n == 7) chuoi = " tỷ tỷ ";
    28.             return chuoi;
    29.         }
    30.  
    31.  
    32. private string convert_number(string n)
    33.         {
    34.             string chuoi = "";
    35.             if (n == "0") chuoi = "không";
    36.             else if (n == "1") chuoi = "một";
    37.             else if (n == "2") chuoi = "hai";
    38.             else if (n == "3") chuoi = "ba";
    39.             else if (n == "4") chuoi = "bốn";
    40.             else if (n == "5") chuoi = "năm";
    41.             else if (n == "6") chuoi = "sáu";
    42.             else if (n == "7") chuoi = "bảy";
    43.             else if (n == "8") chuoi = "tám";
    44.             else if (n == "9") chuoi = "chín";
    45.             return chuoi;
    46.         }
    47.  
    48.  
    49. private string join_number(string n)
    50.         {
    51.             string chuoi = "";
    52.             int i = 1, j = n.Length;
    53.             while (i <= j)
    54.             {
    55.                 if (i == 1) chuoi = convert_number(n.Substring(j - i, 1)) + chuoi;
    56.                 else if (i == 2) chuoi = convert_number(n.Substring(j - i, 1)) + " mươi " + chuoi;
    57.                 else if (i == 3) chuoi = convert_number(n.Substring(j - i, 1)) + " trăm " + chuoi;
    58.                 i += 1;
    59.             }
    60.             return chuoi;
    61.         }
    62.  
    63.  
    64. private string replace_special_word(string chuoi)
    65.         {
    66.             chuoi = chuoi.Replace("không mươi không ", "");
    67.             chuoi = chuoi.Replace("không mươi", "lẻ");
    68.             chuoi = chuoi.Replace("i không", "i");
    69.             chuoi = chuoi.Replace("i năm", "i lăm");
    70.             chuoi = chuoi.Replace("một mươi", "mười");
    71.             chuoi = chuoi.Replace("mươi một", "mươi mốt");
    72.             return chuoi;
    73.         }

    ai cần mình gửi luôn file code winfrom đính kèm luôn nè
    Attached Files Attached Files
    Đã được chỉnh sửa lần cuối bởi lion080889 : 07-07-2011 lúc 01:19 AM.
    Email : leminhphuoc89@gmail.com

  10. #10
    Ngày gia nhập
    05 2011
    Nơi ở
    Sài Thành
    Bài viết
    17

    Trích dẫn Nguyên bản được gửi bởi puss Xem bài viết
    Với các số trên trăm triệu tỉ thì hàm này vẫn xử lý tốt mà bạn. Trên trăm triệu tỉ là đơn vị tỉ tỉ đó bạn.
    Còn hàm "làm đẹp" bạn nói nghĩa là sao? Bạn có thể nói rõ được không? Có gì bạn cứ nói cụ thể ra mọi người cùng thảo luận.
    Mình biết là "tỉ tỉ", nhưng vấn đề là code của bạn chưa đưa ra được chữ "tỉ tỉ"
    "Làm đẹp" tức là xóa các khoảng trắng thừa, viết hoa chữ đầu tiên
    Bạn xem đoạn cuối trong code của mình (trên đây vài bài), nhưng vẫn còn 1 lỗi nhỏ, mình đưa nó vào comment, vì nó chưa chạy được.

Các đề tài tương tự

  1. Chuyển code sang code ngắn hơn trong LINQ
    Gửi bởi tinhthanhiepsi9x trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 14-04-2012, 11:19 AM
  2. chuyển từ code C++ sang C
    Gửi bởi nuocmatthanghe_90 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 26-02-2011, 10:02 AM
  3. Chuyển code Nested Dolls từ C sang code pascal
    Gửi bởi longago trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 04-01-2011, 08:54 AM
  4. chuyển code C++ từ VC++ 6.0 sang VC++ 9.0
    Gửi bởi chieftain_vn trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 3
    Bài viết cuối: 07-04-2009, 10:18 AM
  5. Chuyển code C++ sang code C, giúp mình với?
    Gửi bởi rong3sao trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 03-04-2009, 09:28 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn