Monday, September 5, 2011

Một số hàm đọc số

C sharp:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Ham_doi_so_thanh_chu
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public static string str = " ";

        public static string ToString(decimal number)
        {
            string s = number.ToString("#");
            string[] so = new string[] { "không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín" };
            string[] hang = new string[] { "", "nghìn", "triệu", "tỷ" };
            int i, j, donvi, chuc, tram;

            bool booAm = false;
            decimal decS = 0;
            //Tung addnew
            try
            {
                decS = Convert.ToDecimal(s.ToString());
            }
            catch
            {
            }
            if (decS < 0)
            {
                decS = -decS;
                s = decS.ToString();
                booAm = true;
            }
            i = s.Length;
            if (i == 0)
                str = so[0] + str;
            else
            {
                j = 0;
                while (i > 0)
                {
                    donvi = Convert.ToInt32(s.Substring(i - 1, 1));
                    i--;
                    if (i > 0)
                        chuc = Convert.ToInt32(s.Substring(i - 1, 1));
                    else
                        chuc = -1;
                    i--;
                    if (i > 0)
                        tram = Convert.ToInt32(s.Substring(i - 1, 1));
                    else
                        tram = -1;
                    i--;
                    if ((donvi > 0) || (chuc > 0) || (tram > 0) || (j == 3))
                        str = hang[j] + str;
                    j++;
                    if (j > 3) j = 1;
                    if ((donvi == 1) && (chuc > 1))
                        str = "một " + str;
                    else
                    {
                        if ((donvi == 5) && (chuc > 0))
                            str = "lăm " + str;
                        else if (donvi > 0)
                            str = so[donvi] + " " + str;
                    }
                    if (chuc < 0)
                        break;
                    else
                    {
                        if ((chuc == 0) && (donvi > 0)) str = "lẻ " + str;
                        if (chuc == 1) str = "mười " + str;
                        if (chuc > 1) str = so[chuc] + " mươi " + str;
                    }
                    if (tram < 0) break;
                    else
                    {
                        if ((tram > 0) || (chuc > 0) || (donvi > 0)) str = so[tram] + " trăm " + str;
                    }
                    str = " " + str;
                }
            }
            if (booAm) str = "Âm " + str;
            return str;// = str+ "đồng chẵn";

        }

        private void button1_Click(object sender, EventArgs e)
        {
            //textBox2.Text = ToString(decimal.Parse(textBox1.Text));
            textBox2.Text = DocTienBangChu(long.Parse(textBox1.Text)," Đồng");
        }


        private string[] ChuSo = new string[10] { " không", " một", " hai", " ba", " bốn", " năm", " sáu", " bẩy", " tám", " chín" };
        private string[] Tien = new string[6] { "", " nghìn", " triệu", " tỷ", " nghìn tỷ", " triệu tỷ" };
        // Hàm đọc số thành chữ
        public string DocTienBangChu(long SoTien, string strTail)
        {
            int lan, i;
            long so;
            string KetQua = "", tmp = "";
            int[] ViTri = new int[6];
            if (SoTien < 0) return "Số tiền âm !";
            if (SoTien == 0) return "Không đồng !";
            if (SoTien > 0)
            {
                so = SoTien;
            }
            else
            {
                so = -SoTien;
            }
            //Kiểm tra số quá lớn
            if (SoTien > 8999999999999999)
            {
                SoTien = 0;
                return "";
            }
            ViTri[5] = (int)(so / 1000000000000000);
            so = so - long.Parse(ViTri[5].ToString()) * 1000000000000000;
            ViTri[4] = (int)(so / 1000000000000);
            so = so - long.Parse(ViTri[4].ToString()) * +1000000000000;
            ViTri[3] = (int)(so / 1000000000);
            so = so - long.Parse(ViTri[3].ToString()) * 1000000000;
            ViTri[2] = (int)(so / 1000000);
            ViTri[1] = (int)((so % 1000000) / 1000);
            ViTri[0] = (int)(so % 1000);
            if (ViTri[5] > 0)
            {
                lan = 5;
            }
            else if (ViTri[4] > 0)
            {
                lan = 4;
            }
            else if (ViTri[3] > 0)
            {
                lan = 3;
            }
            else if (ViTri[2] > 0)
            {
                lan = 2;
            }
            else if (ViTri[1] > 0)
            {
                lan = 1;
            }
            else
            {
                lan = 0;
            }
            for (i = lan; i >= 0; i--)
            {
                tmp = DocSo3ChuSo(ViTri[i]);
                KetQua += tmp;
                if (ViTri[i] != 0) KetQua += Tien[i];
                if ((i > 0) && (!string.IsNullOrEmpty(tmp))) KetQua += ",";//&& (!string.IsNullOrEmpty(tmp))
            }
            if (KetQua.Substring(KetQua.Length - 1, 1) == ",") KetQua = KetQua.Substring(0, KetQua.Length - 1);
            KetQua = KetQua.Trim() + strTail;
            return KetQua.Substring(0, 1).ToUpper() + KetQua.Substring(1);
        }
        // Hàm đọc số có 3 chữ số
        private string DocSo3ChuSo(int baso)
        {
            int tram, chuc, donvi;
            string KetQua = "";
            tram = (int)(baso / 100);
            chuc = (int)((baso % 100) / 10);
            donvi = baso % 10;
            if ((tram == 0) && (chuc == 0) && (donvi == 0)) return "";
            if (tram != 0)
            {
                KetQua += ChuSo[tram] + " trăm";
                if ((chuc == 0) && (donvi != 0)) KetQua += " linh";
            }
            if ((chuc != 0) && (chuc != 1))
            {
                KetQua += ChuSo[chuc] + " mươi";
                if ((chuc == 0) && (donvi != 0)) KetQua = KetQua + " linh";
            }
            if (chuc == 1) KetQua += " mười";
            switch (donvi)
            {
                case 1:
                    if ((chuc != 0) && (chuc != 1))
                    {
                        KetQua += " mốt";
                    }
                    else
                    {
                        KetQua += ChuSo[donvi];
                    }
                    break;
                case 5:
                    if (chuc == 0)
                    {
                        KetQua += ChuSo[donvi];
                    }
                    else
                    {
                        KetQua += " lăm";
                    }
                    break;
                default:
                    if (donvi != 0)
                    {
                        KetQua += ChuSo[donvi];
                    }
                    break;
            }
            return KetQua;
        }
    }
}
VB:Public Function Number2Text(ByVal sNumber As String) As String

        Dim mLen As Long, i As Long

        Dim mDigit As Long, mTemp As String

        Dim mNumText() As String



        mNumText = Split("không;một;hai;ba;bốn;năm;sáu;bảy;t  ám;chín", ";")

        mLen = Len(sNumber)

        For i = 1 To mLen

            mDigit = Mid(sNumber, i, 1)

            mTemp = mTemp & " " & mNumText(mDigit)

            If (mLen = i) Then Exit For

            Select Case (mLen - i) Mod 9

                Case 0

                    mTemp = mTemp & " tỷ"

                    If Mid(sNumber, i + 1, 3) = "000" Then i = i + 3

                    If Mid(sNumber, i + 1, 3) = "000" Then i = i + 3

                    If Mid(sNumber, i + 1, 3) = "000" Then i = i + 3

                Case 6

                    mTemp = mTemp & " triệu"

                    If Mid(sNumber, i + 1, 3) = "000" Then i = i + 3

                    If Mid(sNumber, i + 1, 3) = "000" Then i = i + 3

                Case 3

                    mTemp = mTemp & " nghìn"

                    If Mid(sNumber, i + 1, 3) = "000" Then i = i + 3

                Case Else

                    Select Case (mLen - i) Mod 3

                        Case 2

                            mTemp = mTemp & " trăm"

                        Case 1

                            mTemp = mTemp & " mươi"

                    End Select

            End Select

        Next

        'Loại bỏ trường hợp x00

        mTemp = Replace(mTemp, "không mươi không", "")

        'Loại bỏ trường hợp 00x

        mTemp = Replace(mTemp, "không mươi ", "linh ")

        'Loại bỏ trường hợp x0, x>=2

        mTemp = Replace(mTemp, "mươi không", "mươi")

        'Fix trường hợp 10

        mTemp = Replace(mTemp, "một mươi", "mười")

        'Fix trường hợp x4, x>=2

        mTemp = Replace(mTemp, "mươi bốn", "mươi tư")

        'Fix trường hợp x04 

        mTemp = Replace(mTemp, "linh bốn", "linh tư")

        'Fix trường hợp x5, x>=2

        mTemp = Replace(mTemp, "mươi năm", "mươi nhăm")

        'Fix trường hợp x1, x>=2

        mTemp = Replace(mTemp, "mươi một", "mươi mốt")

        'Fix trường hợp x15

        mTemp = Replace(mTemp, "mười năm", "mười lăm")

        'Bỏ ký tự space

        mTemp = Trim(mTemp)

        'Ucase ký tự đầu tiên

        Return UCase(Left(mTemp, 1)) & Mid(mTemp, 2)

End Function
				
Crystal:
'Hàm đọc số thành chữ cú pháp Crystal Report
'21.12.2010
'Sưu tầm by tihonphysics

Dim SoInput As String
SoInput=Replace (CStr ({@tongcongtienthanhtoan}),"," ,"" ) 'thay thế dấu phẩy (,) thành khoảng trắng
Dim SoInputTemp As String
SoInputTemp=SoInput

Dim KetQua As String, SoTien As String, Nhom As String, Dich As String
Dim Chu As String, S1 As String, S2 As String, S3 As String
Dim i , j , Vitri , S
Dim Hang, Doc, Dem
Dim KHONG_DONG,SO_LON,TRU,TRAM,MUOI,GIDO,NGANTY,TY,TRIEU,NGAN,DONG,XU
Dim MOT, HAI, BA, BON, NAM, SAU, BAY, TAM, CHIN ,CHAN, LE, MUOIMOT, MUOIMOTT

KHONG_DONG = "không đồng"
SO_LON = "số quá lớn"
TRU = "âm"
TRAM = "trăm"
MUOI = "mười"
GIDO = "gì đó"
NGANTY = "ngàn tỷ"
TY = "tỷ"
TRIEU = "triệu"
NGAN = "ngàn"
DONG = "đồng"
XU = "xu"
MOT = "một"
HAI = "hai"
BA = "ba"
BON = "bốn"
NAM = "năm"
SAU = "sáu"
BAY = "bảy"
TAM = "tám"
CHIN = "chín" 
CHAN = "chẵn"
LE = "lẽ"
MUOIMOT = "mười một"
MUOIMOTT = "mươi mốt" 

If CDbl(SoInput) = 0 Then
   formula = KHONG_DONG
Else
If Abs(CDbl(SoInput)) >= 1000000000000000 Then
   formula = SO_LON
Else
'If CDbl(SoInput) <= 0 Then
'   SoInput = TRU & Space(1)
'End If
SoTien = ToText(Abs(CDbl(SoInput)),"####################0.00")
SoTien = Right(Space(15) & SoTien, 18)
Hang = Array(TRAM, MUOI, GIDO)
Doc = Array(NGANTY, TY, TRIEU, NGAN, DONG, XU)
Dem = Array(MOT, HAI, BA, BON, NAM, SAU, BAY, TAM, CHIN)
For i = 1 To 6
   Nhom = Mid(SoTien, i * 3 - 2, 3)
   If Nhom <> Space(3) Then
   Select Case Nhom
   Case "000"
      If i = 5 Then
         Chu = DONG & Space(1)
      Else
         Chu = Space(0)
      End If
   Case ".00", ",00"
      Chu = CHAN
   Case Else
      S1 = Left(Nhom, 1)
      S2 = Mid(Nhom, 2, 1)
      S3 = Right(Nhom, 1)
      Chu = Space(0)
      Hang(3) = Doc(i)
      For j = 1 To 3
         Dich = Space(0)
         S = Val(Mid(Nhom, j, 1))
         If S > 0 Then
            Dich = Dem(S) & Space(1) & Hang(j) & Space(1)
         End If
   Select Case j
     Case 2
         if S = 1 then Dich = MUOI & Space(1)
         if S = 0 And S3 <> "0" then
            If ((S1 >= "1") And (S1 <= "9")) Or ((S1 = "0") And (i = 4)) Then
            Dich = LE & Space(1)             End If
         end if
      Case 3
         If S = 0 And Nhom <> Space(2) & "0" then Dich = Hang(j) & Space(1)
         If (S = 5 And S2 <> Space(1) And S2 <> "0") then
            Dich = "l" & Mid(Dich, 2)
         End If
   End Select
   Chu = Chu & Dich
      Next j
   End Select
           Vitri = InStr(1, Chu, MUOIMOT, 1)
            'If Vitri > 0 Then Mid(Chu, Vitri, 9) = MUOIMOTT
            KetQua = KetQua & Chu
         End If
      Next i
   End If
End If
Dim x As String
If CDbl(SoInputTemp) <= 0 Then
   x = TRU & Space(1)
   x=UCase(Left(x,1)) & Mid(x,2)
else
   x=""
End If

if x<>"" then
formula = x & KetQua
else
formula=UCase(Left(KetQua, 1)) & Mid(KetQua, 2)
end if

No comments:

Post a Comment