Cách đọc đúng của đồng USD bằng tiếng việt:

Liên hệ QC
- VD: 123,50 USD thì đọc cách nào dưới đây thì đúng
1. Một trăm hai mươi ba Đô la Mỹ và năm mươi Cent
2. Một trăm hai mươi ba Đô la Mỹ và năm Cent
- Mình có cài phần mềm acchelper để chuyển đổi số thành chữ. Nhưng khi mình tắt đi vào lại là p cài lại từ đầu. Mình đang dùng excel2010. Còn excel 2013 thì k bị

Bạn cài AccHelper 3.1 là tốt nhất hiện nay. Thư mục Acchelper không nên để nằm trong nhiều thư mục con, nên để ngắn gọn, ví dụ như để tại D:\AccHelper là ngắn gọn.
 
Lần chỉnh sửa cuối:
Vậy thì "phần mềm" sai.
1. Phản hồi với tác giả để họ sửa.
2. Tìm cái khác thay thế.
Mình dùng hàm VND: thì nó ra bẩy cent, còn dùng hàm USD: thì nó ra bẩy mươi cent.
Mình muốn dùng hàm usd rồi dùng hàm dịch cho chính xác. Mà hàm dịch đặt rồi mà k đc
Bài đã được tự động gộp:

Bạn cài AccHelper 3.1 là tốt nhất hiện nay. Thư mục Acchelper không nên để nằm trong nhiều thư mục con, nên để ngắn gọn, ví dụ như để tại D:\AccHelper là ngắn gọn.
Mình đang cài AccHelper 3.1 rồi. Nhưng k rõ làm sao mà cài cùng 1 phần mềm mà bên máy dùng excel 13 thì đc nhưng dùng excel 10 thì cứ tắt cái bản excel đấy đi. Mỗi lần vào excel la lại p cài lại
 

File đính kèm

  • z2001137081074_09e10ee29e7d287e24886ba232a5bc30.jpg
    z2001137081074_09e10ee29e7d287e24886ba232a5bc30.jpg
    82 KB · Đọc: 9
Đọc "Một ngàn, tỷ" thì đúng là sai, code bên dưới đã sửa lại. Còn trường hợp kia tôi nghĩ là đọc như code là đúng, cái này còn tùy từng người nữa.
Mã:
Function DocSoTien(ByVal SoTien As Double, Dong As String, Xu As String) As String
    Dim Nguyen As Double, Le As Long
    SoTien = Round(SoTien, 2)
    Nguyen = Int(SoTien)
    Le = (SoTien - Nguyen) * 100
    DocSoTien = DocSo(Nguyen) & " " & Dong
    If Le <> 0 Then
        DocSoTien = DocSoTien & " v" & ChrW(224) & " " & DocSo(Le) & " " & Xu
    End If
    Mid(DocSoTien, 1, 1) = UCase(Mid(DocSoTien, 1, 1))
End Function
Private Function DocSo(ByVal SoTien As Double) As String
    Dim MyArray As Variant
    Dim Str As String
    Str = Format(Abs(SoTien), "000000000000000000")
    MyArray = 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 ", "tri" & ChrW(7879) & "u, ", "ngàn, ", "t" & ChrW(7927) & ", ", "tri" & ChrW(7879) & "u, ", "ngàn, ", "", "tr" & ChrW(259) & "m ", "m" & ChrW(432) & ChrW(417) & "i ", "không " & "m" & ChrW(432) & ChrW(417) & "i" & " không ", "không " & "m" & ChrW(432) & ChrW(417) & "i", "l" & ChrW(7867), "m" & ChrW(432) & ChrW(417) & "i" & " không", "m" & ChrW(432) & ChrW(417) & "i", "m" & ChrW(432) & ChrW(417) & "i" & " n" & ChrW(259) & "m", "m" & ChrW(432) & ChrW(417) & "i" & " l" & ChrW(259) & "m", "m" & ChrW(7897) & "t " & "m" & ChrW(432) & ChrW(417) & "i", "m" & ChrW(432) & ChrW(7901) & "i", "m" & ChrW(432) & ChrW(417) & "i" & " m" & ChrW(7897) & "t", "m" & ChrW(432) & ChrW(417) & "i" & " m" & ChrW(7889) & "t", "Âm ")
    If Str = "000000000000000000" Then
        DocSo = MyArray(0)
        Exit Function
    End If
    For i = 1 To Len(Str)
        If Left(Str, i) <> 0 And Mid(Str, (Int((i + 2) / 3) - 1) * 3 + 1, 3) <> 0 Then
            DocSo = DocSo & MyArray(Mid(Str, i, 1)) & MyArray(-(9 + i / 3) * (i Mod 3 = 0) - (15 + i Mod 3) * (i Mod 3 <> 0))
        ElseIf i = 9 And Mid(Str, 7, 3) = 0 And Left(Str, 6) <> 0 Then
            DocSo = DocSo & MyArray(12)
        End If
    Next
    DocSo = Replace(DocSo, ", " & MyArray(12), " " & MyArray(12))
    DocSo = Trim(Replace(Replace(Replace(Replace(Replace(Replace(DocSo, MyArray(18), MyArray(15)), MyArray(19), MyArray(20)), MyArray(21), MyArray(22)), MyArray(23), MyArray(24)), MyArray(25), MyArray(26)), MyArray(27), MyArray(28)))
    If SoTien < 0 Then
        DocSo = MyArray(29) & DocSo
    End If
    DocSo = Replace(Replace(DocSo & ".", ",.", "."), ".", "")
