C# Cơ bản .NET Core §1 Cài đặt, chương trình C# đầu tiên §2 Biến, kiểu dữ liệu và nhập/xuất §3 Toán tử số học và gán §4 So sánh, logic và lệnh if, switch §5 Vòng lặp for, while §6 Phương thức - Method §7 Chuyển số thành chữ §8 Phương thức - Delegate §9 Lớp - Class §10 Namespace §11 Partial, Nested §12 Kiểu giá trị, tham chiếu §13 Kiểu vô danh và dynamic §14 Biểu thức lambda §15 Event §16 Hàm hủy - Quá tải toán tử - thành viên tĩnh - indexer §17 null và nullable §18 Mảng §19 Chuỗi ký tự §20 Tính kế thừa §21 Phương thức khởi tạo §22 Tính đa hình - abstract - interface §23 Struct và Enum §24 Ngoại lệ Exeption §25 IDisposable - using §26 File cơ bản §27 FileStream §28 Generic §29 Collection - List §30 SortedList §31 Queue / Stack §32 Linkedlist §33 Dictionary - HashSet §34 Phương thức mở rộng §35 ObservableCollection §36 LINQ §37 (Multithreading) async - bất đồng bộ §38 Type §39 Attribute Annotation §40 DI Dependency Injection §41 (Multithreading) Parallel §42 Thư viện lớp §43 (Networking) Uri, Dns, Ping §44 (Networking) HttpClient §45 (Networking) HttpMessageHandler §46 (Networking) HttpListener §47 (Networking) Tcp TcpListenerr/TcpClient §48 (ADO.NET) SqlConnection §49 (ADO.NET) SqlCommand §50 (ADO.NET) DataAdapter §51 (EF Core) Tổng quan §52 (EF Core) Tạo Model §53 (EF Core) Fluent API §54 (EF Core) Query §55 (EF Core) Scaffold §56 (EF Core) Migration §57 (ASP.NET CORE) Hello World! §58 (ASP.NET CORE) Middleware §59 (ASP.NET CORE) Map - Request - Response §60 (ASP.NET CORE) IServiceCollection - MapWhen §61 (ASP.NET CORE) Session - ISession §62 (ASP.NET CORE) Configuration §63 (ASP.NET CORE) Gửi Mail §64 (ASP.NET CORE) SASS/SCSS §65 (ASP.NET CORE) LibMan §66 (ASP.NET RAZOR) Khởi tạo và Route §67 (ASP.NET RAZOR) Cú pháp Razor §68 (ASP.NET RAZOR) Layout trong ASP.NET Core §69 (ASP.NET RAZOR) Partial §70 (ASP.NET RAZOR) ViewComponent §71 (ASP.NET RAZOR) TagHelper §72 (ASP.NET RAZOR) HtmlHelper §73 (ASP.NET RAZOR) PageModel §74 (ASP.NET RAZOR) Model Binding §75 (ASP.NET RAZOR) HTML Form, Validation §76 (ASP.NET RAZOR) Upload File §77 (ASP.NET RAZOR) Entity Framework §78 (ASP.NET RAZOR) Paging §79 (ASP.NET RAZOR) Identity (1) - Register, Login, Logout §80 (ASP.NET RAZOR) Identity (2) Lockout, Reset Password §81 (ASP.NET RAZOR) Identity (3) Google Login §82 (ASP.NET RAZOR) Identity (4) Facebook Login §83 (ASP.NET RAZOR) Identity (5) profile, password, email ... §84 (ASP.NET RAZOR) Identity (6) Role §85 (ASP.NET RAZOR) Identity (7) Role-based Authorization §86 (ASP.NET RAZOR) Identity (8) RoleClaim §87 (ASP.NET RAZOR) Identity (9) Authorization Handler §88 (ASP.NET RAZOR) IAuthorizationService §89 (ASP.NET MVC) Controller - View §90 (ASP.NET MVC) Route §91 (ASP.NET MVC) EF, Identity §92 (ASP.NET MVC) Binding, Validation §93 (ASP.NET MVC) Xây dựng Website(1) §94 (ASP.NET MVC) Xây dựng Website(2) §95 (ASP.NET MVC) Xây dựng Website(3) §96 (ASP.NET MVC) Xây dựng Website(4) §97 (ASP.NET MVC) Giỏ hàng - Cart (5) §98 (ASP.NET MVC) elFinder (5) §99 (ASP.NET MVC) SB Admin (6) §100 (ASP.NET MVC) Kestrel, publish

Dưới đây là phương thức tĩnh code C# có chức năng chuyển số thành chữ, tiện dụng cho các ứng dụng như chuyển số tiền thành chữ cho các ứng dụng như kế toán ...

using System;

namespace XTL
{
  public static class Utils
  {
    /// 
    /// Chuyển phần nguyên của số thành chữ
    /// 
    /// Số double cần chuyển thành chữ
    /// Chuỗi kết quả chuyển từ số
    public static string NumberToText(double inputNumber, bool suffix = true)
    {
        string[] unitNumbers = new string[] { "không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín" };
        string[] placeValues = new string[] { "", "nghìn", "triệu", "tỷ" };
        bool isNegative = false;

        // -12345678.3445435 => "-12345678"
        string sNumber = inputNumber.ToString("#");
        double number = Convert.ToDouble(sNumber);
        if (number < 0)
        {
          number = -number;
          sNumber = number.ToString();
          isNegative = true;
        }


        int ones, tens, hundreds;

        int positionDigit = sNumber.Length;   // last -> first

        string result = " ";


        if (positionDigit == 0)
          result = unitNumbers[0] + result;
        else
        {
          // 0:       ###
          // 1: nghìn ###,###
          // 2: triệu ###,###,###
          // 3: tỷ    ###,###,###,###
          int placeValue = 0;

          while (positionDigit > 0)
          {
            // Check last 3 digits remain ### (hundreds tens ones)
            tens = hundreds = -1;
            ones = Convert.ToInt32(sNumber.Substring(positionDigit - 1, 1));
            positionDigit--;
            if (positionDigit > 0)
            {
              tens = Convert.ToInt32(sNumber.Substring(positionDigit - 1, 1));
              positionDigit--;
              if (positionDigit > 0)
              {
                hundreds = Convert.ToInt32(sNumber.Substring(positionDigit - 1, 1));
                positionDigit--;
              }
            }

            if ((ones > 0) || (tens > 0) || (hundreds > 0) || (placeValue == 3))
              result = placeValues[placeValue] + result;

            placeValue++;
            if (placeValue > 3) placeValue = 1;

            if ((ones == 1) && (tens > 1))
              result = "một " + result;
            else
            {
              if ((ones == 5) && (tens > 0))
                result = "lăm " + result;
              else if (ones > 0)
                result = unitNumbers[ones] + " " + result;
            }
            if (tens < 0)
              break;
            else
            {
              if ((tens == 0) && (ones > 0)) result = "lẻ " + result;
              if (tens == 1) result = "mười " + result;
              if (tens > 1) result = unitNumbers[tens] + " mươi " + result;
            }
            if (hundreds < 0) break;
            else
            {
              if ((hundreds > 0) || (tens > 0) || (ones > 0))
                result = unitNumbers[hundreds] + " trăm " + result;
            }
            result = " " + result;
          }
        }
        result = result.Trim();
        if (isNegative) result = "Âm " + result;
        return result + (suffix ? " đồng chẵn" : "");
      }
  }
}

Sử dụng như sau:

var snumber = XTL.Utils.NumberToText(566776768989);
//năm trăm sáu mươi sáu tỷ bảy trăm bảy mươi sáu triệu bảy trăm sáu mươi tám nghìn chín trăm tám mươi chín đồng chẵn

Code test thử chuyển 1000 số ngẫu nhiên sang chữ C#

// Kiểm tra ngẫu nhiên 1000 số
int ntest = 1000;
Random rn = new Random();
for (int i = 0; i < ntest; i++)
{
    var number = rn.NextDouble() * rn.Next(1, Int32.MaxValue);
    var text = XTL.Utils.NumberToText(number);
    var ntext = number.ToString("###,###,###,###,###");
    Console.WriteLine($"{ntext, 20} --> {text}");
}

Kết quả

     541,981,225 --> năm trăm bốn mươi một triệu chín trăm tám mươi một nghìn hai trăm hai mươi lăm đồng chẵn
     418,968,707 --> bốn trăm mười tám triệu chín trăm sáu mươi tám nghìn bảy trăm lẻ bảy đồng chẵn
     781,809,842 --> bảy trăm tám mươi một triệu tám trăm lẻ chín nghìn tám trăm bốn mươi hai đồng chẵn
     108,892,081 --> một trăm lẻ tám triệu tám trăm chín mươi hai nghìn không trăm tám mươi một đồng chẵn
     878,833,681 --> tám trăm bảy mươi tám triệu tám trăm ba mươi ba nghìn sáu trăm tám mươi một đồng chẵn
   1,498,640,457 --> một tỷ bốn trăm chín mươi tám triệu sáu trăm bốn mươi nghìn bốn trăm năm mươi bảy đồng chẵn
   1,225,616,098 --> một tỷ hai trăm hai mươi lăm triệu sáu trăm mười sáu nghìn không trăm chín mươi tám đồng chẵn
     447,329,627 --> bốn trăm bốn mươi bảy triệu ba trăm hai mươi chín nghìn sáu trăm hai mươi bảy đồng chẵn
      32,568,900 --> ba mươi hai triệu năm trăm sáu mươi tám nghìn chín trăm đồng chẵn
     350,628,963 --> ba trăm năm mươi triệu sáu trăm hai mươi tám nghìn chín trăm sáu mươi ba đồng chẵn
    ...................................