[VB.NET] Code chuyển số thành chữ!!!

Các thủ thuật liên quan đến xử lý chuỗi và thời gian

Moderators: tungcan5diop, QUANITGROBEST

Post Reply
User avatar
clarkkent
Mạnh Thường Quân
Mạnh Thường Quân
Posts: 1641
Joined: Wed 16/04/2008 11:25 am
Location: Chợ Lách - Bến Tre
Been thanked: 32 times
Contact:

[VB.NET] Code chuyển số thành chữ!!!

Post by clarkkent »

Thủ thuật:
Tác giả: gửi bởi Kasper » T.Ba 11/11/2008 4:03 pm
Mô tả:

Code: Select all

 Public Class DoiDonVi    Public Shared Function TienBangChu(ByVal sSoTien As String) As String        Dim DonVi() As String = {"", "nghìn ", "triệu ", "tỷ ", "nghìn ", "triệu "}        Dim so As String        Dim chuoi As String = ""        Dim temp As String        Dim id As Byte         Do While (Not sSoTien.Equals(""))            If sSoTien.Length <> 0 Then                so = getNum(sSoTien)                sSoTien = Left(sSoTien, sSoTien.Length - so.Length)                temp = setNum(so)                so = temp                If Not so.Equals("") Then                    temp = temp + DonVi(id)                    chuoi = temp + chuoi                End If                id = id + 1            End If        Loop        temp = UCase(Left(chuoi, 1))        Return temp & Right(chuoi, Len(chuoi) - 1) & "đồng."    End Function     Private Shared Function getNum(ByVal sSoTien As String) As String        Dim so As String         If sSoTien.Length >= 3 Then            so = Right(sSoTien, 3)        Else            so = Right(sSoTien, sSoTien.Length)        End If        Return so    End Function     Private Shared Function setNum(ByVal sSoTien As String) As String        Dim chuoi As String = ""        Dim flag0 As Boolean        Dim flag1 As Boolean        Dim temp As String         temp = sSoTien        Dim kyso() As String = {"không ", "một ", "hai ", "ba ", "bốn ", "năm ", "sáu ", "bảy ", "tám ", "chín "}        'Xet hang tram        If sSoTien.Length = 3 Then            If Not (Left(sSoTien, 1) = 0 And Left(Right(sSoTien, 2), 1) = 0 And Right(sSoTien, 1) = 0) Then                chuoi = kyso(Left(sSoTien, 1)) + "trăm "            End If            sSoTien = Right(sSoTien, 2)        End If        'Xet hang chuc        If sSoTien.Length = 2 Then            If Left(sSoTien, 1) = 0 Then                If Right(sSoTien, 1) <> 0 Then                    chuoi = chuoi + "linh "                End If                flag0 = True            Else                If Left(sSoTien, 1) = 1 Then                    chuoi = chuoi + "mười "                Else                    chuoi = chuoi + kyso(Left(sSoTien, 1)) + "mươi "                    flag1 = True                End If            End If            sSoTien = Right(sSoTien, 1)        End If        'Xet hang don vi        If Right(sSoTien, 1) <> 0 Then            If Left(sSoTien, 1) = 5 And Not flag0 Then                If temp.Length = 1 Then                    chuoi = chuoi + "năm "                Else                    chuoi = chuoi + "lăm "                End If            Else                If Left(sSoTien, 1) = 1 And Not (Not flag1 Or flag0) And chuoi <> "" Then                    chuoi = chuoi + "mốt "                Else                    chuoi = chuoi + kyso(Left(sSoTien, 1)) + ""                End If            End If        Else        End If        Return chuoi    End FunctionEnd Class 
• Hôm bây: www.tinsoftware.com ^ ^
Cố gắng lên...
User avatar
clarkkent
Mạnh Thường Quân
Mạnh Thường Quân
Posts: 1641
Joined: Wed 16/04/2008 11:25 am
Location: Chợ Lách - Bến Tre
Been thanked: 32 times
Contact:

Re: [VB.NET] Code chuyển số thành chữ!!!

Post by clarkkent »

Thủ thuật:
Tác giả: gửi bởi hoangthu1974 » T.Tư 12/11/2008 9:09 am
Mô tả:

Code: Select all

    '------------------------------------------------------------------    ' Function Name: Num2Text    ' Description  : Change the numeric to text speech    ' Author       : Hoang Thu    ' Date Create  : 23/12/2007    '------------------------------------------------------------------    Function Num2Text(ByVal s As String, Optional ByVal Local As Boolean = False) As String        'Optional ByVal Local As Boolean = False 'Nam Kỳ Reading        'Optional ByVal Local As Boolean = True 'Bắc Kỳ Reading        Dim DS As Char = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator        Dim GS As Char = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator        Dim fDS As Boolean = False        Dim fDecAdd As Boolean = False        Dim so() As String = {"không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín"}        Dim hang() As String = {"", "ngàn", "triệu", "tỷ"}        If Local Then            hang(1) = "nghìn"        End If        Dim i, j, cntDS, donvi, chuc, tram As Integer        Dim str As String        str = ""        s = s.Replace(GS, "")        If s.Substring(s.Length - 1, 1) = DS Then s = s.Substring(0, s.Length - 1)         i = s.Length        While s.Substring(0, 1) = "0"            s = s.Substring(1, s.Length - 1)        End While        If s.Substring(0, 1) = DS Then s = "0" & s        cntDS = 0        If InStr(s, DS) Then            For i = 0 To s.Length - 1 Step 1                If s.Substring(i, 1) = DS Then                    cntDS += 1                End If            Next        End If        If cntDS > 1 Then Return ""        If cntDS > 0 Then            While s.Substring(s.Length - 1, 1) = "0"                s = s.Substring(0, s.Length - 1)            End While        End If        If s.Substring(s.Length - 1, 1) = DS Then s = s.Substring(0, s.Length - 1)         i = s.Length - 1        If i = 0 Then            str = ""        Else            j = 0            Do While i >= 0                If s.Substring(i, 1) = DS Then                    fDS = True                    i -= 1                    GoTo DecimalAdd                Else                    donvi = Int(s.Substring(i, 1))                    i -= 1                End If                 If i > -1 Then                    If s.Substring(i, 1) = DS Then                        i -= 1                        chuc = -1                        tram = -1                        fDS = True                        GoTo NumberRead                    Else                        chuc = Int(s.Substring(i, 1))                    End If                Else                    chuc = -1                End If                i -= 1                 If i > -1 Then                    If s.Substring(i, 1) = DS Then                        i -= 1                        tram = -1                        fDS = True                        GoTo NumberRead                    Else                        tram = Int(s.Substring(i, 1))                    End If                Else                    tram = -1                End If                i -= 1NumberRead:                If donvi > 0 Or chuc > 0 Or tram > 0 Or j = 3 Then str = hang(j) & " " & str                j += 1                 If j > 3 Then j = 1                 If donvi = 1 And chuc > 1 Then                    str = "mốt" & " " & str                ElseIf donvi = 4 And chuc > 1 Then                    If Local Then                        str = "tư" & " " & str                    Else                        str = so(donvi) & " " & str                    End If                ElseIf donvi = 5 Then                    If chuc > 0 Then                        str = "lăm" & " " & str                    Else                        str = so(donvi) & " " & str                    End If                Else                    If donvi <> 0 Then str = so(donvi) & " " & str                End If                 If chuc < 0 Then                    If Not fDS Then Exit Do                Else                    If chuc = 0 And donvi > 0 Then                        str = "lẻ" & " " & str                    ElseIf chuc = 1 Then                        str = "mười" & " " & str                    ElseIf chuc > 1 Then                        str = so(chuc) & " " & "mươi" & " " & str                    End If                End If                If tram < 0 Then                    If Not fDS Then Exit Do                Else                    If tram > 0 Or chuc > 0 Or donvi > 0 Then                        str = so(tram) & " " & "trăm" & " " & str                    End If                End IfDecimalAdd:                If fDS Then                    str = "phảy " & str                    j = 0                    fDS = False                    fDecAdd = True                End If            Loop        End If         If str.Length > 0 Then            str = str.Trim            str = str.Replace("  ", " ")            str = UCase(str.Substring(0, 1)) & str.Substring(1, str.Length - 1)            Return str        Else            Return ""        End If    End Function
