Đọc số thập phân (số lẻ) như thế nào là đúng ? (2 người xem)

Liên hệ QC

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

phamduylong

-
Thành viên đã mất
Tham gia
30/12/06
Bài viết
918
Được thích
2,370
Nghề nghiệp
Giáo viên
Đọc số tiếng Việt trong Excel trên diễn đàn đã đề cập nhiều, tôi cũng đã viết hàm đọc số để phục vụ cho việc ghi câu tổng kết số tiền trên các bản tính Excel (TVEXCEL01.XLA) nhưng có một vấn đề mà trên diễn đàn cũng như các bạn đã gởi email cho tôi đề cập đến việc đọc phần số thập phân.
Viết hàm cho đọc số phần nguyên đã giải quyết xong, nhưng viết hàm cho đọc số thập phân quả thật không đơn giản chút nào. Vấn đề không phải ở giải thuật mà lại là không biết đọc cách nào cho đúng. Tôi đưa ra một số cách đọc số thập phân và diễn đàn cùng góp ý để có thể tìm lời giải cho hàm đọc số thập phân. Tôi ví dụ đọc theo 3 cách: cách 1 theo sách giáo khoa, cách 2 theo cách đọc bình dân, cách 3 theo cách đọc tiền Việt Nam.
Ví dụ 1: số 1, 23
1. sách giáo khoa đọc là một đơn vị hai mươi ba phần nghìn.
2. một phẩy hai mươi ba.
3. một đồng hai hào ba xu hoặc một đồng hai mươi ba xu (nếu là tiền Việt Nam).
Ví dụ 2: số 0, 23
1. sách giáo khoa đọc là không đơn vị hai mươi ba phần trăm.
2. không phẩy hai mươi ba.
3. hai hào ba xu hoặc hai mươi ba xu (nếu là tiền Việt Nam).
Ví dụ 4: 1, 02
1. sách giáo khoa đọc là một đơn vị hai phần trăm.
2. một phẩy không hai.
3. một đồng hai xu.
Qua 3 cách đọc trên, tôi có nhận xét:
Cách 1 chính xác nhưng hơi khó nghe đối với giới bình dân.
Cách 2 rất quen thuộc với mọi người nhưng ghép với đơn vị đo lường hơi khó nghe (ví dụ không phẩy hai mươi ba đồng)
Cách 3 chỉ đúng với tiền Việt Nam, một số đơn vị khác không dùng được.
Các bạn cho ý kiến xem cách đọc như thế nào là đúng, phù hợp với tập quán người Việt. Từ đó mới có thể viết ứng dụng cho vấn đề này được.
 
Theo mình nghĩ đây là do nó đặt trong trường hợp nào thì đọc theo trường hợp đó ví dụ trong toán thì đọc khác mà dùng để biểu thị cho đơn vị tiền tệ thì đọc khác. Mong bạn xem thử
 
Upvote 0
Hàm đọc số ra chữ thường áp dụng để đọc số các số tiền tệ trong tài chính, kế toán, vì vậy bạn chỉ cần viết hàm đọc theo kiểu tiền tệ thôi, Việt Nam không dùng đến hào, xu nữa rồi, nếu chẳng may có thì cũng làm tròn đến đồng thôi. Nếu áp dụng hàm vào các bài toán EXCELL dạng khác thì chỉ cần sửa lại một chút hàm là xong phải không bạn
 
Upvote 0
Tôi phát triển từ hàm DocSo thành hàm SoVn cho phép đọc đến 2 số thập phân. Nó cho phép bạn khai báo đơn vị, thay đổi cách đọc theo ý riêng.

Hàm này có 3 đối số:
SoVn(ConSo, DonVi, Linh)
ConSo: số nguyên hay số thập phân cần đọc số.
DonVi: tên đơn vị của con số. Mỗi đơn vị có 2 phần : phần nguyên và phần thập phân. Bạn nhập 1 trong 3 loại đơn vị:
- "d": đồng, xu
- "m": mét, cm
- "u"; usd, cent
(bạn có thể thay đổi đơn vị bằng cách chỉnh phần khai báo đơn vị trong hàm SoVn)
Linh: cách đọc linh hay lẻ hay 1 chuỗi bất kỳ cho các số không có hàng chục
SoVn(105,21 ;"d";"lẻ") > một trăm lẻ năm đồng hai mươi mốt xu
SoVn(105,21 ;"m";"linh") > một trăm linh năm mét hai mươi mốt cm
SoVn(105,21 ;"u";"không") > một trăm không năm usd hai mươi mốt cent
Tiền usd không biết đọc vậy có đúng không chưa thấy giấy tờ ghi tiền usd.
Các bạn muốn thêm hay chỉnh đơn vị thì chỉnh trong phần code màu xanh. Muốn thêm đơn vị mới cứ thêm ElseIf.

Mã:
Function SoVn(ConSo, DonVi As String, Linh As String) As String
Dim n09, nNgan
Dim DsNguyen As String, DsTp As String, dau As String
Dim dvNguyen As String, dvTp As String, s123 As String, s1 As String, s2 As String, s3 As String
Dim soNguyen As Double, soLe As Byte, stt As Byte, nLop As Byte, n1 As Byte, n2 As Byte, n3 As Byte
If Trim(Linh) = "" Then Linh = " linh" Else Linh = " " & Trim(Linh)
n09 = Array("", " m" & ChrW(7897) & "t", " hai", " ba", " b" & ChrW(7889) & "n", " n" & ChrW(259) & "m", " s" & ChrW(225) & "u", " b" & ChrW(7843) & "y", " t" & ChrW(225) & "m", " ch" & ChrW(237) & "n")
nNgan = Array("", " tri" & ChrW(7879) & "u", " ngh" & ChrW(236) & "n", " t" & ChrW(7927))
If Trim(ConSo) = "" Then
  SoVn = ""
ElseIf IsNumeric(ConSo) = False Then
  SoVn = ConSo
Else
  If ConSo < 0 Then dau = ChrW(226) & "m "
  ConSo = Application.WorksheetFunction.Round(Abs(ConSo), 2)
  If InStr(1, ConSo, "E") > 0 Then 'so format 1,23457E+10
    ConSo = Replace(Replace(ConSo, ".", ""), ",", "")
    soNguyen = Mid(ConSo, InStr(1, ConSo, "E") + 1)
    ConSo = Mid(ConSo, 1, InStr(1, ConSo, "E") - 1)
    ConSo = ConSo & String(soNguyen - Len(ConSo) + 1, "0")
  End If
  soNguyen = Int(ConSo)
  soLe = (ConSo - soNguyen) * 100
  n1 = (Len(Str(soNguyen)) - 1) Mod 9
  If n1 > 0 Then ConSo = String(9 - (n1 Mod 12), "0") & soNguyen
 
  '==================
  'Doc so phan nguyen
  '==================
  nLop = 1
  stt = 1
  Do
    n1 = Mid(ConSo, stt, 1)
    n2 = Mid(ConSo, stt + 1, 1)
    n3 = Mid(ConSo, stt + 2, 1)
    stt = stt + 3
    If n1 & n2 & n3 = "000" Then
      If DsNguyen <> "" And nLop = 3 And Len(ConSo) - stt > 2 Then s123 = " t" & ChrW(7927) Else s123 = ""
    Else
      If n1 = 0 Then
        If DsNguyen = "" Then s1 = "" Else s1 = " kh" & ChrW(244) & "ng tr" & ChrW(259) & "m"
      Else
        s1 = n09(n1) & " tr" & ChrW(259) & "m"
      End If
      If n2 = 0 Then
        If s1 = "" Or n3 = 0 Then
          s2 = ""
        Else
          s2 = Linh
        End If
      Else
        If n2 = 1 Then s2 = " m" & ChrW(432) & ChrW(7901) & "i" Else s2 = n09(n2) & " m" & ChrW(432) & ChrW(417) & "i"
      End If
      If n3 = 1 Then
        If n2 = 1 Or n2 = 0 Then s3 = " m" & ChrW(7897) & "t" Else s3 = " m" & ChrW(7889) & "t"
      ElseIf n3 = 5 And n2 <> 0 Then
        s3 = " l" & ChrW(259) & "m"
      Else
        s3 = n09(n3)
      End If
      If stt > Len(ConSo) Then
        s123 = s1 & s2 & s3
      Else
        s123 = s1 & s2 & s3 & nNgan(nLop)
      End If
    End If
    nLop = nLop + 1
    If nLop > 3 Then nLop = 1
    DsNguyen = DsNguyen & s123
    If stt > Len(ConSo) Then Exit Do
  Loop
  If DsNguyen = "" Then DsNguyen = "kh" & ChrW(244) & "ng" Else DsNguyen = dau & Trim(DsNguyen)
 
 
  [COLOR=blue]'===============[/COLOR]
[COLOR=blue] 'Khai bao don vi[/COLOR]
[COLOR=blue] '===============[/COLOR]
 [COLOR=blue]DonVi = LCase(Trim(DonVi))[/COLOR]
[COLOR=blue] If DonVi = "" Or DonVi = "d" Then[/COLOR]
[COLOR=blue]   dvNguyen = " " & ChrW(273) & ChrW(7891) & "ng"[/COLOR]
[COLOR=blue]   dvTp = " xu"[/COLOR]
[COLOR=blue] ElseIf DonVi = "m" Then[/COLOR]
[COLOR=blue]   dvNguyen = " mét"[/COLOR]
[COLOR=blue]   dvTp = " cm"[/COLOR]
[COLOR=blue] ElseIf DonVi = "u" Then[/COLOR]
[COLOR=blue]   dvNguyen = " usd"[/COLOR]
[COLOR=blue]   dvTp = " cent"[/COLOR]
[COLOR=blue] End If[/COLOR]
  
  '================
  'doc so thap phan
  '================
  s1 = "": s2 = ""
  If soLe = 0 Then
    If soNguyen > 0 Then s2 = " ch" & ChrW(7859) & "n"
  ElseIf soLe < 10 Then
    s2 = n09(soLe) & dvTp
  Else
    If Left(soLe, 1) = "1" Then
      s1 = " m" & ChrW(432) & ChrW(7901) & "i"
    Else
      s1 = n09(Left(soLe, 1)) & " m" & ChrW(432) & ChrW(417) & "i"
    End If
    If Right(soLe, 1) = "1" And Left(soLe, 1) <> "1" Then
      s2 = " m" & ChrW(7889) & "t" & dvTp
    ElseIf Right(soLe, 1) = "5" Then
      s2 = " l" & ChrW(259) & "m" & dvTp
    Else
      s2 = n09(Right(soLe, 1)) & dvTp
    End If
  End If
  SoVn = DsNguyen & dvNguyen & s1 & s2
End If
End Function
 

File đính kèm

Upvote 0
Đọc số thành chữ thường dùng trong tài chính kế toán:
- Uỷ nhiệm chi, giấy nộp tiền vào tài khoản, séc, khế ước nhận nợ
- Phiếu thu, phiếu chi, giấy nộp tiền vào ngân sách
- Hợp đồng kinh tế, packing list, LC,
Đa số sẽ theo 1 số quy ước, và quy ước trở thành quy định khi có dính dáng đến ngân hàng hoặc kho bạc (viết sai bảo đảm bị viết lại)
Quy ước đó là:
I. Tiếng Việt:
1. Đối với tiền tệ nói chung:
- Hai ngàn không trăm lẻ năm đồng chẵn.
- Ba trăm năm mươi ngàn, sáu trăm năm mươi hai Mỹ Kim (hoặc Đô la Mỹ) chẵn.
- Sáu mươi hai Đô la Mỹ/ Mỹ Kim/ Bảng Anh và ba cents/ hai mươi hai cents.
- Không phẩy bảy mươi đô la Mỹ
2. Đối với đơn vị đo lường khác (trong hợp đồng, trong Packing list)
- Chín trăm năm mươi hai tấn phẩy sáu mươi bốn
- Năm ngàn mét khối chẵn.
3. Không dùng đơn vị tính: (Ít dùng)
- Mười hai ngàn chẵn
- Ba phẩy năm mươi.

II. Tiếng Anh:
1. Tiền tệ
- Two thousand, five hundred US Dollars only
- Two thousand, seven hundred US Dollars and five/ twenty cents
2. Đơn vị khác
- Three hundred fifty four tons/ kilos point zero five/ point sixty
3. Không dùng đơn vị tính
- Eleven thousand only
- Ninety six point zero five

III. Dấu phẩy sau chữ ngàn, triệu, tỷ:
- Nếu số chẵn ngàn, chẵn triệu chẵn tỷ, sẽ là: Năm triệu đồng chẵn (không có dấu phẩy)
- nếu không, sẽ có dấu phẩy: Mười hai triệu, sáu trăm ba mươi ngàn, một trăm mười lăm đồng. (có 2 dấu phẩy)

IV: Viết hoa: Chỉ viết hoa đầu câu, và viết hoa đơn vị tính.

File kèm theo là 1 thí dụ. Trong đó có hàm đọc số tiếng việt font Vni, tiếng việt font unicode, tiếng Anh và tiếng Pháp, theo đầy đủ các mục trên.
 

File đính kèm

Upvote 0
Theo một số lần em đi nộp tiền ở ngân hàng, họ yêu cầu em không ghi chữ "chẵn", và có dấu chấm, hoặc dấu "./." sau chữ "đồng". Ví dụ:
100000 = Một trăm ngàn đồng.
105547 = Một trăm lẻ năm ngàn năm trăm bốn mươi bảy đồng./.
12324,50 = Mười hai ngàn ba trăm hai mươi bốn đồng năm mươi xu (không chấp nhận ghi năm hào).

Chuyện hào, xu gì đó thì em không để ý. Tuy nhiên em thích kiểu chi của họ, nghĩa là khỏi cần ghi chữ "chẵn", vì nó gọn nhẹ hơn, mà cũng dễ đọc. Theo như họ giải thích thì: thử chứng minh sự khác nhau giữa có và không có chữ "chẵn" xem. Em chịu!

Trong các hóa đơn bán hàng, em đều ghi như vậy, không bao giờ ghi chữ "chẵn" vào.
 
Upvote 0
Thông tin ptm0412 rất có ích để tham khảo. Mình không phải là dân kế toán nên không biết nhiều về các quy ước bên tài chánh.
Nhưng tôi cảm thấy chưa thống nhất.
Mã:
Hai ngàn không trăm lẻ năm đồng chẵn
Ba trăm năm mươi ngàn, sáu trăm năm mươi hai
Ở chỗ tôi vẫn dùng:
Hai ngàn không trăm lỉnh năm đồng
Ba trăm năm mươi ngàn sáu trăm năm mươi hai (không dùng dấu phẩy)
Còn số thập phân
Mã:
952,64 > [FONT='Times New Roman'][FONT=Verdana][SIZE=2]Chín trăm năm mươi hai tấn phẩy sáu mươi bốn[/SIZE][/FONT][/FONT]
952,04 > [FONT='Times New Roman'][FONT=Verdana][SIZE=2]Chín trăm năm mươi hai tấn phẩy không bốn[/SIZE][/FONT][/FONT]
952,0004 > Chín trăm năm mươi hai tấn phẩy không không không bốn nghe sao hơi lạ !
 
Upvote 0
Xin nói thêm, hôm qua bỏ sót: Trong tài chính kế toán:
- Quy ước tiền Việt làm tròn đến hàng đơn vị, nên có thể bỏ qua chữ "chẵn"
- Quy ước ngoại tệ làm tròn đến hàng 1 phần trăm, nên cần có chữ chẵn. Và sẽ không có 3 chữ số thập phân trở lên, nên không có trường hợp "phẩy không không không bốn"
- Các đơn vị tính khác không phải tiền tệ, cũng ít khi gặp nhiều số thập phân. Nếu có thì "không không không bốn" cũng chấp nhận được.
- Dấu chấm, hoặc chấm hết (./.) phải có 1 trong hai, tuỳ ngân hàng và kho bạc.
- Linh hay lẻ, bốn hay tư, lăm hay nhăm đó là theo vùng miền, không chiều hết được.

Nhớ ngày xưa thời bao cấp, chỉ có 1 hệ thống ngân hàng duy nhất của nhà nước, mọi giao dịch đều qua ngân hàng vì không có công ty tư nhân. Khi viết séc rút tiền mặt phải theo quy định cách viết. Cách viết lại thay đổi định kỳ để tránh trường hợp séc do người không có trách nhiệm viết hoặc nhân viên đã nghỉ làm lấy về nhà viết. Thí dụ sau một ký hiệu phẩy nào đó phải viết hoa, hoặc có và không có dấu phẩy ở chỗ này, chỗ khác.

Bây giờ hết bao cấp rồi mà vẫn còn những quy định này nọ, chỉ có giao dịch tiếng Anh với đối tác nước ngoài là khỏe
 
Upvote 0
Tự kể về viết hàm đọc số thành chữ

Trong bài trên, tôi có đưa 1 file thí dụ, trong đó có các hàm đọc số. Xin kể lại:
1. Code này tôi chép từ diễn đàn về, và sửa lại theo nhu cầu riêng - chỉ sửa phần râu ria, code chính không đụng tới - do đó có thể không thích hợp với người dùng khác. Các yêu cầu riêng đó là:
- Đọc tiếng Anh
- Viết hoa đầu câu và có dấu chấm cuối câu.
- Đọc số âm
- Đọc số thập phân
- Đơn vị tiền tệ thông dụng như đồng, USD, EUR được gán tham số định nghĩa sẵn (1, 2, 3), đơn vị khác tuỳ biến và người dùng có thể đưa vào tham số hàm không cần sửa code (thí dụ bảng Anh, tấn, mét, đồng âm phủ), và vẫn có thể không dùng với tham số định nghĩa trước là 0.
- Đơn vị đọc cho phần thập phân (1/100), có 2 tham số định nghĩa sẵn là dùng và không dùng (1, 0), nếu dùng sẽ theo mặc định tiền tệ USD và EUR, đồng VN vẫn không dùng vì luôn chẵn. Ngoài ra khi ngừơi dùng định nghĩa đơn vị tính nguyên khác, vẫn có thể định nghĩa đơn vị tính cho phần thập phân như xu, centimét, penny... vào tham số hàm.
- khi đọc tiếng Anh, phải phân biệt số nhiều để thêm "s", và có những ngoại lệ về số nhiều như foot-feet, penny-pence
- Code nguyên thuỷ là dùng cho font Vni. Sau này khi cần chuyển sang Unicode, tôi chỉ dùng 1 thủ thuật chuyển mã, không viết lại toàn bộ code của hàm.


2. Về dấu phẩy, tôi cũng cân nhắc, nếu cho vào thì với số nhỏ như 1250 sẽ hơi dư. Nhưng với số lớn như 22.123.455.789,45 mà không có dấu phẩy nào thì đọc sẽ đứt hơi mà chết. Cuối cùng tôi thà chấp nhận dư chứ nhất định xin được chết vì lý do khác, không muốn chết vì đứt hơi.
Bây giờ xem lại cũng có cách, chỉ cho dấu phẩy vào hàng triệu, không cho dấu phẩy vào hàng ngàn và hàng tỷ, cộng thêm điều kiện là chẵn triệu thì không cho.

3. Đối với người dùng khác, có thể sửa lại chút đỉnh râu ria là dùng được.
 
Upvote 0
Nếu chỉ đọc là tấn và tạ (1 chữ số thập phân) thôi thì sửa thế nào vậy anh... Như trên thì nó sẽ không phù hợp với phần "tạ", nó sẽ đọc theo 2 số thập phân
 
Upvote 0
Nếu chỉ đọc là tấn và tạ (1 chữ số thập phân) thôi thì sửa thế nào vậy anh... Như trên thì nó sẽ không phù hợp với phần "tạ", nó sẽ đọc theo 2 số thập phân
Sửa chút râu ria, thêm tham số thứ 4 DecNum là số chữ số thập phân cần đọc và có thể bỏ qua. Như vậy nếu DecNum =1, có thể đọc tấn, tạ. Nếu DecNum =3 có thể đọc Tấn, Kilogram. Xem thí dụ ô B1, B7, B12. Và đương nhiên DecNum=2 sẽ đọc Mét, Centimet.
Các đơn vị không phải tiền tệ như trên cho vào 2 tham số thứ 2 và 3
 

File đính kèm

Upvote 0
Hàm chuyển số thành chữ

Tôi có đoạn code này cũng copy trên mạng của Bác Hoàng Nguyên, nhưng về sửa khá nhiều, chủ yếu phục vụ đọc tiền là chính (gần chuẩn). Bây giờ muốn đọc số cả phần thập phân, thay đơn vị khác ví dụ tấn, tạ, mét, cm, m2, ... thì phải làm như thế nào? Nhờ các Pro xem hộ và chỉ bảo giúp, xin trân trọng cảm ơn trước!

Code:
Public Function Docso(number)
' By Hoang Nguyen
' Dich tu so ra thanh tien voi phong chu .VN

' Kiem tra truong hop dac biet voi so 0 va 1
If number = 0 Then
Dich = "Kh«ng."
ElseIf number = 1 Then
Dich = "Mét."
Else
' Neu khong phai 2 truong hop tren thi tiep tuc lam
so = Array("kh«ng", "mét", "hai", "ba", "bèn", "n¨m", "s¸u", "b¶y", "t¸m", "chÝn") 'mang so
DV = Array(".", "ngh×n", "triÖu", "tû", "ngh×n") 'mang don vi
SL = Len(Round(number, 0)) 'So luong ky tu trong chuoi da loai cac chu so thap phan
cap = Round(SL / 3 + 0.2, 0) 'Tinh xem chuoi nam trong pham vi mang don vi nao
Thua = SL Mod 3 'So ky tu cua mang don vi lon nhat
' Vong lap mang don vi
For i = 1 To cap
'Tinh so ky tu cua mang dang xet, Kiem tra xem co phai mang lon nhat khong
If i = cap And Thua <> 0 Then
b = Thua
Else
b = 3
End If
'Loc lay mang don vi can doc
ai = Left(Right(Round(number, 0), i * 3), b)
SLi = Len(ai)
'Kiem tra truong hop dac biet mang don vi dang xet bang khong het
If ai = "000" Then
If i = 1 Then
Dich = "."
Else
Dich = Dich
End If

Else
'Vong lap doc ky tu trong mang dang xet
For j = 1 To b
Hang = Array(DV(i - 1), "m&shy;¬i", "tr¨m") 'Mang don vi tinh cua ky tu
Docso = Mid(ai, (b + 1 - j), 1) 'Loc lay ky tu can doc
'Kiem tra truong hop dac biet ky tu bang khong
If Docso = 0 Then
If j = 1 Then
Doc = "" & Hang(j - 1)
danhdau1 = 1 'Thong bao ky tu don vi cua mang doc bang khong
ElseIf j = 2 Then
If danhdau1 = 1 Then
Doc = ""
danhdau2 = 1 'Thong bao 2 ky tu dau tien cua mang den bang khong
Else
Doc = "linh" 'Truong hop dac biet khi chu so hang chuc bang khong
End If
Else
If danhdau2 = 1 Then
Doc = "" 'Truong hop dac biet khi ca 3 chu so trong mang deu bang khong
Else
Doc = so(Docso) & " " & Hang(j - 1)
End If
End If
ElseIf Docso = 1 And j = 2 Then
Doc = "m&shy;êi" 'Tr&shy;¬ng hop dac biet khi ky tu hang chuc cua mang bang mot
ElseIf Docso = 5 And j = 1 And b <> 1 Then
Doc = "l¨m" & " " & Hang(j - 1) 'Truong hop dac biet khi ky tu hang don vi cua mang bang 5
ElseIf Docso = 4 And j = 1 And SL <> 1 Then
Doc = "bèn" & " " & Hang(j - 1) 'Truong hop dac biet khi ky tu hang don vi cua mang bang 4
Else
Doc = so(Docso) & " " & Hang(j - 1)
End If
Dich = Doc & " " & Dich 'Ket hop cac so da doc
Next
'Dua cac danh dau ve gia tri ban dau
danhdau1 = 0
danhdau2 = 0
End If
Next

End If

Docso = UCase(Left(Dich, 1)) & Mid(Dich, 2) 'Dua ra ket qua va sua ky tu dau tien thanh viet hoa.

End Function
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Hàm chuyển số thành chữ (tiếp)

2. Hàm đọc s tin:

Public Function Doctien(sotien)
' By Hoang Nguyen
' Dich tu so ra thanh tien voi phong chu .VN

' Kiem tra truong hop dac biet voi so 0 va 1
If sotien = 0 Then
Dich = "Kh«ng ®ång."
ElseIf sotien = 1 Then
Dich = "Mét ®ång."
Else
' Neu khong phai 2 truong hop tren thi tiep tuc lam
so = Array("kh«ng", "mét", "hai", "ba", "bèn", "n¨m", "s¸u", "b¶y", "t¸m", "chÝn") 'mang so
DV = Array("®ång.", "ngh×n", "triÖu", "tû", "ngh×n") 'mang don vi
SL = Len(Round(sotien, 0)) 'So luong ky tu trong chuoi da loai cac chu so thap phan
cap = Round(SL / 3 + 0.2, 0) 'Tinh xem chuoi nam trong pham vi mang don vi nao
Thua = SL Mod 3 'So ky tu cua mang don vi lon nhat
' Vong lap mang don vi
For i = 1 To cap
'Tinh so ky tu cua mang dang xet, Kiem tra xem co phai mang lon nhat khong
If i = cap And Thua <> 0 Then
b = Thua
Else
b = 3
End If
'Loc lay mang don vi can doc
ai = Left(Right(Round(sotien, 0), i * 3), b)
SLi = Len(ai)
'Kiem tra truong hop dac biet mang don vi dang xet bang khong het
If ai = "000" Then
If i = 1 Then
Dich = "®ång."
Else
Dich = Dich
End If

Else
'Vong lap doc ky tu trong mang dang xet
For j = 1 To b
Hang = Array(DV(i - 1), "m&shy;¬i", "tr¨m") 'Mang don vi tinh cua ky tu
Docso1 = Mid(ai, (b + 1 - j), 1) 'Loc lay ky tu can doc
'Kiem tra truong hop dac biet ky tu bang khong
If Docso1 = 0 Then
If j = 1 Then
Doc = "" & Hang(j - 1)
danhdau1 = 1 'Thong bao ky tu don vi cua mang doc bang khong
ElseIf j = 2 Then
If danhdau1 = 1 Then
Doc = ""
danhdau2 = 1 'Thong bao 2 ky tu dau tien cua mang den bang khong
Else
Doc = "linh" 'Truong hop dac biet khi chu so hang chuc bang khong
End If
Else
If danhdau2 = 1 Then
Doc = "" 'Truong hop dac biet khi ca 3 chu so trong mang deu bang khong
Else
Doc = so(Docso1) & " " & Hang(j - 1)
End If
End If
ElseIf Docso1 = 1 And j = 2 Then
Doc = "m&shy;êi" 'Tr&shy;¬ng hop dac biet khi ky tu hang chuc cua mang bang mot
ElseIf Docso1 = 5 And j = 1 And b <> 1 Then
Doc = "l¨m" & " " & Hang(j - 1) 'Truong hop dac biet khi ky tu hang don vi cua mang bang 5
ElseIf Docso1 = 4 And j = 1 And SL <> 1 Then
Doc = "bèn" & " " & Hang(j - 1) 'Truong hop dac biet khi ky tu hang don vi cua mang bang 4
Else
Doc = so(Docso1) & " " & Hang(j - 1)
End If
Dich = Doc & " " & Dich 'Ket hop cac so da doc
Next
'Dua cac danh dau ve gia tri ban dau
danhdau1 = 0
danhdau2 = 0
End If
Next

End If

Doctien = UCase(Left(Dich, 1)) & Mid(Dich, 2) 'Dua ra ket qua va sua ky tu dau tien thanh viet hoa.

End Function

 
Upvote 0
........
952,64 > Chín trăm năm mươi hai tấn phẩy sáu mươi bốn
952,04 > Chín trăm năm mươi hai tấn phẩy không bốn
952,0004 > Chín trăm năm mươi hai tấn phẩy không không không bốn nghe sao hơi lạ !
Bài này lâu rồi nhưng nay em mới đọc được và xin góp một chút ý kiến nhỏ thế này: theo toán học thì cách đọc của chỗ tô màu đỏ là sai hoàn toàn. Anh thử nghĩ nếu đọc số đó như vậy thì số này anh sẽ đọc thế nào nhé: 952,064.Như vậy ta sẽ có hai cách đọc đúng:
- Đọc theo kiểu mà anh nói là nghe hơi lạ đó!:-=.Tức là những con số sau dấu thập phân ta sẽ đọc theo thứ tự lần lượt từng số một (cách này được ưa chuộng nhất vì đơn giản hơn!)
- Đọc theo kiểu phần mười, phần trăm, phần ngàn, phần vạn, ....Ví dụ như đọc sáu mươi bốn phần trăm hay sáu trăm bốn mươi phần ngàn....
 
Upvote 0
Đọc số thập phân

Bài này lâu rồi nhưng nay em mới đọc được và xin góp một chút ý kiến nhỏ thế này: theo toán học thì cách đọc của chỗ tô màu đỏ là sai hoàn toàn. Anh thử nghĩ nếu đọc số đó như vậy thì số này anh sẽ đọc thế nào nhé: 952,064.Như vậy ta sẽ có hai cách đọc đúng:
- Đọc theo kiểu mà anh nói là nghe hơi lạ đó!:-=.Tức là những con số sau dấu thập phân ta sẽ đọc theo thứ tự lần lượt từng số một (cách này được ưa chuộng nhất vì đơn giản hơn!)
- Đọc theo kiểu phần mười, phần trăm, phần ngàn, phần vạn, ....Ví dụ như đọc sáu mươi bốn phần trăm hay sáu trăm bốn mươi phần ngàn....
Bạn logica có lý đấy nhưng theo em thì có lẽ tách riêng các yêu cầu thì sẽ dễ dàng hơn, vì theo cách 1 của bạn logica thì em thấy nếu ghép với các đơn vị đo lường có vẻ ổn
VD: 952,064 đồng (hoặc tấn, m, m2, ...) = chín trăm năm mươi hai phẩy không sáu tư (hoặc bốn) đồng (hoặc tấn, m, m2, ...)
còn cách 2 thì không ổn vì dài dòng
VD: 952,064 đồng (hoặc tấn, m, m2, ...) = chín trăm năm mươi hai phẩy sáu mươi bốn phần trăm (hay sáu trăm bốn mươi phần ngàn) đồng (hoặc tấn, m, m2, ...)
Nếu anh viết code đọc cho một đơn vị đo lường chuẩn nào đó (đồng, tấn, mét, mét vuông, KW, ...) rồi nếu có ai cần dùng đơn vị khác thì chỉ cần thay đổi đơn vị đo là được chứ ghép chung tất cả vào 1 thì tiện đấy nhưng khó có cách đọc phù hợp cho tất cả các kiểu đơn vị đo.
 
Upvote 0
Đổi số thành chữ

Em đã dùng thử code của anh Long, nhưng em thấy cách đọc đó chi tiết quá.
VD: 952,4 m2 = Chín trăm năm mươi hai mét vuông bốn mươi cm vuông.
theo em anh nên sửa lại để đọc là : Chín trăm năm mươi hai phẩy bốn mét vuông
nghe dễ chịu hơn.
 
Upvote 0
Mình đang cần sử dụng hàm đọc số để sử dụng cho công việc. Cụ thể mình muốn đọc số tới "1 chữ số sau dấu phảy" với đơn vị là "mét vuông".
thực sự là mình không biết "Name" hay "Code - VAB" là gì hết. Mong các cao thủ giúp cho.
Ví dụ: 14.12m2 là: Mười bốn phảy mười hai mét vuông.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Làm phiền Duy Long nha, mình đã tải file đính kèm nhung kg Add đươc bây giờ làm thế nào nhỉ
mình kg biết file này có giông hàm "=docsouni(conso)" kg
 
Upvote 0
Upvote 0

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom