thaipv
XA Project
- Tham gia
- 18/5/14
- Bài viết
- 158
- Được thích
- 242
- Giới tính
- Nam
Hôm qua lang thang trên diễn đàn đọc được hàm đọc số tiếng Việt sử dụng thuật toán đệ quy khá hay. Nay mình gửi lại để các bạn có thể tham khảo.
Các bạn có thể xem và tải về mã nguồn gốc tại : http://www.giaiphapexcel.com/forum/showthread.php?117187-mọi-người-sửa-giúp-em-file-execl-này-với-ạ
Cám ơn bạn @minhchau196 đã chia sẻ.
Dưới đây là code mình đã sửa 1 vài chỗ cho gọn hơn :
[GPECODE=vb]Option Explicit
'Source: http://www.giaiphapexcel.com/forum/showthread.php?117187-mọi-người-sửa-giúp-em-file-execl-này-với-ạ
'Edit by: thaipv@live.com #02/08/2016#
Public Function DOCSOVIET(ByRef CHUSO As String) As String
Dim i As Long, j As Long, TENCOSO As Variant, TENHANG As Variant
j = Len(CHUSO)
TENCOSO = Array("khoong", "moojt", "hai", "ba", "boosn", "nawm", "sasu", "bary", "tasm", "chisn")
TENHANG = Array("donvi", "muwowi", "trawm", "nghifn,", "muwowi", "trawm", "trieeju,", "muwowi", "trawm")
If j < 10 Then '// Doc tên hàng
DOCSOVIET = ""
For i = 1 To j 'Chuyên sô "123456789" thành "1tram 2muoi 3trieu, 4tram 5muoi 6nghin, 7tram 8muoi 9donvi"
DOCSOVIET = DOCSOVIET & Mid$(CHUSO, i, 1) & TENHANG(j - i) & " "
Next
Else '// Su dung 'Thuât toán Dê quy'
DOCSOVIET = DOCSOVIET$(Left$(CHUSO, j - 9)) & CHUYENMA$(" tyr, ") & DOCSOVIET$(Right$(CHUSO, 9))
Exit Function
End If
'// Doc tên các con sô
For i = 0 To 9
DOCSOVIET = Replace$(DOCSOVIET, i, TENCOSO(i) & " ")
Next
'// Xu lý nhung truong hop ngoai lê và xu lý chuôi
DOCSOVIET = Replace$(DOCSOVIET, "khoong muwowi", "linh") '#0#
DOCSOVIET = Replace$(DOCSOVIET, "muwowi khoong", "muwowi") '#10
DOCSOVIET = Replace$(DOCSOVIET, "khoong trawm linh khoong ", "khoong ") '000
DOCSOVIET = Replace$(DOCSOVIET, "trawm linh khoong", "trawm") '#00
DOCSOVIET = Replace$(DOCSOVIET, "muwowi nawm", "muwowi lawm") '#15
DOCSOVIET = Replace$(DOCSOVIET, "moojt muwowi", "muwowfi") '#10
DOCSOVIET = Replace$(DOCSOVIET, "muwowi moojt", "muwowi moost") '#X1 (X>1)
DOCSOVIET = Replace$(DOCSOVIET, " khoong donvi", " donvi") '##0
DOCSOVIET = Replace$(DOCSOVIET, "khoong nghifn, donvi", "donvi")
DOCSOVIET = Replace$(DOCSOVIET, "khoong trieeju, donvi", "donvi") 'Cach khac..."khoong trieeju,", "donvi"
DOCSOVIET = Replace$(DOCSOVIET, "donvi ", "")
'// Chuyên mã tiêng Viêt
DOCSOVIET = CHUYENMA$(Trim$(DOCSOVIET))
End Function
'Author: Pham Duy Long
'Source: http://www.giaiphapexcel.com/forum/attachment.php?attachmentid=2416
'Edit by: thaipv@live.com #30/11/2015#
Public Function CHUYENMA(ByVal CHUOI_VB As String) As String
Dim TEMP_TYPE, CHAR_CODE, Z&
TEMP_TYPE = Array("aaf", "aaj", "aar", "aas", "aax", "awf", "awj", "awr", "aws", "awx", "eef", _
"eej", "eer", "ees", "eex", "oof", "ooj", "oor", "oos", "oox", "owf", "owj", "owr", "ows", "owx", _
"uwf", "uwj", "uwr", "uws", "uwx", "aa", "af", "aj", "ar", "as", "aw", "ax", "dd", "ee", _
"ef", "ej", "er", "es", "ex", "if", "ij", "ir", "is", "ix", "of", "oj", "oo", "or", _
"os", "ow", "ox", "uf", "uj", "ur", "us", "uw", "ux", "yf", "yj", "yr", "ys", "yx", _
"A~", "E~", "I~", "O~", "U~", "Y~", "a~", "e~", "i~", "o~", "u~", "y~") 'Không chuyên mã
CHAR_CODE = Array(7847, 7853, 7849, 7845, 7851, 7857, 7863, 7859, 7855, 7861, 7873, _
7879, 7875, 7871, 7877, 7891, 7897, 7893, 7889, 7895, 7901, 7907, 7903, 7899, 7905, _
7915, 7921, 7917, 7913, 7919, 226, 224, 7841, 7843, 225, 259, 227, 273, 234, _
232, 7865, 7867, 233, 7869, 236, 7883, 7881, 237, 297, 242, 7885, 244, 7887, _
243, 417, 245, 249, 7909, 7911, 250, 432, 361, 7923, 7925, 7927, 253, 7929, _
65, 69, 73, 79, 85, 89, 97, 101, 105, 111, 117, 121) 'Xóa ký tu '~'
For Z = 0 To UBound(CHAR_CODE)
CHUOI_VB = Replace$(CHUOI_VB, TEMP_TYPE(Z), ChrW$(CHAR_CODE(Z)))
CHUOI_VB = Replace$(CHUOI_VB, UCase$(TEMP_TYPE(Z)), ChrW$(CHAR_CODE(Z) - 1))
CHUOI_VB = Replace$(CHUOI_VB, UCase$(Left$(TEMP_TYPE(Z), 1)) & _
Mid$(TEMP_TYPE(Z), 2), ChrW$(CHAR_CODE(Z) - 1))
Next Z
CHUYENMA = CHUOI_VB
End Function[/GPECODE]
Tuy vậy, hàm này vẫn có hạn chế khi đọc với số lớn (hàng tỷ tỷ trở lên). Bạn nào biết cách sửa vui lòng chia sẻ cho các thành viên.
Các bạn có thể xem và tải về mã nguồn gốc tại : http://www.giaiphapexcel.com/forum/showthread.php?117187-mọi-người-sửa-giúp-em-file-execl-này-với-ạ
Cám ơn bạn @minhchau196 đã chia sẻ.
Dưới đây là code mình đã sửa 1 vài chỗ cho gọn hơn :
[GPECODE=vb]Option Explicit
'Source: http://www.giaiphapexcel.com/forum/showthread.php?117187-mọi-người-sửa-giúp-em-file-execl-này-với-ạ
'Edit by: thaipv@live.com #02/08/2016#
Public Function DOCSOVIET(ByRef CHUSO As String) As String
Dim i As Long, j As Long, TENCOSO As Variant, TENHANG As Variant
j = Len(CHUSO)
TENCOSO = Array("khoong", "moojt", "hai", "ba", "boosn", "nawm", "sasu", "bary", "tasm", "chisn")
TENHANG = Array("donvi", "muwowi", "trawm", "nghifn,", "muwowi", "trawm", "trieeju,", "muwowi", "trawm")
If j < 10 Then '// Doc tên hàng
DOCSOVIET = ""
For i = 1 To j 'Chuyên sô "123456789" thành "1tram 2muoi 3trieu, 4tram 5muoi 6nghin, 7tram 8muoi 9donvi"
DOCSOVIET = DOCSOVIET & Mid$(CHUSO, i, 1) & TENHANG(j - i) & " "
Next
Else '// Su dung 'Thuât toán Dê quy'
DOCSOVIET = DOCSOVIET$(Left$(CHUSO, j - 9)) & CHUYENMA$(" tyr, ") & DOCSOVIET$(Right$(CHUSO, 9))
Exit Function
End If
'// Doc tên các con sô
For i = 0 To 9
DOCSOVIET = Replace$(DOCSOVIET, i, TENCOSO(i) & " ")
Next
'// Xu lý nhung truong hop ngoai lê và xu lý chuôi
DOCSOVIET = Replace$(DOCSOVIET, "khoong muwowi", "linh") '#0#
DOCSOVIET = Replace$(DOCSOVIET, "muwowi khoong", "muwowi") '#10
DOCSOVIET = Replace$(DOCSOVIET, "khoong trawm linh khoong ", "khoong ") '000
DOCSOVIET = Replace$(DOCSOVIET, "trawm linh khoong", "trawm") '#00
DOCSOVIET = Replace$(DOCSOVIET, "muwowi nawm", "muwowi lawm") '#15
DOCSOVIET = Replace$(DOCSOVIET, "moojt muwowi", "muwowfi") '#10
DOCSOVIET = Replace$(DOCSOVIET, "muwowi moojt", "muwowi moost") '#X1 (X>1)
DOCSOVIET = Replace$(DOCSOVIET, " khoong donvi", " donvi") '##0
DOCSOVIET = Replace$(DOCSOVIET, "khoong nghifn, donvi", "donvi")
DOCSOVIET = Replace$(DOCSOVIET, "khoong trieeju, donvi", "donvi") 'Cach khac..."khoong trieeju,", "donvi"
DOCSOVIET = Replace$(DOCSOVIET, "donvi ", "")
'// Chuyên mã tiêng Viêt
DOCSOVIET = CHUYENMA$(Trim$(DOCSOVIET))
End Function
'Author: Pham Duy Long
'Source: http://www.giaiphapexcel.com/forum/attachment.php?attachmentid=2416
'Edit by: thaipv@live.com #30/11/2015#
Public Function CHUYENMA(ByVal CHUOI_VB As String) As String
Dim TEMP_TYPE, CHAR_CODE, Z&
TEMP_TYPE = Array("aaf", "aaj", "aar", "aas", "aax", "awf", "awj", "awr", "aws", "awx", "eef", _
"eej", "eer", "ees", "eex", "oof", "ooj", "oor", "oos", "oox", "owf", "owj", "owr", "ows", "owx", _
"uwf", "uwj", "uwr", "uws", "uwx", "aa", "af", "aj", "ar", "as", "aw", "ax", "dd", "ee", _
"ef", "ej", "er", "es", "ex", "if", "ij", "ir", "is", "ix", "of", "oj", "oo", "or", _
"os", "ow", "ox", "uf", "uj", "ur", "us", "uw", "ux", "yf", "yj", "yr", "ys", "yx", _
"A~", "E~", "I~", "O~", "U~", "Y~", "a~", "e~", "i~", "o~", "u~", "y~") 'Không chuyên mã
CHAR_CODE = Array(7847, 7853, 7849, 7845, 7851, 7857, 7863, 7859, 7855, 7861, 7873, _
7879, 7875, 7871, 7877, 7891, 7897, 7893, 7889, 7895, 7901, 7907, 7903, 7899, 7905, _
7915, 7921, 7917, 7913, 7919, 226, 224, 7841, 7843, 225, 259, 227, 273, 234, _
232, 7865, 7867, 233, 7869, 236, 7883, 7881, 237, 297, 242, 7885, 244, 7887, _
243, 417, 245, 249, 7909, 7911, 250, 432, 361, 7923, 7925, 7927, 253, 7929, _
65, 69, 73, 79, 85, 89, 97, 101, 105, 111, 117, 121) 'Xóa ký tu '~'
For Z = 0 To UBound(CHAR_CODE)
CHUOI_VB = Replace$(CHUOI_VB, TEMP_TYPE(Z), ChrW$(CHAR_CODE(Z)))
CHUOI_VB = Replace$(CHUOI_VB, UCase$(TEMP_TYPE(Z)), ChrW$(CHAR_CODE(Z) - 1))
CHUOI_VB = Replace$(CHUOI_VB, UCase$(Left$(TEMP_TYPE(Z), 1)) & _
Mid$(TEMP_TYPE(Z), 2), ChrW$(CHAR_CODE(Z) - 1))
Next Z
CHUYENMA = CHUOI_VB
End Function[/GPECODE]
Tuy vậy, hàm này vẫn có hạn chế khi đọc với số lớn (hàng tỷ tỷ trở lên). Bạn nào biết cách sửa vui lòng chia sẻ cho các thành viên.
Lần chỉnh sửa cuối: