[Chia sẻ] Hàm đọc số tiếng Việt sử dụng thuật toán đệ quy (1 người xem)

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

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

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.
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom