Hàm đọc số của bác phamduylong bị lỗi (1 người xem)

  • Thread starter Thread starter cuongdv
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

cuongdv

Thành viên mới
Tham gia
26/11/08
Bài viết
38
Được thích
6
Trong bài này ở #58 của bác Phamduylong:
Mã:
[URL]http://www.giaiphapexcel.com/forum/showthread.php?65-H%C3%A0m-chuy%E1%BB%83n-s%E1%BB%91-th%C3%A0nh-ch%E1%BB%AF[/URL]
Mã:
[LEFT][COLOR=#000000]Function DocSo(Number As String, Optional DonVi As String = "", Optional Le As String = "", Optional Phay As String = "", Optional Hoa As Boolean = True) As String[/COLOR][/LEFT]
Dim arNum, arGrp, dInt As String, dau As String, dvInt As String, s123 As StringDim s1 As String, s2 As String, s3 As String, sNhom As StringDim nId As Long, n03 As Long, n1 As Long, n2 As Long, n3 As Long[COLOR=blue]arNum = Array(" không", " m" & ChrW(7897) & "t", " hai", " ba", " b" & ChrW(7889) & "n", " n" & ChrW(259) & "m", " sáu", " b" & ChrW(7843) & "y", " tám", " chín", " m" & ChrW(432) & ChrW(7901) & "i", " m" & ChrW(432) & ChrW(417) & "i", " m" & ChrW(7889) & "t", " l" & ChrW(7867), " b" & ChrW(7889) & "n", " l" & ChrW(259) & "m", " ch" & ChrW(7859) & "n", " không", ",", " l" & ChrW(7867))[/COLOR][COLOR=blue]arGrp = Array(" tr" & ChrW(259) & "m", " tri" & ChrW(7879) & "u", " ngàn", " t" & ChrW(7927), " âm", "", "")[/COLOR]On Error GoTo baoloiIf Phay <> "" Then arGrp(5) = Trim(Phay)If DonVi <> "" Then arGrp(6) = " " & Trim(DonVi)If Le <> "" Then arNum(13) = " " & Trim(Le)If Number < 0 Then  Number = Abs(Number)  dau = arGrp(4)End IfdvInt = Int(Number)n1 = ((Len(Str(dvInt)) - 1) Mod 9)dvInt = String(9 - (((Len(Str(dvInt)) - 1) Mod 9) Mod 12), "0") & dvIntn03 = 1For nId = 1 To Len(dvInt) Step 3  s1 = "": s2 = "": s3 = "": sNhom = ""  If Mid(dvInt, nId, 3) = "000" Then    s123 = ""    [COLOR=red]If dInt <> "" And nId = 7 Then dInt = dInt & arGrp(3)[/COLOR]  Else    n1 = Mid(dvInt, nId, 1)    n2 = Mid(dvInt, nId + 1, 1)    n3 = Mid(dvInt, nId + 2, 1)    If n1 = 0 And dInt <> "" Then s1 = arNum(0) & arGrp(0)    If n1 > 0 Then s1 = arNum(n1) & arGrp(0)    If n2 = 0 And (s1 = "" Or n3 = 0) Then s2 = ""    If n2 = 0 And s1 <> "" And n3 > 0 Then s2 = arNum(13)    If n2 = 1 Then s2 = arNum(10)    If n2 > 1 Then s2 = arNum(n2) & arNum(11)    If n3 = 1 And n2 <= 1 Then s3 = arNum(1)    If n3 = 1 And n2 > 1 Then s3 = arNum(12)    If n3 = 5 And n2 = 0 Then s3 = arNum(5)    If n3 = 5 And n2 <> 0 Then s3 = arNum(15)    If s3 = "" And n3 > 0 Then s3 = arNum(n3)    s123 = s1 & s2 & s3    If n03 = 3 And (dInt <> "" Or s123 <> "") And Len(dvInt) - nId > 9 Then sNhom = arGrp(3)    If sNhom = "" And n03 < 3 Then sNhom = arGrp(n03)    s123 = s123 & sNhom    dInt = dInt & s123 & arGrp(5)  End If  If n03 = 3 Then n03 = 1 Else n03 = n03 + 1NextIf dInt = "" Then dInt = arNum(0) Else dInt = dau & dIntIf Right(dInt, 1) = arGrp(5) Then dInt = Left(dInt, Len(dInt) - 1)If Hoa = True Then  DocSo = UCase(Left(Trim(dInt), 1)) & Mid(Trim(dInt) & arGrp(6), 2)Else  DocSo = Trim(dInt) & arGrp(6)End IfExit Functionbaoloi:DocSo = Number & " ?" [LEFT][COLOR=#000000]End Function[/COLOR][/LEFT]
Tôi thấy khi đọc số từ hàng nghìn đến hàng chục nghìn mà cuối số đó có 3 số 0 thì sẽ đọc thành tỷ
vd: =docso(4000) : Bốn ngàn tỷ
=docso(41257000): Bốn mươi mốt triệu hai trăm năm mươi bảy ngàn tỷ
Nhờ các cao thủ xem và giải thích.+-+-+-+
 
Trong bài này ở #58 của bác Phamduylong:
Mã:
[URL="http://www.giaiphapexcel.com/forum/showthread.php?65-H%C3%A0m-chuy%E1%BB%83n-s%E1%BB%91-th%C3%A0nh-ch%E1%BB%AF"]http://www.giaiphapexcel.com/forum/showthread.php?65-H%C3%A0m-chuy%E1%BB%83n-s%E1%BB%91-th%C3%A0nh-ch%E1%BB%AF[/URL]
Mã:
[LEFT][COLOR=#000000]Function DocSo(Number As String, Optional DonVi As String = "", Optional Le As String = "", Optional Phay As String = "", Optional Hoa As Boolean = True) As String[/COLOR][/LEFT]
Dim arNum, arGrp, dInt As String, dau As String, dvInt As String, s123 As StringDim s1 As String, s2 As String, s3 As String, sNhom As StringDim nId As Long, n03 As Long, n1 As Long, n2 As Long, n3 As Long[COLOR=blue]arNum = Array(" không", " m" & ChrW(7897) & "t", " hai", " ba", " b" & ChrW(7889) & "n", " n" & ChrW(259) & "m", " sáu", " b" & ChrW(7843) & "y", " tám", " chín", " m" & ChrW(432) & ChrW(7901) & "i", " m" & ChrW(432) & ChrW(417) & "i", " m" & ChrW(7889) & "t", " l" & ChrW(7867), " b" & ChrW(7889) & "n", " l" & ChrW(259) & "m", " ch" & ChrW(7859) & "n", " không", ",", " l" & ChrW(7867))[/COLOR][COLOR=blue]arGrp = Array(" tr" & ChrW(259) & "m", " tri" & ChrW(7879) & "u", " ngàn", " t" & ChrW(7927), " âm", "", "")[/COLOR]On Error GoTo baoloiIf Phay <> "" Then arGrp(5) = Trim(Phay)If DonVi <> "" Then arGrp(6) = " " & Trim(DonVi)If Le <> "" Then arNum(13) = " " & Trim(Le)If Number < 0 Then  Number = Abs(Number)  dau = arGrp(4)End IfdvInt = Int(Number)n1 = ((Len(Str(dvInt)) - 1) Mod 9)dvInt = String(9 - (((Len(Str(dvInt)) - 1) Mod 9) Mod 12), "0") & dvIntn03 = 1For nId = 1 To Len(dvInt) Step 3  s1 = "": s2 = "": s3 = "": sNhom = ""  If Mid(dvInt, nId, 3) = "000" Then    s123 = ""    [COLOR=red]If dInt <> "" And nId = 7 Then dInt = dInt & arGrp(3)[/COLOR]  Else    n1 = Mid(dvInt, nId, 1)    n2 = Mid(dvInt, nId + 1, 1)    n3 = Mid(dvInt, nId + 2, 1)    If n1 = 0 And dInt <> "" Then s1 = arNum(0) & arGrp(0)    If n1 > 0 Then s1 = arNum(n1) & arGrp(0)    If n2 = 0 And (s1 = "" Or n3 = 0) Then s2 = ""    If n2 = 0 And s1 <> "" And n3 > 0 Then s2 = arNum(13)    If n2 = 1 Then s2 = arNum(10)    If n2 > 1 Then s2 = arNum(n2) & arNum(11)    If n3 = 1 And n2 <= 1 Then s3 = arNum(1)    If n3 = 1 And n2 > 1 Then s3 = arNum(12)    If n3 = 5 And n2 = 0 Then s3 = arNum(5)    If n3 = 5 And n2 <> 0 Then s3 = arNum(15)    If s3 = "" And n3 > 0 Then s3 = arNum(n3)    s123 = s1 & s2 & s3    If n03 = 3 And (dInt <> "" Or s123 <> "") And Len(dvInt) - nId > 9 Then sNhom = arGrp(3)    If sNhom = "" And n03 < 3 Then sNhom = arGrp(n03)    s123 = s123 & sNhom    dInt = dInt & s123 & arGrp(5)  End If  If n03 = 3 Then n03 = 1 Else n03 = n03 + 1NextIf dInt = "" Then dInt = arNum(0) Else dInt = dau & dIntIf Right(dInt, 1) = arGrp(5) Then dInt = Left(dInt, Len(dInt) - 1)If Hoa = True Then  DocSo = UCase(Left(Trim(dInt), 1)) & Mid(Trim(dInt) & arGrp(6), 2)Else  DocSo = Trim(dInt) & arGrp(6)End IfExit Functionbaoloi:DocSo = Number & " ?" [LEFT][COLOR=#000000]End Function[/COLOR][/LEFT]
Tôi thấy khi đọc số từ hàng nghìn đến hàng chục nghìn mà cuối số đó có 3 số 0 thì sẽ đọc thành tỷ
vd: =docso(4000) : Bốn ngàn tỷ
=docso(41257000): Bốn mươi mốt triệu hai trăm năm mươi bảy ngàn tỷ
Nhờ các cao thủ xem và giải thích.+-+-+-+

Bạn kiểm tra hộ tôii hàm BangLoiVn xem. Tôi viết chơi xong rồi cũng chả chải chuốt gì. Mà mới làm vài test thôi.
http://www.giaiphapexcel.com/forum/showthread.php?65-Hàm-chuyển-số-thành-chữ/page9
 
Upvote 0
Bạn kiểm tra hộ tôii hàm BangLoiVn xem. Tôi viết chơi xong rồi cũng chả chải chuốt gì. Mà mới làm vài test thôi.
http://www.giaiphapexcel.com/forum/showthread.php?65-H%C3%A0m-chuy%E1%BB%83n-s%E1%BB%91-th%C3%A0nh-ch%E1%BB%AF/page9
Hàm của bạn chỉ đúng tới hàng trăm tỷ, còn từ nghìn tỷ trở đi thì lại đọc thành "nghìn đồng".
vd: BangLoiVn(11.000.000.000.000,"đồng+xu")= Mười một nghìn đồng chẵn[TABLE="width: 172"]
[TR]
[TD="class: xl121, width: 172"] Bạn xem lại giúp!![/TD]
[/TR]
[/TABLE]
 
Upvote 0
Hàm của bạn chỉ đúng tới hàng trăm tỷ, còn từ nghìn tỷ trở đi thì lại đọc thành "nghìn đồng".
vd: BangLoiVn(11.000.000.000.000,"đồng+xu")= Mười một nghìn đồng chẵn[TABLE="width: 172"]
[TR]
[TD="class: xl121, width: 172"] Bạn xem lại giúp!![/TD]
[/TR]
[/TABLE]

He he, trả lương cho nhân viên kiểu này thì có ngày họ chém chết.
Cám ơn bạn đã phát hiện ra lỗi.
Cũng là do tôi không xét kỹ các trường hợp nên sai một ly là đi ... toi. Thiếu chữ "tỷ" ở đây (không phải là đọc thành nghìn. Nghìn chắc chắn phải có. Chỉ là đọc thiếu tỷ mà thôi)
Tôi đã sửa lại. Nếu bạn có lòng tốt thì giúp tôi test nữa nhé.
Đoạn
Mã:
                If index < Size Then
                    baso = tram & chuc & DonVi & donvi_nhom(chisonhom)
                Else
                ' nhom 3 so doc ra la nhom 3 so cuoi cung nen khong them don vi gi ca
                    baso = tram & chuc & DonVi
                End If
            End If
Sửa thành
Mã:
                If index < Size Then
                    baso = tram & chuc & DonVi & donvi_nhom(chisonhom)
                Else
                ' nhom 3 so doc ra la nhom 3 so cuoi cung nen khong them don vi gi ca
                    baso = tram & chuc & DonVi
                End If
            [COLOR=#ff0000]ElseIf index < Size And chisonhom = 3 Then
[/COLOR]               [COLOR=#ff0000]baso = " t" & ChrW(7927)[/COLOR]
            End If
tức thêm đoạn mầu đỏ
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom