PDA

View Full Version : Đọc số thập phân (số lẻ) như thế nào là đúng ?



phamduylong
27-04-07, 05:07 PM
Đọ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.

yeudoi
29-04-07, 07:31 AM
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ử

adua29
30-05-08, 02:08 PM
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

phamduylong
26-07-08, 10:03 PM
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.



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)


'===============
'Khai bao don vi
'===============
DonVi = LCase(Trim(DonVi))
If DonVi = "" Or DonVi = "d" Then
dvNguyen = " " & ChrW(273) & ChrW(7891) & "ng"
dvTp = " xu"
ElseIf DonVi = "m" Then
dvNguyen = " mét"
dvTp = " cm"
ElseIf DonVi = "u" Then
dvNguyen = " usd"
dvTp = " cent"
End If

'================
'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

ptm0412
27-07-08, 01:27 AM
Đọ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.

BNTT
27-07-08, 09:01 AM
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.

phamduylong
27-07-08, 09:50 AM
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.

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


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ạ !

ptm0412
27-07-08, 11:59 AM
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

ptm0412
27-07-08, 01:01 PM
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.

minhtuanhl
21-08-08, 04:35 PM
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

ptm0412
21-08-08, 08:28 PM
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

Ly_Hung
11-06-09, 02:40 PM
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­¬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­êi" 'Tr­¬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

Ly_Hung
11-06-09, 02:43 PM
2. Hàm đọc số tiền:

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­¬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­êi" 'Tr­¬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

logica
11-06-09, 10:26 PM
........
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....

Ly_Hung
12-06-09, 02:13 PM
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.

Ly_Hung
12-06-09, 04:06 PM
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.

lemanhha0276
11-08-10, 10:41 PM
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.

jonhchul
31-07-11, 01:21 PM
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

Hoàng Trọng Nghĩa
31-07-11, 03:07 PM
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

Có phải bạn muốn hỏi Thầy Phạm Duy Long? Nếu vậy xin bạn đọc đường link dưới đây:
http://www.giaiphapexcel.com/forum/showthread.php?40643-V%C3%B4-C%C3%B9ng-th%C6%B0%C6%A1ng-ti%E1%BA%BFc-Th%E1%BA%A7y-Ph%E1%BA%A1m-Duy-Long-v%E1%BB%ABa-t%E1%BA%A1-th%E1%BA%BF-l%C3%BAc-3-00AM-27-09-2010&p=269479#post269479

Thuyanhanoi
20-03-14, 10:43 PM
- Được Bác Văn "vanle33 (http://www.giaiphapexcel.com/forum/member.php?100916-vanle33)" chỉ bảo em vào chủ đề này.

Bạn vào đây http://www.giaiphapexcel.com/forum/s...%C4%91%C3%BAng (http://www.giaiphapexcel.com/forum/showthread.php?2048-%C4%90%E1%BB%8Dc-s%E1%BB%91-th%E1%BA%ADp-ph%C3%A2n-%28s%E1%BB%91-l%E1%BA%BB%29-nh%C6%B0-th%E1%BA%BF-n%C3%A0o-l%C3%A0-%C4%91%C3%BAng)
rồi nhờ các cao thủ code "chế biến" 1 chút chắc là OK.
- Em rất mong được các thành viên giúp em chế biến giùm em món code trong file đính kèm dưới đây. Em xin chân thành cảm ơn!.

Thuyanhanoi
20-03-14, 11:39 PM
Em chế từ code của Thầy Long thì ra thế này:
Option ExplicitFunction 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)


'===============
'Khai bao don vi
'===============
DonVi = LCase(Trim(DonVi))
If DonVi = "" Or DonVi = "" Then
dvNguyen = ""
dvTp = ""
ElseIf DonVi = "" Then
dvNguyen = ""
dvTp = ""
ElseIf DonVi = "" Then
dvNguyen = " "
dvTp = " "
End If

'================
'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

Thì no ra như sau

105.21 một trăm linh năm hai mươi mốt280.34 hai trăm tám mươi ba mươi bốn
455.47 bốn trăm năm mươi lăm bốn mươi bảy
630.60 sáu trăm ba mươi sáu mươi
805.73 tám trăm linh năm bảy mươi ba
980.86 chín trăm tám mươi tám mươi sáu
1,155.99 một nghìn một trăm năm mươi lăm chín mươi chín
1,331.12 một nghìn ba trăm ba mươi mốt mười hai
1,506.25 một nghìn năm trăm linh sáu hai mươi lăm
1,681.38 một nghìn sáu trăm tám mươi mốt ba mươi tám

Còn cài này chưa biết đưa vào chỗ nào hì hì ...
"ph" & ChrW(7843) & "y" để được như ý muốn
Nói chung không ổn ....

hngiatuong
20-03-14, 11:40 PM
Tại việt nam, việc đọc số phổ biến ở 2 dạng: 1 là trong toán học, và 2 là trong tiền tệ
- Trong toán học: VD 1,23 thì thường đọc là 1 phẩy 23 cái gì đó ( cụ thể hơn 1 phẩy 23 mét hoặc 123 xen ti mét hoặc 1230 mi li mét).
- Trong tiền tệ thì không có thập phân, chỉ có đồng, hào, xu. Khi số tiền lớn hơn đồng thì kết hợp với mười, chục, trăm, nghìn, chục nghìn, v.v... Do đồng tiền việt nam mất giá nên đơn vị tính hiện nay chủ yếu là đến tiền nghìn đồng, nên khi gặp vào một phép tính nào đó lẻ dẫn đến số tiền lẻ và bị coi là thập phân mà thôi (do định dạng tiền nghìn đồng là nhỏ nhất). Còn nếu có thì phải đọc là một đồng 2 hào 3 xu.
* Từ "chẵn" thì sao: do người Việt nam cẩn thận một cách đến ngu ngơ, nếu tiêu được tiền lẻ như vậy thì người ta cũng bắt ghi là một đồng 2 hào 3 xu chẵn. Mà đã trả đủ thì chả chẵn thì sao còn gọi là lẻ được (từ chẵn là từ thừa).
Lấy 1 VD khác: các tháng trong năm có 12 tháng, vậy nếu ghi thì chỉ cần ghi 2 tháng đầu năm là 01, 02 thôi chứ sao cứ phải ghi tháng 09 làm gì (trừ trường hợp bắt buộc do yêu cầu nhập máy tính chẳng hạn).
* Dấu ./. thì sao: cũng là thừa nốt, người ta đã ghi là một trăm nghìn đồng thì nó có khác gì với thêm 1 dấu "./." không? Dấu này chỉ dùng trong soạn thảo văn bản thôi. Thực chất ra là sợ để người khác ghi thêm phần sau, nhưng lại không nghĩ rằng chữ đồng là cuối cùng rồi (vì hiện tại không tiêu tiền hào). Còn từ "Tệ" đúng ra là không có chỉ có chữ "Tiền" thôi, nhưng do từ "tiền" mà nảy sinh nhiều "tệ nạn", mà từ đó người ta nói láy là tiền tệ lâu ngày thành quen không sửa được như ngày nay. Trong cuộc sống có nhiều từ kiểu như vậy.
Tôi kể 1 câu chuyện vui nhé: 1 hợp đồng VN & Nhật bản: VN đặt NB 1500 đôi giày nhưng để cẩn thận VN ghi là 3000 chiếc. Do đó NB sản xuất cho VN 3000 chiếc giày chân trái, và cũng vì thế VN phải đặt thêm 1 HĐ mới với 3000 chiếc giày chân phải (Cách đây cũng khá lâu rồi).
KL: Nhiều khi cẩn thận quá cũng không tốt./. ./.
Xin góp vui vài điều. Cảm ơn mọi người đã đọc bài viết này.

vanle33
21-03-14, 05:49 AM
- Được Bác Văn "vanle33 (http://www.giaiphapexcel.com/forum/member.php?100916-vanle33)" chỉ bảo em vào chủ đề này.

- Em rất mong được các thành viên giúp em chế biến giùm em món code trong file đính kèm dưới đây. Em xin chân thành cảm ơn!.
Bạn nhờ các thành viên chỉnh sửa code trong bài #5 hoặc #11. Mình thấy code đó gần phù hợp với yêu cầu của bạn.

Thuyanhanoi
21-03-14, 03:04 PM
Vâng!. Mong các bác giúp em, em cảm ơn nhiều!.

VetMini
21-03-14, 10:52 PM
...
Lấy 1 VD khác: các tháng trong năm có 12 tháng, vậy nếu ghi thì chỉ cần ghi 2 tháng đầu năm là 01, 02 thôi chứ sao cứ phải ghi tháng 09 làm gì (trừ trường hợp bắt buộc do yêu cầu nhập máy tính chẳng hạn).
...
... Còn từ "Tệ" đúng ra là không có chỉ có chữ "Tiền" thôi, nhưng do từ "tiền" mà nảy sinh nhiều "tệ nạn", mà từ đó người ta nói láy là tiền tệ lâu ngày thành quen không sửa được như ngày nay. Trong cuộc sống có nhiều từ kiểu như vậy.
Tôi kể 1 câu chuyện vui nhé: 1 hợp đồng VN & Nhật bản: VN đặt NB 1500 đôi giày nhưng để cẩn thận VN ghi là 3000 chiếc. Do đó NB sản xuất cho VN 3000 chiếc giày chân trái, và cũng vì thế VN phải đặt thêm 1 HĐ mới với 3000 chiếc giày chân phải (Cách đây cũng khá lâu rồi).
KL: Nhiều khi cẩn thận quá cũng không tốt./. ./.
Xin góp vui vài điều. Cảm ơn mọi người đã đọc bài viết này.

Cách viết tháng: Con số 0 đi trước các số 1-9 là thói quen chứ chẳng phải do cẩn thận. Nhiều người viết văn bản cần thêm như vậy để canh các con số ngay hàng; viết lâu rồi quen tay. Tôi là một trong số này.

Từ "tệ": cái này bạn phê bình hay nói đùa? Từ "tệ" có nghĩa là đơn vị kim ngạch. Đùa như vầy người không biết nghĩ rằng bạn dốt. Còn về chuyện "từ láy" thì nó thuộc về văn hoá. Bạn đã đủ trình độ để phê phán "láy" là hay hoặc dở sao?

Chuyện hợp đông VN - NB: người tự trọng không đùa giỡn với những câu chuyện phiếm tầm xàm có xu hướng chà đạp dân tộc.

ptm0412
21-03-14, 10:57 PM
- Trong tiền tệ thì không có thập phân, chỉ có đồng, hào, xu. Khi số tiền lớn hơn đồng thì kết hợp với mười, chục, trăm, nghìn, chục nghìn, v.v... Do đồng tiền việt nam mất giá nên đơn vị tính hiện nay chủ yếu là đến tiền nghìn đồng, nên khi gặp vào một phép tính nào đó lẻ dẫn đến số tiền lẻ và bị coi là thập phân mà thôi (do định dạng tiền nghìn đồng là nhỏ nhất). Còn nếu có thì phải đọc là một đồng 2 hào 3 xu.

Bạn cho biết bạn làm việc trong ngành nào? Công ty nào tính lương chẵn ngàn hay vậy? Bất cứ số chẵn ngàn nào trừ bảo hiểm 9.5% xong không thể còn chẵn ngàn. Sau đó trừ bảo hiểm ra, trừ các loại ra, tính thuế thu nhập cá nhân, chẵn ngàn mới là lạ.
Mà bạn có được phát lương qua thẻ không? Hoặc là gởi tiết kiệm? Nếu có, có khi nào bạn thấy tài khoản tăng thêm số tiền lãi chẵn ngàn không?

* Từ "chẵn" thì sao: do người Việt nam cẩn thận một cách đến ngu ngơ, nếu tiêu được tiền lẻ như vậy thì người ta cũng bắt ghi là một đồng 2 hào 3 xu chẵn. Mà đã trả đủ thì chả chẵn thì sao còn gọi là lẻ được (từ chẵn là từ thừa).

Quy ước ghi tiền tệ là năm đồng và hai mươi ba xu. Không có chẵn. Chỉ có chẵn đồng (không xu) mới là chẵn. Và bắt buộc là năm đồng chẵn. Chẳng có chữ nào thừa.

* Dấu ./. thì sao: cũng là thừa nốt, người ta đã ghi là một trăm nghìn đồng thì nó có khác gì với thêm 1 dấu "./." không?

Cuối câu thì phải chấm câu. Ít nhất là dấu chấm. Còn quy định văn bản hồi xưa là dấu chấm hết. Khi chuyển sang văn bản in thay cho văn bản viết tay thì chưa thay đổi quy định. Người lập báo cáo vẫn phải theo quy định mà làm. Tuy nhiên cũng chưa ai bị phạt vì dùng chấm thay cho chấm hết.


Còn từ "Tệ" đúng ra là không có chỉ có chữ "Tiền" thôi, nhưng do từ "tiền" mà nảy sinh nhiều "tệ nạn", mà từ đó người ta nói láy là tiền tệ lâu ngày thành quen không sửa được như ngày nay. Trong cuộc sống có nhiều từ kiểu như vậy.


Chữ tệ trong tiền tệ là từ hán việt, không phải tệ bạc. Bạn suy luận rằng "nói láy"?

Thuyanhanoi
24-03-14, 09:00 AM
Theo Em hiểu code của bài #4 không biết có đúng hay không!.
- Đọc phần nguyên.
- Đọc đơn vị
- Đọc phần thập phân
Vấn đề mà em cần là đọc phần nguyên và phần thập phân (được nối với nhau bằng chữ "phảy")
- Vậy mà sửa mãi không được
- Mong mọi người hướng giúp em với!.

trannghiavn2003
27-03-14, 01:36 PM
bài của anh rất hay, và mình thích nhất "không muốn chết vì đứt hơi"
haha, cảm ơn anh rất nhiều

trannghiavn2003
27-03-14, 01:46 PM
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


mãi hôm may mới được đọc bài của anh, rất hay
mình đang tìm cách đọc tiền từ số ra chữ với đô la đây
tải hoài mà không xong