End Function
Em thấy hàm này đọc số 12.05 hình như chưa đúng thì phải. Em thấy giải thuật rất hay và code viết rất gọn, Sẳn tiện cho em hỏi anh có viết hàm đọc số tiếng anh chia sẻ cho em tham khảo với ạ
 
Em thấy hàm này đọc số 12.05 hình như chưa đúng thì phải. Em thấy giải thuật rất hay và code viết rất gọn, Sẳn tiện cho em hỏi anh có viết hàm đọc số tiếng anh chia sẻ cho em tham khảo với ạ
Hình như là sao bạn. UDF đọc như thế nào, theo bạn thì đọc thế nào mới đúng.
 
Mới viết
Mã:
Function ReadNumber(Num As Double) As Variant
Dim Arr1 As Variant, Arr2 As Variant, Arr3 As Variant, sStr As String, lG As Long, lN As Long, i As Long, k As Long
Arr1 = Array(" zero", " one", " two", " three", " four", " five", " six", " seven", " eight", " nine", " ten", " eleven", " twelve", " thirteen", " fourteen", " fifteen", " sixteen", " seventeen", " eighteen", " nineteen")
Arr2 = Array("", "", " twenty", " thirty", " forty", " fifty", " sixty", " seventy", " eighty", " ninety")
Arr3 = Array("", " thousand,", " million,", " billion,", " trillion,")
If Abs(Num) >= 10 ^ 15 Then
    ReadNumber = CVErr(xlErrNum)
Else
    sStr = "00" & Replace(LTrim(Replace(Format(Abs(Num), "000000000000000"), "0", " ")), " ", "0")
    For i = Len(sStr) - 2 To 1 Step -3
        lG = CLng(Mid(sStr, i, 3))
        If lG > 0 Then
            ReadNumber = Arr3(k) & ReadNumber
            lN = lG Mod 100
            If lN >= 20 Then
                ReadNumber = Replace(Arr2(lN \ 10) & Arr1(lN Mod 10), Arr1(0), "") & ReadNumber
            ElseIf lN > 0 Then
                ReadNumber = Arr1(lN) & ReadNumber
            End If
            If i > 2 Then ReadNumber = Arr1(lG \ 100) & " hundred" & IIf(lN > 0, " and", "") & ReadNumber
        End If
        k = k + 1
    Next
    ReadNumber = Trim(ReadNumber)
    ReadNumber = Replace(ReadNumber & ".", ",.", ".")
    If Num < 0 Then ReadNumber = "Negative " & ReadNumber
    Mid(ReadNumber, 1, 1) = UCase(Mid(ReadNumber, 1, 1))
End If
End Function
 
Mới viết
Mã:
Function ReadNumber(Num As Double) As Variant
Dim Arr1 As Variant, Arr2 As Variant, Arr3 As Variant, sStr As String, lG As Long, lN As Long, i As Long, k As Long
Arr1 = Array(" zero", " one", " two", " three", " four", " five", " six", " seven", " eight", " nine", " ten", " eleven", " twelve", " thirteen", " fourteen", " fifteen", " sixteen", " seventeen", " eighteen", " nineteen")
Arr2 = Array("", "", " twenty", " thirty", " forty", " fifty", " sixty", " seventy", " eighty", " ninety")
Arr3 = Array("", " thousand,", " million,", " billion,", " trillion,")
If Abs(Num) >= 10 ^ 15 Then
    ReadNumber = CVErr(xlErrNum)
Else
    sStr = "00" & Replace(LTrim(Replace(Format(Abs(Num), "000000000000000"), "0", " ")), " ", "0")
    For i = Len(sStr) - 2 To 1 Step -3
        lG = CLng(Mid(sStr, i, 3))
        If lG > 0 Then
            ReadNumber = Arr3(k) & ReadNumber
            lN = lG Mod 100
            If lN >= 20 Then
                ReadNumber = Replace(Arr2(lN \ 10) & Arr1(lN Mod 10), Arr1(0), "") & ReadNumber
            ElseIf lN > 0 Then
                ReadNumber = Arr1(lN) & ReadNumber
            End If
            If i > 2 Then ReadNumber = Arr1(lG \ 100) & " hundred" & IIf(lN > 0, " and", "") & ReadNumber
        End If
        k = k + 1
    Next
    ReadNumber = Trim(ReadNumber)
    ReadNumber = Replace(ReadNumber & ".", ",.", ".")
    If Num < 0 Then ReadNumber = "Negative " & ReadNumber
    Mid(ReadNumber, 1, 1) = UCase(Mid(ReadNumber, 1, 1))
End If
End Function
Em rất thích cách viết với giải thuật này của anh, nhìn nó gọn, còn các cách viết ở những bài em đã tham khảo thì thấy nó dài quá. Nhưng sẳn anh update cho nó đọc số lẻ (2 hoặc 3 chữ số lẻ thôi) luôn với.
 
Bạn cài AccHelper 3.1 là tốt nhất hiện nay. Thư mục Acchelper không nên để nằm trong nhiều thư mục con, nên để ngắn gọn, ví dụ như để tại D:\AccHelper là ngắn gọn.
Cái này chạy trên offcie 2019 bản 64b em thấy bị lỗi
Không chuyển "ngàn" thành "nghìn",
"lẻ" thành "linh" được.
 
Cái này chạy trên offcie 2019 bản 64b em thấy bị lỗi
Không chuyển "ngàn" thành "nghìn",
"lẻ" thành "linh" được.

Em xem trong thư mục ACCHELPER có file .INI, mở nó bằng Notepad và sửa sau đó lưu, đóng, mở lại Excel là được nhé.
 
Thắc mắc chút tại sao rõ ràng con số không có lẻ thập phân sao nó đọc ra chín bốn xu?
1608107995319.png
mà con số khác thì nó đọc đúng:
1608108134825.png
 
Thắc mắc chút tại sao rõ ràng con số không có lẻ thập phân sao nó đọc ra chín bốn xu?
View attachment 251326
mà con số khác thì nó đọc đúng:
View attachment 251327
Tại vì cả hai con số đều dài 15 chữ số. Chữ số kể từ 16 trở đi không bảo đảm.

(đoán đại vậy thôi chứ ai biết cái hàm này nó làm việc chính xác đợc đến bao nhiêu chữ số)
 
Tại vì cả hai con số đều dài 15 chữ số. Chữ số kể từ 16 trở đi không bảo đảm.

(đoán đại vậy thôi chứ ai biết cái hàm này nó làm việc chính xác đợc đến bao nhiêu chữ số)
Cũng kỳ là nó lấy 94 xu ấy ở đâu để đọc? Và chỉ thay 5 trăm ngàn tỷ đó thành 6 trăm ngàn tỷ thì không dư 94 xu nữa.
 
Cũng kỳ là nó lấy 94 xu ấy ở đâu để đọc? Và chỉ thay 5 trăm ngàn tỷ đó thành 6 trăm ngàn tỷ thì không dư 94 xu nữa.
Đã nói đoán đại mờ. Trên nguyên tắc thì chỉ cần biết là các con số sau 15 chữ số không đáng tin cậy, vậy thì nó có là 1 hay 99 đều có thể coi như 0.
Việc có thể đi vòng qua giới hạn này bằng cách đưa một chuỗi (string) dài ngoẵng vào thì tôi không biết - có thử đâu mà biết.
 
Anh ơi,

Cho e xin cách đọc tiếng anh có thêm phần thập phân (số lẻ) với.
Vd: 125.20 USD đọc là One hundred twenty five US dollars and twenty cents only.
Đã có số thập phân thì làm gì có only. Only chỉ dùng cho số tiền nguyên, tựa như chữ "chẵn" của tiếng Việt.
 
Web KT
Back
Top Bottom