• Hôm bây: www.tinsoftware.com ^ ^
Cố gắng lên...
User avatar
clarkkent
Mạnh Thường Quân
Mạnh Thường Quân
Posts: 1641
Joined: Wed 16/04/2008 11:25 am
Location: Chợ Lách - Bến Tre
Been thanked: 32 times
Contact:

Re: [VB.NET] Code chuyển số thành chữ!!!

Post by clarkkent »

Thủ thuật:
Tác giả: gửi bởi thanhbinhna vào ngày Chủ nhật 20/05/2007 3:09 pm
Mô tả:

khá sơ sài nhưng gọn, chuyển từ VB6

Code: Select all

    Public Function Tienchu(ByVal sotien As Double) As String        Dim tien(4) As String        Dim chu, tmpchuoi, bakytu As String        Dim i As Integer        tien(0) = " tỷ"        tien(1) = " triệu"        tien(2) = " nghìn"        tien(3) = "đồng"        chu = ""        If sotien < 0 Then            chu = chu & " Tru"        End If        tmpchuoi = Microsoft.VisualBasic.Right(Space(12) & CStr(sotien), 12)        For i = 1 To 4            bakytu = Trim(Mid(tmpchuoi, i * 3 - 2, 3))            If bakytu <> "" Then                chu = chu & doisochu(CInt(bakytu))                chu = chu & tien(i - 1) & ""            End If        Next        If chu = "đồng" Then            chu = "Không đồng"        End If        Tienchu = chu    End Function
• Hôm bây: www.tinsoftware.com ^ ^
Cố gắng lên...
User avatar
clarkkent
Mạnh Thường Quân
Mạnh Thường Quân
Posts: 1641
Joined: Wed 16/04/2008 11:25 am
Location: Chợ Lách - Bến Tre
Been thanked: 32 times
Contact:

Re: [VB.NET] Code chuyển số thành chữ!!!

Post by clarkkent »

Thủ thuật:
Tác giả: gửi bởi anhlt vào ngày Thứ 2 25/06/2007 5:39 pm
Mô tả:
code này dài ghê :))

Code: Select all

    Function num2Text(ByVal str1 As String) As String        Dim str As String        Dim i As Integer        Dim tg As String        Dim j As Integer        Dim sval As Integer        Dim sSo As String        Dim sNum2Text As String        Dim k As Integer        Dim l As Integer        str = str1        i = len(str)        k = i \ 3        l = 0        Do While l <= k            If l < k Then                tg = mid(str, i - (l + 1) * 3 + 1, 3)            Else                tg = Microsoft.VisualBasic.Left(str, i - l * 3)            End If            sSo = ""            For j = 1 To len(tg)                sval = val(mid(tg, len(tg) - j + 1, 1))                Select Case sval                    Case 0                        Select Case j                            Case 3                                If val(tg) > 0 Then                                    sSo = "không trăm " & sso                                End If                            Case 2                                If val(mid(tg, 3, 1)) > 0 Then                                    sSo = "linh " & sso                                End If                            Case 1                         End Select                    Case 1                        Select Case j                            Case 3                                sSo = "một trăm " & sso                            Case 2                                sSo = "mười " & sso                            Case 1                                If len(tg) > 1 And val(mid(tg, 2, 1)) > 1 Then                                    sSo = "mốt" & sso                                Else                                    sSo = "một" & sso                                End If                        End Select                    Case 2                        Select Case j                            Case 3                                sSo = "hai trăm " & sso                            Case 2                                sSo = "hai mươi " & sso                            Case 1                                sSo = "hai" & sso                        End Select                    Case 3                        Select Case j                            Case 3                                sSo = "ba trăm " & sso                            Case 2                                sSo = "ba mươi " & sso                            Case 1                                sSo = "ba" & sso                        End Select                    Case 4                        Select Case j                            Case 3                                sSo = "bốn trăm " & sso                            Case 2                                sSo = "bốn mươi " & sso                            Case 1                                sSo = "bốn" & sso                        End Select                    Case 5                        Select Case j                            Case 3                                sSo = "năm trăm " & sso                            Case 2                                sSo = "năm mươi " & sso                            Case 1                                If len(tg) > 1 And val(mid(tg, 2, 1)) >= 1 Then                                    sSo = "lăm " & sso                                Else                                    sSo = "năm " & sso                                End If                        End Select                    Case 6                        Select Case j                            Case 3                                sSo = "sáu trăm " & sso                            Case 2                                sSo = "sáu mươi " & sso                            Case 1                                sSo = "sáu" & sso                        End Select                    Case 7                        Select Case j                            Case 3                                sSo = "bảy trăm " & sso                            Case 2                                sSo = "bảy mươi " & sso                            Case 1                                sSo = "bảy" & sso                        End Select                    Case 8                        Select Case j                            Case 3                                sSo = "tám trăm " & sso                            Case 2                                sSo = "tám mươi " & sso                            Case 1                                sSo = "tám" & sso                        End Select                    Case 9                        Select Case j                            Case 3                                sSo = "chín trăm " & sso                            Case 2                                sSo = "chín mươi " & sso                            Case 1                                sSo = "chín" & sso                        End Select                End Select            Next            Select Case l                Case 1, 4                    If sso <> "" Then                        snum2text = sso & " nghìn" & " " & snum2text                    End If                Case 2, 5                    If sso <> "" Then                        snum2text = sso & " triệu" & " " & snum2text                    End If                Case 3, 6                    If sso <> "" Then                        snum2text = sso & " tỷ" & " " & snum2text                    End If                Case Else                    snum2text = sso            End Select            l = l + 1        Loop        num2Text = snum2text    End Function
• Hôm bây: www.tinsoftware.com ^ ^
Cố gắng lên...
User avatar
clarkkent
Mạnh Thường Quân
Mạnh Thường Quân
Posts: 1641
Joined: Wed 16/04/2008 11:25 am
Location: Chợ Lách - Bến Tre
Been thanked: 32 times
Contact:

Re: [VB.NET] Code chuyển số thành chữ!!!

Post by clarkkent »

Thủ thuật:
Tác giả: gửi bởi PhamTienSinh vào ngày Thứ 4 18/07/2007 3:06 pm
Mô tả:

Code: Select all

   Public Class NumBer2TextBase        Private strDigit As String() = {"không ", "một ", "hai ", "ba ", "bốn ", "năm ", _         "sáu ", "bảy ", "tám ", "chín "}        Private strGroup As String() = {"nghìn ", "triệu ", "tỷ "}         Public Function Transtalte(ByVal iNum As String) As String            Try                Dim iG As Short                Dim k As Byte = 0                Dim st As String, s As String = ""                For i As Short = CShort((iNum.Length - 6)) To iNum.Length Mod 3 Step -3                    iG = Short.Parse(iNum.Substring(i, 3))                    st = Group3(iG)                    If st <> "" Then                        st += strGroup(k)                    ElseIf k Mod 3 = 2 Then                        st = strGroup(k)                    End If                    k = CByte(((k + 1) Mod 3))                    s = st + s                Next                If iNum.Length Mod 3 <> 0 AndAlso iNum.Length > 3 Then                    iG = Short.Parse(iNum.Substring(0, iNum.Length Mod 3))                    st = Group3(iG)                    st += strGroup(k)                    s = st + s                End If                s = s + Group3(Short.Parse(iNum.Substring(Math.Max(iNum.Length - 3, 0))))                If s = "" Then                    s = "không"                ElseIf s.Substring(0, 13) = "không trăm lẻ" Then                    s = s.Substring(14)                ElseIf s.Substring(0, 11) = "không trăm " Then                    s = s.Substring(11)                End If                Return s            Catch ex As Exception                Return Nothing            End Try        End Function         Private Function Group3(ByVal iNum As Short) As String            Dim iDg As Byte() = New Byte(2) {}            Dim sResult As String() = New String(2) {}            If iNum = 0 Then                Return ""            End If             iDg(2) = CByte((iNum / 100))            iDg(1) = CByte(((iNum / 10) Mod 10))            iDg(0) = CByte((iNum Mod 10))             sResult(2) = strDigit(iDg(2)) + "trăm "            If iDg(1) >= 2 Then                sResult(1) = strDigit(iDg(1)) + "mươi "            ElseIf iDg(1) = 1 Then                sResult(1) = "mười "            ElseIf iDg(1) = 0 Then                sResult(1) = "lẻ "            End If             sResult(0) = strDigit(iDg(0))             If iDg(0) = 0 Then                sResult(0) = ""                If iDg(1) = 0 Then                    sResult(1) = ""                End If            ElseIf iDg(0) = 1 AndAlso iDg(1) >= 2 Then                sResult(0) = "mốt "            ElseIf iDg(0) = 5 AndAlso iDg(1) >= 1 Then                sResult(0) = "lăm "            End If             Return sResult(2) + sResult(1) + sResult(0)        End Function        Public Shared Function Translate(ByVal Number As String) As String            Dim N2T As New NumBer2TextBase            Return N2T.Transtalte(Number)        End Function     End Class    
sử dụng

Code: Select all

MsgBox(NumBer2TextBase.Translate("10000000000000000000000"))
hoặc

Code: Select all

Dim n2t As New NumBer2TextBase MsgBox(n2t.Transtalte("123"))
• Hôm bây: www.tinsoftware.com ^ ^
Cố gắng lên...
User avatar
clarkkent
Mạnh Thường Quân
Mạnh Thường Quân
Posts: 1641
Joined: Wed 16/04/2008 11:25 am
Location: Chợ Lách - Bến Tre
Been thanked: 32 times
Contact:

Re: [VB.NET] Code chuyển số thành chữ!!!

Post by clarkkent »

Thủ thuật:
Tác giả: gửi bởi ALTERMIGHTY vào ngày Thứ 4 18/07/2007 3:28 pm
Mô tả:

Code: Select all

Imports System.MathPublic Class DocChuoiSo     Private Function DocCumBa(ByVal nd As String) As String        Dim so() As String = {"không ", "một ", "hai ", "ba ", "bốn ", "năm ", "sáu ", "bảy ", "tám ", "chín "}        Dim kq As String = ""        Select Case Len(nd)            Case 1 : Return so(CInt(nd))            Case 2                Select Case nd(0)                    Case "1" : kq &= "mười "                    Case "0" : If nd.Chars(1) <> "0" Then kq &= "lẻ "                    Case Else : kq &= so(CInt(Left(nd, 1))) & "mươi "                End Select                Select Case nd(1)                    Case "5" : If nd(0) = "0" Then kq &= "năm " Else kq &= "lăm "                    Case "0"                    Case "1" : If nd(0) = "1" Then kq &= "một " Else kq &= "mốt "                    Case Else : kq &= so(CInt(nd(1).ToString))                End Select            Case 3 : If nd <> "000" Then kq = so(CInt(Left(nd, 1))) & "trăm " & DocCumBa(Right(nd, 2))        End Select        Return kq    End Function     Public Function DocSo(ByVal nd As String, Optional ByVal dauthapphan As Char = ".") As String        Dim kq As String = ""        If Left(nd, 1) = "-" Then            kq &= "âm "            nd = nd.Remove(0, 1)        End If        If nd.Length <= 3 Then Return kq & DocCumBa(nd)        Dim hang() As String = {"", "ngàn ", "triệu ", "tỷ ", "tỷ "}, k As Integer = 0        Dim phandoc() As String = Split(nd, CStr(dauthapphan))        Dim phanduong As String = ""        If UBound(phandoc) = 0 Then            For i As Integer = nd.Length - 3 To -2 Step -3                Dim cumso As String = DocCumBa(nd.Substring(Max(i, 0), Min(3, 3 + i)))                If cumso <> "" Or k = 3 Then phanduong = cumso & hang(k) & phanduong                If k < 3 Then k += 1 Else k = 1            Next        Else : phanduong = DocSo(phandoc(0)) & "phẩy " & DocSo(phandoc(1))        End If        Return kq & phanduong    End Function End Class
• Hôm bây: www.tinsoftware.com ^ ^
Cố gắng lên...
User avatar
clarkkent
Mạnh Thường Quân
Mạnh Thường Quân
Posts: 1641
Joined: Wed 16/04/2008 11:25 am
Location: Chợ Lách - Bến Tre
Been thanked: 32 times
Contact:

Re: [VB.NET] Code chuyển số thành chữ!!!

Post by clarkkent »

Thủ thuật:
Tác giả: gửi bởi honamhai vào ngày Thứ 7 21/07/2007 8:18 am
Mô tả:
code này còn hạn chế

Code: Select all

    Public Function VND(ByVal Baonhieu As Double) As String        Dim KetQua, SoTien As String        Dim nhom, chu As String        Dim dich, s1 As String        Dim s2, s3 As String        Dim i, j As Byte        Dim Vitri As Byte        Dim s As Double        Dim hang() As String = {"Không", "trăm", "mười", "gì đó"}        Dim doc() As String = {"Không", "tỷ", "triệu", "ngàn", "đồng", "xu"}        Dim dem() As String = {"Không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín"}        On Error Resume Next        If Baonhieu = 0 Then            KetQua = "Không đồng"        Else            If System.Math.Abs(Baonhieu) > 999999999999.99 Then                KetQua = "Số quá lớn"            Else                If Baonhieu < 0 Then                    KetQua = "Trừ" & Space(1)                Else                    KetQua = Space(0)                End If                SoTien = Format(System.Math.Abs(Baonhieu), "###########0.00")                SoTien = Microsoft.VisualBasic.Right(Space(12) & SoTien, 15)                For i = 1 To 5                    nhom = Mid(SoTien, i * 3 - 2, 3)                    If nhom <> Space(3) Then                        Select Case nhom                            Case "000"                                If i = 4 Then                                    chu = "đồng" & Space(1)                                Else                                    chu = Space(0)                                End If                            Case ".00", ",00"                                chu = "chẵn"                            Case Else                                s1 = Microsoft.VisualBasic.Left(nhom, 1)                                s2 = Mid(nhom, 2, 1)                                s3 = Microsoft.VisualBasic.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 And s = 1                                            dich = "mươi" & Space(1)                                        Case 3 And s = 0 And nhom <> Space(2) & "0"                                            dich = hang(j) & Space(1)                                        Case 3 And s = 5 And s2 <> Space(1) And s2 <> "0"                                            dich = "l" & Mid(dich, 2)                                        Case 2 And s = 0 And s3 <> "0"                                            If (s1 >= "1" And s1 <= "9") Or (s1 = "0" And i = 4) Then                                                dich = "lẻ" & Space(1)                                            End If                                    End Select                                    chu = chu & dich                                Next j                        End Select                        Vitri = InStr(1, chu, "mươi một", CompareMethod.Text)                        If Vitri > 0 Then Mid(chu, Vitri, 9) = "mươi mốt"                        KetQua = KetQua & chu                    End If                Next i            End If        End If        VND = UCase(Microsoft.VisualBasic.Left(KetQua, 1)) & Mid(KetQua, 2)    End Function
• Hôm bây: www.tinsoftware.com ^ ^
Cố gắng lên...
User avatar
clarkkent
Mạnh Thường Quân
Mạnh Thường Quân
Posts: 1641
Joined: Wed 16/04/2008 11:25 am
Location: Chợ Lách - Bến Tre
Been thanked: 32 times
Contact:

Re: [VB.NET] Code chuyển số thành chữ!!!

Post by clarkkent »

Thủ thuật:
Tác giả: gửi bởi cobecauvong vào ngày Thứ 3 28/08/2007 10:55 am
Mô tả:
cái này bên C#

Code: Select all

using System;namespace Num2String{   /// <summary>   /// Summary description for Num2Str.   /// </summary>   public class Num2Str   {      public Num2Str()      {         //         // TODO: Add constructor logic here         //      }      // Hàm này có thực hiện cắt các số 0      // ví dụ 005 sẽ đọc là không trăm linh năm      private string Group32StrX(string num)      {            string[] No = {"không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín"};         string kq, tram, chuc, donvi;         // Trăm         if(num.Substring(0, 1) == "0")         { tram = "";}         else         { tram = No[Convert.ToByte(num.Substring(0,1))] + " trăm "; }         // Chục         switch (num.Substring(1, 1))         {            case "0":if (num.Substring(2,1) != "0" && num.Substring(0,1) != "0")                   {                      chuc = "linh "; }                   else { chuc  = ""; } ; break;            case "1":chuc = "mười " ;break;            default:               chuc = No[Convert.ToByte(num.Substring(1,1))] + " mươi "; break;         }               // Đơn vị         switch (num.Substring(2, 1))         {            case "0": donvi = "" ; break;            case "1": if ((num.Substring(1,1) == "0") || (num.Substring(1,1) == "1"))                    {                       donvi = "một";                    }                    else                    {                       donvi = "mốt";                    }; break;            case "5":               if (num.Substring(1,1) != "0")               {                  donvi = "lăm";               }               else               {                  donvi = "năm";               };break;            default:               donvi = No[Convert.ToByte(num.Substring(2,1))]; break;         }               kq = tram + chuc + donvi;         return kq;      }       private string IntNum2Str(string num)      {         string[] Cap = {"", " nghìn ", " triệu ", " tỷ ", " nghìn tỷ ", " triệu tỷ ", " tỷ tỷ ", " nghìn tỷ tỷ "};         string kq = "" , str = num, g3, kqtg;         int caps = 0;         while(str.Length > 3)         {            g3 = str.Substring(str.Length - 3,3);            str = str.Substring(0, str.Length - 3);            if (g3!="000")            { kqtg =  Group32StrX(g3)+ Cap[Convert.ToByte(caps)];}            else{ kqtg = "";}            kq = kqtg + kq;            caps++;         }         //Chuẩn bị trước khi sử dụng hàm Group32Str1         while (str.Length <3 )         { str = "0" + str; }                  if ((str == "000") && (num.Length <=3))         { kqtg = "không"; }         else         { kqtg = Group32StrX(str) + Cap[Convert.ToByte(caps)]; }         kq = kqtg + kq;         return kq;      }       private string FracNum2Str(string num)      {         string[] No = {"không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín"};         string kq ="";         for (int i=0; i<num.Length; i++)         {            kq += No[Convert.ToByte(num.Substring(i,1))] + " ";         }         return kq;      }       private string No2Str(string num)      {         string intstr, fracstr, am;         // Xử lý khi là số âm         if (num.Substring(0,1) == "-")         {            am ="âm ";            num = num.Replace("-", "");         }         else {am = "";}               string[] str = num.Split('.');         // Số quá lớn nhiều hơn 27 chữ số         if (str[0].Length > 28)            throw new Exception("Số lớn quá không hiển thị được! ");          string s;               // Xử lý phần số, nếu là có số thập phân hoặc không         if (str.Length == 2)         {            intstr = IntNum2Str(str[0]);            if (str[1].Length <=2)            {               if (str[1].Substring(0,1) == "0")               {                  fracstr = FracNum2Str(str[1]);               }               else               {                  fracstr = IntNum2Str(str[1]);               }            }            else            {               fracstr = FracNum2Str(str[1]);            }            s = (intstr + " phảy " + fracstr);         }         else         {            intstr = IntNum2Str(str[0]);            s = intstr;         }         s = am + s;         string chuhoa = s.Substring(0,1).ToUpper();         s = s.Substring(1, s.Length-1);         return (chuhoa + s);      }       public string NumNormalize(string num)      {         char ThousandSpace = ',';         char PointScape = '.';         string[] s = num.Split('.');         string g3, str = "";         while(s[0].Length > 3)         {            g3 = s[0].Substring(s[0].Length - 3,3);            s[0] = s[0].Substring(0, s[0].Length - 3);            str = ThousandSpace + g3 + str;         }         str = s[0] + str;         if (s.Length == 2)         {            str = (str + PointScape + s[1]);         }         return str.Replace("-,", "-");      }       public string NumberToString(string no)      {         // xử lý trường hợp dáu phảy thay cho dấu chấm         if (no.IndexOf(",", 0, 1) != 0) {no = no.Replace(",", ".");}         // Xoá các ký tự trắng ở đầu và cuối         no = no.Trim();         // Xử lý khi nó là chữ chứ không phải là số         if (no == "0") return "không";         if (no == "") return "không";         double val;         try         {            val = Convert.ToDouble(no);         }         catch         {            throw new Exception("Đây không phải là số");         }         // tiêu diệt các số không         while (no.Substring(0, 1) == "0")         {            no = no.Substring(1, no.Length-1);         }          if (no.IndexOf(".", 0, 1) != -1)         {            while (no.Substring(no.Length-1, 1) == "0")            {               no = no.Substring(0, no.Length-1);            }         }         no = No2Str(no);          return no;      }   }} 
• Hôm bây: www.tinsoftware.com ^ ^
Cố gắng lên...
User avatar
clarkkent
Mạnh Thường Quân
Mạnh Thường Quân
Posts: 1641
Joined: Wed 16/04/2008 11:25 am
Location: Chợ Lách - Bến Tre
Been thanked: 32 times
Contact:

Re: [VB.NET] Code chuyển số thành chữ!!!

Post by clarkkent »

Thủ thuật:
Tác giả: gửi bởi Kỳ Nam vào ngày Thứ 3 28/08/2007 11:19 am
Mô tả:

Code: Select all

    Dim chữsố() As String = {"không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín"}    Dim đơnvị() As String = {"đơn vị", "ngàn", "triệu", "tỉ"}     Function đọc(ByVal số As String) As String        số = số.TrimStart("0")        'bỏ những số "0" ở đầu tiên         If số.Length = 0 Then Return ""         số = số.Replace(" ", "").Replace(",", "").Replace(".", "")        'nếu muốn cho phép có dấu " " hay "," hay "." trong số để dễ nhìn thì uncomment dòng đây         Dim kq As String = ""        Dim chiềudài As Integer = số.Length         'dùng biến để lưu lại từng nhóm ba chữ số dể dễ xài        Dim sốnhóm As Integer = Math.Ceiling(chiềudài / 3)        'tính số lượng nhóm 3 chữ số        Dim nhóm(sốnhóm - 1) As String         'cóp nhóm đầu tiên , rồi lần lượt những nhóm còn lại , j là chiều dài nhóm đầu tiên        Dim j As Integer = chiềudài - (sốnhóm - 1) * 3        nhóm(0) = số.Substring(0, j)        For i As Integer = 1 To sốnhóm - 1            nhóm(i) = số.Substring(j + (i - 1) * 3, 3)        Next         For i As Integer = 0 To nhóm.Length - 1            kq &= đọcnhóm3số(nhóm(i), tínhđơnvị(nhóm.Length - 1 - i)) & " "        Next         Return kq.Trim.Replace("  ", " ")        'để chắc chắn không có 2 dấu cách đứng liền nhau và 0 có dấu cách ở 2 đầu    End Function     Function tínhđơnvị(ByVal n As Integer) As String        'hàm đệ qui rất đơn giản        If n <= 3 Then            Return đơnvị(n)        Else            Return tínhđơnvị(n - 3) & " " & đơnvị(3)        End If    End Function     Function đọcnhóm3số(ByVal số As String, ByVal đơnvị As String) As String        Dim kq As String = ""        Dim l As Integer = số.Length         số = số.PadLeft(3, "0")         If số = "000" Then Return ""        'không đọc những nhóm "000" như trong "1.000.000.000"         If số.StartsWith("00") Then Return đọcsốhàngđơnvị(Val(số(2)), 0, l = 3) & " " & đơnvị        'chỗ này để tránh khó nghe khi đọc "1.000.000.001" , nó sẽ bỏ qua từ "không trăm" và chỉ đọc "một tỉ lẻ một đơn vị" , nếu không thích thì xóa dòng đây đi cũng được         kq &= đọcsốhàngtrăm(Val(số(0)), l = 3)        kq &= đọcsốhàngchục(Val(số(1)))        kq &= đọcsốhàngđơnvị(Val(số(2)), Val(số(1)), l = 3)         Return kq & " " & đơnvị    End Function     Function đọcsốhàngtrăm(ByVal i As Integer, ByVal đọcsốkhông As Boolean) As String        'biến đọcsốkhông để tránh đọc chữ "không trăm" trong số < 100 như "75" , nếu không dùng biến này thì sẽ đọc là "không trăm bảy mươi lăm"         If i = 0 Then            If đọcsốkhông Then                Return "không trăm "            Else                Return ""            End If        Else            Return chữsố(i) & " trăm "        End If    End Function     Function đọcsốhàngchục(ByVal i As Integer) As String        Select Case i            Case 0                Return ""            Case 1                Return "mười "            Case Else                Return chữsố(i) & " mươi "        End Select    End Function     Function đọcsốhàngđơnvị(ByVal i As Integer, ByVal hàngchục As Integer, ByVal đọcchữlẻ As Boolean) As String        'biến đọcchữlẻ để tránh đọc chữ "lẻ" trong số < 10 như "2" , nếu không dùng biến này thì sẽ đọc là "lẻ hai"        'các lệnh điều khiển If...then và select...case chỉ là để đọc cho giống tiếng việt         If i = 0 Then            Return ""        Else            If hàngchục = 0 Then                If đọcchữlẻ Then                    Return "lẻ " & chữsố(i)                Else                    Return chữsố(i)                End If            Else                Select Case i                    Case 1                        If hàngchục = 1 Then                            Return "một"                        Else                            Return "mốt"                        End If                    Case 5                        Return "lăm"                    Case Else                        Return chữsố(i)                End Select            End If        End If     End Function 
• Hôm bây: www.tinsoftware.com ^ ^
Cố gắng lên...
quang010692
Posts: 4
Joined: Thu 05/02/2009 8:44 pm

Re: [VB.NET] Code chuyển số thành chữ!!!

Post by quang010692 »

hàm left và right ko có sẵn trong vb.net....
có cách nào trim nhanh hơn ko?
User avatar
clarkkent
Mạnh Thường Quân
Mạnh Thường Quân
Posts: 1641
Joined: Wed 16/04/2008 11:25 am
Location: Chợ Lách - Bến Tre
Been thanked: 32 times
Contact:

Re: [VB.NET] Code chuyển số thành chữ!!!

Post by clarkkent »

quang010692 wrote:hàm left và right ko có sẵn trong vb.net....
có cách nào trim nhanh hơn ko?
vẫn xài được

Code: Select all

        Microsoft.VisualBasic.Left()        Microsoft.VisualBasic.Right()
trim thì vầy thôi

Code: Select all

Trim("chuỗi")
• Hôm bây: www.tinsoftware.com ^ ^
Cố gắng lên...
User avatar
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Posts: 1123
Joined: Wed 24/09/2008 4:04 pm
Location: TPHCM
Has thanked: 1 time
Been thanked: 27 times

Re: [VB.NET] Code chuyển số thành chữ!!!

Post by tungcan5diop »

cái Class của anh Phạm Tiên Sinh chạy chưa OK
xem hình
Debug cái Class cùa anh PTS
Debug cái Class cùa anh PTS
cái hàm của Kỳ Nam thì chạy OK rồi
xem hình
Attachments
Debug hàm của Kỳ Nam
Debug hàm của Kỳ Nam
Hỡi thế gian bug(lỗi) là gì?
Mà sửa...hoài không hết!
datproit
Posts: 3
Joined: Sat 21/11/2009 2:07 pm

đọc một số thành chữ!

Post by datproit »

[tested=]sau này khi post bài bạn nhớ cho code vào thẻ,thẻ code nằm ở cái ComboBox "Programing Language",mình đã di chuyển bài viết của bạn sang đây cho gọn,sau này nên tìm kiếm xem có trùng chủ đề hay ko trước khi post bài bạn nhé. Người sửa tungcan5diop[/tested]
đây là modul giúp bạn có thể đọc một số thành lời (chuyển đổi số thành dạng text)
có lẽ bạn đã gặp nhiều trong quá trình học nhưng phạm vi đọc của chương trình này tương đối lớn nên thuật toán có khác bạn nhé. bạn nào thích Vb.net có sẵn mã nguồn đây.
các pác Pro đọc vào đừng chê nha , em mới học lớp 9 thôi!
Ai thích suy nghĩ thêm thì còn có mã viết bằng Pascal luôn, nhưng mình không up ở diễn dàn Vb. liên hệ với mình qua nick yahoo: :x datproit mình sẽ gửi Code cho '{ muốn làm quen ó}
modul đây, các pá dùng hàm Read để đọc số nhé dữ liệu vào là String
hoặc download ở địa chỉ cho nhanh:
http://www.mediafire.com/file/0lulzyyzyye/ReadNumber.vb

Code: Select all

Module ReadNumber    Public donvi(0 To 10)    'hàm KiemTraSo( str) kiểm tra dữ liệu nhập vào có phải là các kí tự số hay không    Function KiemTraSo(ByVal str As String) As String        Dim i        kiemtraso = True        For i = 0 To Len(str)            ' 0 có mã ASCII là 48            ' 9 có mã ASCII là 58            If Not ((Asc(str(0)) > 47) And (Asc(str(0)) < 57)) Then                KiemTraSo = False                Exit Function            End If        Next    End Function    'Thủ tục Load() gán giá trị cho biến mảng Donvi (0 to 10) chứa các tên gọi số    Private Sub load()        donvi(0) = ""        donvi(1) = "một"        donvi(2) = "hai"        donvi(3) = "ba"        donvi(4) = "bốn"        donvi(5) = "năm"        donvi(6) = "sáu"        donvi(7) = "bảy"        donvi(8) = "tám"        donvi(9) = "chín"        donvi(10) = "mười"    End Sub    ' hàm Copy sẽ sao chép một chuổi con từ chuổi mẹ    Function copy(ByVal st As String, ByVal start As Integer, ByVal length As Integer) As String        Dim l = Microsoft.VisualBasic.Left(st, start + length)        Dim r = Microsoft.VisualBasic.Right(l, length)        copy = r    End Function     'hàm dochangchuc() đọc các số hàng chục, tức có hai chữ số    ' viết hàm này có mục đích là tránh sự trùng lập khi đọc chữ số hàm trăm ở hàm readNumber()    Function docHangChuc(ByVal number As String) As String        Dim num = CInt(number)        Dim TextOut As String = ""        Dim donV, chuc, tram        donV = donvi(num Mod 10)        ' chữ số hàm đơn vị { lưu ý là chỉ lấy 1 số vào trả về tên gọi}        chuc = donvi((num Mod 100) \ 10) ' chữ số hàng trăm        tram = donvi((num Mod 1000) \ 100) 'chữ số hàng ngàn         Select Case num            Case 10                TextOut = "mười"            Case 11 To 19                TextOut = "mười " & donV            Case 20 To 99                If num Mod 10 = 1 Then ' các số có tận cùng là số 1, đọc là "mốt"                    TextOut = chuc & " mươi mốt"                Else                    If num Mod 10 <> 5 Then                        TextOut = chuc & " mươi " & donV                    Else ' các số có tận cùng là số 5 , đọc là "lăm"                        TextOut = chuc & " mươi lăm"                    End If                End If        End Select        docHangChuc = TextOut ' trả giá trị cho hàm    End Function    Function ReadNumber(ByVal number As String) As String        Dim TextOut As String = ""        If number <> "" Then             Dim num = CInt(number)            Dim donV, chuc, tram             donV = donvi(num Mod 10)            chuc = donvi((num Mod 100) \ 10)            tram = donvi((num Mod 1000) \ 100)             Select Case num                Case 0                    TextOut = "không"                Case 1 To 9                    TextOut = donV                Case 10 To 99                    TextOut = docHangChuc(num)                Case 100 To 999                    If num Mod 100 = 0 Then TextOut = tram & " trăm"                    If ((num Mod 100) \ 10) = 0 Then                        TextOut = tram & " trăm lẻ " & donV                    Else                        TextOut = tram & " trăm " & docHangChuc(num Mod 100)                    End If            End Select        End If        ReadNumber = TextOut    End Function     Function readInt(ByVal StrNum As String) As String        Dim temp = ""        If KiemTraSo(StrNum) Then            load()            Dim textO = StrNum            Dim i, vitri, sokitu, solop            Dim MangLop(0 To 6) ' lưu trữ 3 số trên một phần tử            Dim MangTenLop(0 To 6) ' lưu trữ tên các lớp của số            MangTenLop(0) = "" 'lớp 0 không tồn tại            MangTenLop(1) = "" 'lớp thứ 1 có 3 chữ số tức là hàng trăm, nhưng ta đã sử lí số hàng trăm ở hàm readNumber rồi nên bỏ trống chổ này            MangTenLop(2) = " nghìn "            MangTenLop(3) = " triệu "            MangTenLop(4) = " tỉ "            MangTenLop(5) = " nghìn tỉ "            MangTenLop(6) = " triệu tỉ "            ' bạn có thể mở rộng thêm phạm vi đọc            ' bằng cách thêm phần tử cho biến mảng MangTenLop               sokitu = Len(textO)            If sokitu Mod 3 = 0 Then                solop = sokitu \ 3            Else                solop = sokitu \ 3 + 1            End If            readInt = ""            If solop > 6 Then Exit Function             vitri = (sokitu Mod 3)            If (vitri = 0) And (solop >= 2) Then vitri = 3             If solop = 1 Then                MangLop(1) = textO            End If             If solop >= 2 Then                If sokitu Mod 3 <> 0 Then                    MangLop(1) = copy(textO, 0, sokitu Mod 3)                Else                    MangLop(1) = copy(textO, 0, 3) ' trường hợp số kí tự chia hết cho 3 thì không dùng công thức "sokitu Mod 3" để sát định số kí tụ ở lớp lớn nhất                End If                 For i = 2 To solop                    MangLop(i) = copy(textO, vitri, 3) ' sao chép các kí tự theo lớp vào mảng "MangLop()"                    vitri += 3 'mổi lớp có 3 kí số nên phải tăng lên 3 ở vị trí copy tiếp theo                Next            Else                MangLop(2) = copy(textO, 1, 3) ' trường hợp có 2 lớp            End If             For i = 1 To solop ' đọc các số sau khi đã có 2 mảng cần thiết                temp = temp & ReadNumber(MangLop(i)) & MangTenLop(solop - i + 1)            Next            readInt = temp        Else ' trường hợp dữ liệu nhập vào sai            readInt = "Sai giá trị"        End If    End Function     Function Read(ByVal num As String) As String        Dim number = ""        Dim reT = ""        Dim i        For i = 1 To Len(num)            number = number & num(i)        Next        If num(1) = "-" Then            reT = "Âm " & readInt(number)        Else            reT = readInt(num)        End If        Read = reT    End Function End Module
datproit
Posts: 3
Joined: Sat 21/11/2009 2:07 pm

Re: [VB.NET] Code chuyển số thành chữ! mong các sư hunh chỉ giáo

Post by datproit »

Tên chương trình:
Ngôn ngữ lập trình: Visual Basic 2005
Tác giả: Hồ Minh Đạt - 9/5 - THCS Nguyễn Hiền
Chức năng:
module này có thể chuyển 1 số thành cách đọc trong tiếng việt và cả tiếng anh nữa
  1.   Module ReadNumber
  2.     ' hàm này có phạm vi đọc là 21 chữ số, [vb][vbnet]
[/vb]tương ứng với 7 lớp
Private donvi(0 To 1, 0 To 10)

'Thủ tục Load() gán giá trị cho biến mảng Donvi (0 to 10) chứa các tên gọi số
Private Sub load()
donvi(1, 0) = ""
donvi(1, 1) = "một"
donvi(1, 2) = "hai"
donvi(1, 3) = "ba"
donvi(1, 4) = "bốn"
donvi(1, 5) = "năm"
donvi(1, 6) = "sáu"
donvi(1, 7) = "bảy"
donvi(1, 8) = "tám"
donvi(1, 9) = "chín"
donvi(1, 10) = "mười"

donvi(0, 0) = ""
donvi(0, 1) = "one"
donvi(0, 2) = "two"
donvi(0, 3) = "three"
donvi(0, 4) = "four"
donvi(0, 5) = "five"
donvi(0, 6) = "six"
donvi(0, 7) = "seven"
donvi(0, 8) = "eight"
donvi(0, 9) = "nine"
donvi(0, 10) = "ten"
End Sub
' hàm Copy sẽ sao chép một chuổi con từ chuổi mẹ
Function copy(ByVal st As String, ByVal start As Integer, ByVal length As Integer) As String
Dim ll
ll = Microsoft.VisualBasic.Left(st, start + length)
Dim r
r = Microsoft.VisualBasic.Right(ll, length)
copy = r
End Function

' hàm nay loạt bỏ các kí tự không phải là chữ số
Function lamDepSo(ByVal strnumber As String) As String
Dim i
Dim outString As String = ""
' 0..9 có mã ASCII là 48..58

For i = 0 To Len(strnumber) - 1
If (Asc(strnumber(i)) > 47) And (Asc(strnumber(i)) < 59) Then
outString = outString + strnumber(i)
End If
Next

lamDepSo = outString
End Function

'---------------------------------------------------------------------------------------
'đọc số hàng chục của tiếng Anh
Function docHangChucEnglish(ByVal number As String) As String
Dim num = CInt(number)
Dim TextOut As String = ""
Dim donV, chuc
donV = donvi(0, num Mod 10) ' chữ số hàm đơn vị { lưu ý là chỉ lấy 1 số vào trả về tên gọi}
chuc = donvi(0, (num Mod 100) \ 10) ' chữ số hàng trăm

Select Case num
Case 10
TextOut = "ten"
Case 11
TextOut = "eleven "
Case 12
TextOut = "twelve"
Case 13
TextOut = "thirteen"
Case 14 To 19
If num = 15 Then
TextOut = "fifteen"
Else
TextOut = donV & "teen"
End If
Case 20 To 29
TextOut = " twenty " & donV
Case 30 To 59
If num = 30 Then
TextOut = " thirty "
Else
If num = 50 Then TextOut = " fifty "

Select Case num
Case 31 To 39
TextOut = " thirty " & donV
Case 40 To 49
TextOut = " fourty " & donV
Case 50 To 59
TextOut = " fifty " & donV
End Select
End If
Case 60 To 99
If num > 79 And num < 90 Then ' trường hợp so 80 viết có 2 chữ "t"
TextOut = " eighty " & donV
Else
TextOut = chuc & "ty " & donV
End If
End Select
docHangChucEnglish = TextOut ' trả giá trị cho hàm
End Function
'đọc số hàng chục của tiếng việt
Function docHangChuc(ByVal number As String) As String
Dim num = CInt(number)
Dim TextOut As String = ""
Dim donV, chuc
donV = donvi(1, num Mod 10) ' chữ số hàm đơn vị { lưu ý là chỉ lấy 1 số vào trả về tên gọi}
chuc = donvi(1, (num Mod 100) \ 10) ' chữ số hàng trăm


Select Case num
Case 10
TextOut = "mười"
Case 11 To 19
TextOut = "mười " & donV
Case 20 To 99
If num Mod 10 = 1 Then ' các số có tận cùng là số 1, đọc là "mốt"
TextOut = chuc & " mươi mốt"
Else
If num Mod 10 <> 5 Then
TextOut = chuc & " mươi " & donV
Else ' các số có tận cùng là số 5 , đọc là "lăm"
TextOut = chuc & " mươi lăm"
End If
End If
End Select
docHangChuc = TextOut ' trả giá trị cho hàm
End Function
'doc so từ 1..99
Function ReadNumber(ByVal lan As Integer, ByVal number As String) As String
Dim TextOut As String = ""
Dim num = number
Dim donV, chuc, tram
donV = donvi(lan, num Mod 10)
chuc = donvi(lan, (num Mod 100) \ 10)
tram = donvi(lan, (num Mod 1000) \ 100)
'đọc tiếng Việt
If lan = 0 Then
Select Case num
Case 0
TextOut = "Zero"
Case 1 To 9
TextOut = donV
Case 10 To 99
TextOut = docHangChucEnglish(num)
Case 100 To 999
If num Mod 100 = 0 Then TextOut = tram & " hundred and "
If ((num Mod 100) \ 10) = 0 Then
TextOut = tram & " hundred and " & donV
Else
TextOut = tram & " hundred and " & docHangChucEnglish(num Mod 100)
End If
End Select
End If
'đọc tiếng Anh
If lan = 1 Then
Select Case num
Case 0
TextOut = "không"
Case 1 To 9
TextOut = donV
Case 10 To 99
TextOut = docHangChuc(num)
Case 100 To 999
If num Mod 100 = 0 Then TextOut = tram & " trăm"
If ((num Mod 100) \ 10) = 0 Then
TextOut = tram & " trăm lẻ " & donV
Else
TextOut = tram & " trăm " & docHangChuc(num Mod 100)
End If
End Select
End If
ReadNumber = TextOut
End Function

'dùng hàm nay để chuyển đổi số thành lời. tham số 'Lan' là trị số qui định ngôn ngữ Anh hay việt
' quy ước: 1 là tiếng Việt
' 0 là tiếng Anh
Function ConvertNumToString(ByVal Lan As Integer, ByVal strnumberInput As String) As String
Dim TextInput = lamDepSo(strnumberInput) ' xu li so nhap vao
ConvertNumToString = ""

If TextInput = "" Or Len(TextInput) > 21 Then
ConvertNumToString = "Too large number or not enter number"
Exit Function
End If

Dim temp = ""

If strnumberInput(0) = "-" Then
If Lan = 1 Then
temp = "Âm "
Else
temp = "Ninus "
End If
End If

load() ' gan gia trị cho các biến mảng


Dim i, vitri, sokitu, solop
Dim MangLop(0 To 7) ' lưu trữ 3 số trên một phần tử
Dim MangTenLop(0 To 1, 0 To 7) ' lưu trữ tên các lớp của số

MangTenLop(0, 0) = "" 'lớp 0 không tồn tại
MangTenLop(0, 1) = "" 'lớp thứ 1 có 3 chữ số tức là hàng trăm, nhưng ta đã sử lí số hàng trăm ở hàm readNumber rồi nên bỏ trống chổ này
MangTenLop(0, 2) = " thousand "
MangTenLop(0, 3) = " million "
MangTenLop(0, 4) = " bilion "
MangTenLop(0, 5) = " thousand bilion "
MangTenLop(0, 6) = " million bilion "
MangTenLop(0, 7) = " billion bilion "

MangTenLop(1, 0) = "" 'lớp 0 không tồn tại
MangTenLop(1, 1) = "" 'lớp thứ 1 có 3 chữ số tức là hàng trăm, nhưng ta đã sử lí số hàng trăm ở hàm readNumber rồi nên bỏ trống chổ này
MangTenLop(1, 2) = " nghìn "
MangTenLop(1, 3) = " triệu "
MangTenLop(1, 4) = " tỉ "
MangTenLop(1, 5) = " nghìn tỉ "
MangTenLop(1, 6) = " triệu tỉ "
MangTenLop(1, 7) = " tỉ tỉ "
' bạn có thể mở rộng thêm phạm vi đọc
' bằng cách thêm phần tử cho biến mảng MangTenLop

sokitu = Len(TextInput)
solop = sokitu \ 3
If sokitu Mod 3 > 0 Then solop += 1


If solop > 7 Then Exit Function

vitri = (sokitu Mod 3)
If (vitri = 0) And (solop >= 2) Then vitri = 3

If solop = 1 Then
MangLop(1) = TextInput
End If

If solop >= 2 Then
If sokitu Mod 3 <> 0 Then
MangLop(1) = copy(TextInput, 0, sokitu Mod 3)
Else
MangLop(1) = copy(TextInput, 0, 3) ' trường hợp số kí tự chia hết cho 3 thì không dùng công thức "sokitu Mod 3" để sát định số kí tụ ở lớp lớn nhất
End If

For i = 2 To solop
MangLop(i) = copy(TextInput, vitri, 3) ' sao chép các kí tự theo lớp vào mảng "MangLop()"
vitri += 3 'mổi lớp có 3 kí số nên phải tăng lên 3 ở vị trí copy tiếp theo
Next
Else
MangLop(2) = copy(TextInput, 1, 3) ' trường hợp có 2 lớp
End If

For i = 1 To solop ' đọc các số sau khi đã có 2 mảng cần thiết
temp = temp & ReadNumber(Lan, MangLop(i)) & MangTenLop(Lan, solop - i + 1)
Next
ConvertNumToString = temp
End Function

End Module
[/vbnet]
cách sử dụng
gọi hàm với tham số Lan=1 là tiếng việt lan=2 là tiếng anh
hàm này của em có thể đọc được số có tối đa 21 chữ số
  1. lbVietNam.Text = ConvertNumToString(1, "123456789123456789123")    'tieng viet
  2. LbEnglish.Text = ConvertNumToString(0, "123456789123456789123")       'chuyen sang tieng anh
itconga
Posts: 2
Joined: Sun 06/11/2011 12:13 am

Re: [VB.NET] Code chuyển số thành chữ!!!

Post by itconga »

clarkkent có thể cho mình hỏi tý được không ?
mình không hiểu code chổ này?
If l < k Then
tg = mid(chuoi1, i - (l + 1) * 3 + 1, 3)
Else
tg = Microsoft.VisualBasic.Left(chuoi1, i - l * 3)
End If
Có phải đây là đệ quy trong VB không?
cảm ơn .
User avatar
PhapSuXeko
Mạnh Thường Quân
Mạnh Thường Quân
Posts: 295
Joined: Sun 03/05/2009 7:44 pm
Location: Tây Ninh
Has thanked: 1 time
Been thanked: 10 times
Contact:

Re: [VB.NET] Code chuyển số thành chữ!!!

Post by PhapSuXeko »

  1. If l < k Then
  2. tg = mid(chuoi1, i - (l + 1) * 3 + 1, 3)
  3. Else
  4. tg = Microsoft.VisualBasic.Left(chuoi1, i - l * 3)
  5. End If


Mid(s, 1, 3) -> Hàm lấy chuỗi con từ chuỗi s, lấy 3 ký tự bắt đầu từ ký tự thứ 1
Microsoft.VisualBasic.Left(s, 3) -> Lấy chuỗi con từ chuỗi s, lấy 3 ký tự bên trái
Trang chủ phần mềm xem ảnh ImageGlass: http://www.imageglass.org
nguyentrinhthu
Thành viên tích cực
Thành viên tích cực
Posts: 105
Joined: Wed 23/04/2008 8:43 am
Has thanked: 6 times
Been thanked: 1 time

Re: [VB.NET] Code chuyển số thành chữ!!!

Post by nguyentrinhthu »

clarkkent wrote:Thủ thuật:
Tác giả: gửi bởi hoangthu1974 » T.Tư 12/11/2008 9:09 am
Mô tả:

Code: Select all

    '------------------------------------------------------------------    ' Function Name: Num2Text    ' Description  : Change the numeric to text speech    ' Author       : Hoang Thu    ' Date Create  : 23/12/2007    '------------------------------------------------------------------    Function Num2Text(ByVal s As String, Optional ByVal Local As Boolean = False) As String        'Optional ByVal Local As Boolean = False 'Nam Kỳ Reading        'Optional ByVal Local As Boolean = True 'Bắc Kỳ Reading        Dim DS As Char = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator        Dim GS As Char = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator        Dim fDS As Boolean = False        Dim fDecAdd As Boolean = False        Dim so() As String = {"không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín"}        Dim hang() As String = {"", "ngàn", "triệu", "tỷ"}        If Local Then            hang(1) = "nghìn"        End If        Dim i, j, cntDS, donvi, chuc, tram As Integer        Dim str As String        str = ""        s = s.Replace(GS, "")        If s.Substring(s.Length - 1, 1) = DS Then s = s.Substring(0, s.Length - 1)         i = s.Length        While s.Substring(0, 1) = "0"            s = s.Substring(1, s.Length - 1)        End While        If s.Substring(0, 1) = DS Then s = "0" & s        cntDS = 0        If InStr(s, DS) Then            For i = 0 To s.Length - 1 Step 1                If s.Substring(i, 1) = DS Then                    cntDS += 1                End If            Next        End If        If cntDS > 1 Then Return ""        If cntDS > 0 Then            While s.Substring(s.Length - 1, 1) = "0"                s = s.Substring(0, s.Length - 1)            End While        End If        If s.Substring(s.Length - 1, 1) = DS Then s = s.Substring(0, s.Length - 1)         i = s.Length - 1        If i = 0 Then            str = ""        Else            j = 0            Do While i >= 0                If s.Substring(i, 1) = DS Then                    fDS = True                    i -= 1                    GoTo DecimalAdd                Else                    donvi = Int(s.Substring(i, 1))                    i -= 1                End If                 If i > -1 Then                    If s.Substring(i, 1) = DS Then                        i -= 1                        chuc = -1                        tram = -1                        fDS = True                        GoTo NumberRead                    Else                        chuc = Int(s.Substring(i, 1))                    End If                Else                    chuc = -1                End If                i -= 1                 If i > -1 Then                    If s.Substring(i, 1) = DS Then                        i -= 1                        tram = -1                        fDS = True                        GoTo NumberRead                    Else                        tram = Int(s.Substring(i, 1))                    End If                Else                    tram = -1                End If                i -= 1NumberRead:                If donvi > 0 Or chuc > 0 Or tram > 0 Or j = 3 Then str = hang(j) & " " & str                j += 1                 If j > 3 Then j = 1                 If donvi = 1 And chuc > 1 Then                    str = "mốt" & " " & str                ElseIf donvi = 4 And chuc > 1 Then                    If Local Then                        str = "tư" & " " & str                    Else                        str = so(donvi) & " " & str                    End If                ElseIf donvi = 5 Then                    If chuc > 0 Then                        str = "lăm" & " " & str                    Else                        str = so(donvi) & " " & str                    End If                Else                    If donvi <> 0 Then str = so(donvi) & " " & str                End If                 If chuc < 0 Then                    If Not fDS Then Exit Do                Else                    If chuc = 0 And donvi > 0 Then                        str = "lẻ" & " " & str                    ElseIf chuc = 1 Then                        str = "mười" & " " & str                    ElseIf chuc > 1 Then                        str = so(chuc) & " " & "mươi" & " " & str                    End If                End If                If tram < 0 Then                    If Not fDS Then Exit Do                Else                    If tram > 0 Or chuc > 0 Or donvi > 0 Then                        str = so(tram) & " " & "trăm" & " " & str                    End If                End IfDecimalAdd:                If fDS Then                    str = "phảy " & str                    j = 0                    fDS = False                    fDecAdd = True                End If            Loop        End If         If str.Length > 0 Then            str = str.Trim            str = str.Replace("  ", " ")            str = UCase(str.Substring(0, 1)) & str.Substring(1, str.Length - 1)            Return str        Else            Return ""        End If    End Function

kinh đọc được cả triệu tỷ luôn
Post Reply

Return to “[.NET] Chuỗi và Thời gian”