xin code đọc số TIẾNG ANH - Đọc bình thường không kèm đơn vị tính toán (1 người xem)

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

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

campha

Thành viên mới
Tham gia
4/5/13
Bài viết
29
Được thích
7
Chào các bạn.

Mình tìm nhiều bài viết trên diễn đàn nhưng chủ yếu là viết code đọc chữ tiếng anh cho các đơn vị tính (tiền tệ, khối lượng...).
Mình mới học VBA nên chưa thể sửa được các code đó (thường là không có chữ AND như ở dưới).

Các bạn viết giúp code chỉ đọc số tiếng Anh bình thường

Ví dụ:
14,040: FORTEEN THOUSAND AND FORTY
4,001: FOUR THOUSAND AND ONE
9,700: NINE THOUSAND SEVEN HUNDRED.
25,469.87 : TWENTY FIVE THOUSAND FOUR HUNDRED AND SIXTY NINE POINT EIGHTY SEVEN
 
1 Function tuỳ biến từ Microsoft

Chào bạn

Mình tham khảo Function SpellNumber từ trang http://support.microsoft.com/kb/213360 và tuỳ biến. Mọi người kiểm tra giúp tuy nhiên vẫn chưa nghĩ ra cách xử lý triệt để chỗ màu đỏ (các bạn thử một số trường hợp bỏ chữ màu đỏ đi bị " and " ở đầu câu)
Code cho vào cùng 1 module

1. HÀM CHÍNH "SPELLNUMBER":
Mã:
Option Explicit
Function SpellNumber(ByVal MyNumber)
    Dim beforeDecimal, afterDecimal, Temp
    Dim DecimalPlace, Count
    ReDim Place(9) As String
    Place(2) = " Thousand "
    Place(3) = " Million "
    Place(4) = " Billion "
    Place(5) = " Trillion "
    ' -----String representation of amount.
    MyNumber = Trim(Str(MyNumber))
    ' -----Position of decimal place 0 if none.
    DecimalPlace = InStr(MyNumber, ".")
    ' -----Convert cents and set MyNumber to dollar amount.
    If DecimalPlace > 0 Then 
        afterDecimal = GetTens(Left(Mid(MyNumber, DecimalPlace + 1) & "00", 2))
        MyNumber = Trim(Left(MyNumber, DecimalPlace - 1))
    End If
    Count = 1
    Do While MyNumber <> ""
        Temp = GetHundreds(Right(MyNumber, 3))
        If Temp <> "" Then beforeDecimal = Temp & Place(Count) & beforeDecimal
        If Len(MyNumber) > 3 Then
            MyNumber = Left(MyNumber, Len(MyNumber) - 3)
        Else
            MyNumber = ""
        End If
        Count = Count + 1
    Loop
    If beforeDecimal = "" then beforeDecimal = "Zero"
    Select Case afterDecimal
        Case ""
            afterDecimal = ""
        Case Else
            afterDecimal = " point " & afterDecimal
    End Select
    SpellNumber = beforeDecimal & afterDecimal
   [COLOR=#ff0000] If Left(SpellNumber, 5) = " and " Then SpellNumber = Mid(SpellNumber, 6)[/COLOR]
End Function

2. LẤY GIÁ TRỊ HÀNG TRĂM CUẢ TỪNG BỘ 3 CHỮ SỐ
Mã:
' Converts a number from 100-999 into text
Function GetHundreds(ByVal MyNumber)
    Dim Result As String
    If Val(MyNumber) = 0 Then Exit Function
    MyNumber = Right("000" & MyNumber, 3)
    ' -----Convert the hundreds place.
    If Mid(MyNumber, 1, 1) <> "0" Then
        Result = GetDigit(Mid(MyNumber, 1, 1)) & " Hundred "
    End If
    ' -----Convert the tens and ones place.
    If Mid(MyNumber, 2, 1) <> "0" Then
        Result = Result & " and " & GetTens(Mid(MyNumber, 2))
    Else
        If Mid(MyNumber, 3, 1) <> "0" Then
            Result = Result & " and " & GetDigit(Mid(MyNumber, 3))
        Else
            Result = Result & GetDigit(Mid(MyNumber, 3))
        End If
    End If
    GetHundreds = Result
End Function

3. LẤY GIÁ TRỊ HÀNG CHỤC
Mã:
' Converts a number from 10 to 99 into text.
Function GetTens(TensText)
    Dim Result As String
    Result = ""           ' Null out the temporary function value.
    If Val(Left(TensText, 1)) = 1 Then   ' If value between 10-19...
        Select Case Val(TensText)
            Case 10: Result = "Ten"
            Case 11: Result = "Eleven"
            Case 12: Result = "Twelve"
            Case 13: Result = "Thirteen"
            Case 14: Result = "Fourteen"
            Case 15: Result = "Fifteen"
            Case 16: Result = "Sixteen"
            Case 17: Result = "Seventeen"
            Case 18: Result = "Eighteen"
            Case 19: Result = "Nineteen"
            Case Else
        End Select
    Else                                 ' If value between 20-99...
        Select Case Val(Left(TensText, 1))
            Case 2: Result = "Twenty "
            Case 3: Result = "Thirty "
            Case 4: Result = "Forty "
            Case 5: Result = "Fifty "
            Case 6: Result = "Sixty "
            Case 7: Result = "Seventy "
            Case 8: Result = "Eighty "
            Case 9: Result = "Ninety "
            Case Else
        End Select
        Result = Result & GetDigit _
            (Right(TensText, 1))  ' Retrieve ones place.
    End If
    GetTens = Result
End Function

4. LẤY GIÁ TRỊ HÀNG ĐƠN VỊ
Mã:
' Converts a number from 1 to 9 into text.
Function GetDigit(Digit)
    Select Case Val(Digit)
        Case 1: GetDigit = "One"
        Case 2: GetDigit = "Two"
        Case 3: GetDigit = "Three"
        Case 4: GetDigit = "Four"
        Case 5: GetDigit = "Five"
        Case 6: GetDigit = "Six"
        Case 7: GetDigit = "Seven"
        Case 8: GetDigit = "Eight"
        Case 9: GetDigit = "Nine"
        Case Else: GetDigit = ""
    End Select
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn nhé, kết quả tương đối ổn!
CÓ CÁCH NÀO KHÁC CÓ THỂ NGẮN GỌN HƠN KHÔNG NHỈ?
 
Upvote 0
Chào bạn

Mình tham khảo Function SpellNumber từ trang http://support.microsoft.com/kb/213360 và tuỳ biến. Mọi người kiểm tra giúp tuy nhiên vẫn chưa nghĩ ra cách xử lý triệt để chỗ màu đỏ (các bạn thử một số trường hợp bỏ chữ màu đỏ đi bị " and " ở đầu câu)
Code cho vào cùng 1 module

1. HÀM CHÍNH "SPELLNUMBER":
Mã:
    SpellNumber = beforeDecimal & afterDecimal
   [COLOR=#ff0000] If Left(SpellNumber, 5) = " and " Then SpellNumber = Mid(SpellNumber, 6)[/COLOR]

tôi không hiểu ý bạn rõ ràng lắm, với dòng màu đỏ là do bạn thêm vào? Nếu bạn thêm vào thì nó chả có tác dụng gì cả!

Tôi thử với sô này: 111,111,111,111

Kết quả, dù có dòng đỏ hay không dòng đỏ, đều như nhau:

One Hundred and Eleven Billion One Hundred and Eleven Million One Hundred and Eleven Thousand One Hundred and Eleven

Có chăng là trước chữ "and" của kết quả nó có 2 khoảng trắng trước nó mà thôi. Xử lý cái này cũng không khó:

(cái nào có & " and " thì sửa thành & "and " là xong)

Mã:
' Converts a number from 100-999 into text
Function GetHundreds(ByVal MyNumber)
    Dim Result As String
    If Val(MyNumber) = 0 Then Exit Function
    MyNumber = Right("000" & MyNumber, 3)
    ' -----Convert the hundreds place.
    If Mid(MyNumber, 1, 1) <> "0" Then
        Result = GetDigit(Mid(MyNumber, 1, 1)) & " Hundred "
    End If
    ' -----Convert the tens and ones place.
    If Mid(MyNumber, 2, 1) <> "0" Then
        [COLOR=#ff0000]Result = Result & "and " & GetTens(Mid(MyNumber, 2))[/COLOR]
    Else
        If Mid(MyNumber, 3, 1) <> "0" Then
            [COLOR=#ff0000]Result = Result & "and " & GetDigit(Mid(MyNumber, 3))[/COLOR]
        Else
            Result = Result & GetDigit(Mid(MyNumber, 3))
        End If
    End If
    GetHundreds = Result
End Function
 
Upvote 0
tôi không hiểu ý bạn rõ ràng lắm, với dòng màu đỏ là do bạn thêm vào? Nếu bạn thêm vào thì nó chả có tác dụng gì cả!

Tôi thử với sô này: 111,111,111,111

Kết quả, dù có dòng đỏ hay không dòng đỏ, đều như nhau:

One Hundred and Eleven Billion One Hundred and Eleven Million One Hundred and Eleven Thousand One Hundred and Eleven

Có chăng là trước chữ "and" của kết quả nó có 2 khoảng trắng trước nó mà thôi. Xử lý cái này cũng không khó:

(cái nào có & " and " thì sửa thành & "and " là xong)

Mã:
' Converts a number from 100-999 into text
Function GetHundreds(ByVal MyNumber)
    Dim Result As String
    If Val(MyNumber) = 0 Then Exit Function
    MyNumber = Right("000" & MyNumber, 3)
    ' -----Convert the hundreds place.
    If Mid(MyNumber, 1, 1) <> "0" Then
        Result = GetDigit(Mid(MyNumber, 1, 1)) & " Hundred "
    End If
    ' -----Convert the tens and ones place.
    If Mid(MyNumber, 2, 1) <> "0" Then
        [COLOR=#ff0000]Result = Result & "and " & GetTens(Mid(MyNumber, 2))[/COLOR]
    Else
        If Mid(MyNumber, 3, 1) <> "0" Then
            [COLOR=#ff0000]Result = Result & "and " & GetDigit(Mid(MyNumber, 3))[/COLOR]
        Else
            Result = Result & GetDigit(Mid(MyNumber, 3))
        End If
    End If
    GetHundreds = Result
End Function

Mình bỏ dòng đỏ If Left(SpellNumber, 5) = " and " Then SpellNumber = Mid(SpellNumber, 6) và thử thì bị thế này
Mã:
Sub test
Msgbox SpellNumber(1000) '[B][COLOR=#000080]<=== KQ: [/COLOR][COLOR=#ff0000]and[/COLOR][COLOR=#000080] One Thousand[/COLOR][/B]
Msgbox SpellNumber(14509.22) [B][COLOR=#000080]'<=== KQ: [/COLOR][COLOR=#ff0000]and[/COLOR][COLOR=#000080] Fourteen Thousand Five Hundred  and [/COLOR][COLOR=#000080]Nine point Twenty Two[/COLOR][/B]
End Sub
Còn nếu bỏ khoảng trắng "and" như Nghĩa hướng dẫn thì
Mã:
Sub Test1
Msgbox SpellNumber(14004)
[B]'<=== Kết quả: [COLOR=#ff0000]and[/COLOR]Fourteen Thousand [COLOR=#ff0000]and[/COLOR]Four[/B]
End Sub
Bạn kiểm tra lại xem
 
Lần chỉnh sửa cuối:
Upvote 0
Mình bỏ dòng đỏ If Left(SpellNumber, 5) = " and " Then SpellNumber = Mid(SpellNumber, 6) và thử thì bị thế này
Mã:
Sub test
Msgbox SpellNumber(1000) '[B][COLOR=#000080]<=== KQ: [/COLOR][COLOR=#ff0000]and[/COLOR][COLOR=#000080] One Thousand[/COLOR][/B]
Msgbox SpellNumber(14509.22) [B][COLOR=#000080]'<=== KQ: [/COLOR][COLOR=#ff0000]and[/COLOR][COLOR=#000080] Fourteen Thousand Five Hundred  and [/COLOR][COLOR=#000080]Nine point Twenty Two[/COLOR][/B]
End Sub
Còn nếu bỏ khoảng trắng "and" như Nghĩa hướng dẫn thì
Mã:
Sub Test1
Msgbox SpellNumber(14004)
[B]'<=== Kết quả: [COLOR=#ff0000]and[/COLOR]Fourteen Thousand [COLOR=#ff0000]and[/COLOR]Four[/B]
End Sub
Bạn kiểm tra lại xem

Bạn để ý trong Function GetHundreds người ta (trang Microsoft) chia phần trước dấu phẩy thành từng bộ 3 số để đọc. nên nếu số chữ số không đủ số bộ 3 số thì phần and mình tuỳ biến thêm vào sẽ bị thừa như trường hợp bạn test.

Msgbox SpellNumber(14509.22) '<=== and Fourteen Thousand Five Hundred and Nine point Twenty Two

vì vậy dòng lệnh If Left(SpellNumber, 5) = " and " Then SpellNumber = Mid(SpellNumber, 6) mặc dù hơi vô duyên nhưng mình cũng chưa tìm được cách hoàn thiện, hic. để nghiên cứu thêm vậy.
 
Lần chỉnh sửa cuối:
Upvote 0
sao tất cả đều proper thế nhỉ? Với lại không phải lúc nào, chỗ nào cũng and:

One Hundred and Eleven Billion One Hundred and Eleven Million One Hundred and Eleven Thousand One Hundred and Eleven

Thường người ta chỉ and khi số hàng trăm và/hoặc số hàng chục bằng không. Nhiều lắm thì and cho nhóm 3 số cuối cùng.
 
Upvote 0
Nếu tôi sửa hàm này, và hàm đó có kết quả như thế này:

Số ban đầu:

102,304,506,708,912

Kết quả:

One hundred and two trillion, three hundred and four billion, five hundred and six million, seven hundred and eight thousand, nine hundred twelve

Không biết như thế có đúng ý các bạn không nhỉ?
 
Upvote 0
Cảm ơn thầy Ptm0412! Đúng là hoa cả mắt ...
Nhu cầu của mình cũng chỉ cần đọc đến số hàng chục nghìn (ví dụ như #1) nên hàm tùy biến này tạm ổn. hic
Liệu có hàm nào có thể ngắn gọn hơn nữa không ah?

PS: Google mỏi mắt mà không biết cách đọc số chuẩn trong tiến anh ntn? Anh-Anh, Anh-Mỹ chắc cũng nhiều điểm khác nhau. Có tài liệu nào nói về vấn đề này không ạ?
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn thầy Ptm0412! Đúng là hoa cả mắt ...
Nhu cầu của mình cũng chỉ cần đọc đến số hàng chục nghìn (ví dụ như #1) nên hàm tùy biến này tạm ổn. hic
Liệu có hàm nào có thể ngắn gọn hơn nữa không ah?

PS: Google mỏi mắt mà không biết cách đọc số chuẩn trong tiến anh ntn? Anh-Anh, Anh-Mỹ chắc cũng nhiều điểm khác nhau. Có tài liệu nào nói về vấn đề này không ạ?

Hình như bạn chưa đọc bài trước của tôi nhỉ? (#8).

Nếu đúng ý, chúng ta cùng bắt tay nhau thực hiện nhé!

Dĩ nhiên dạng 10004 sẽ thành Ten thousand and four và dạng 1000 sẽ là One thousand.
 
Upvote 0
Hình như bạn chưa đọc bài trước của tôi nhỉ? (#8).

Nếu đúng ý, chúng ta cùng bắt tay nhau thực hiện nhé!

Dĩ nhiên dạng 10004 sẽ thành Ten thousand and four và dạng 1000 sẽ là One thousand.
Rất cảm ơn bạn Hoàng Trọng Nghĩa đã nhiêt tình giúp đỡ.
Mình cũng chưa chắc cách viết bài #8 đã là chuẩn chưa nên đang mải Google. nhưng bài #8 của ban không có "and twelve" có vẻ không ổn???
Mã:
[U][B]Số ban đầu:[/B][/U]

[COLOR=#0000ff][B]1[/B][/COLOR][COLOR=#ff0000][B]0[/B][/COLOR][COLOR=#0000ff][B]2,3[/B][/COLOR][COLOR=#ff0000][B]0[/B][/COLOR][COLOR=#0000ff][B]4,5[/B][/COLOR][COLOR=#ff0000][B]0[/B][/COLOR][COLOR=#0000ff][B]6,7[/B][/COLOR][COLOR=#ff0000][B]0[/B][/COLOR][COLOR=#0000ff][B]8,912[/B][/COLOR]

[B][U]Kết quả:[/U][/B]

[B][COLOR=#ff0000]O[/COLOR][COLOR=#0000ff]ne hundred [/COLOR][COLOR=#00ff00]and [/COLOR][COLOR=#0000ff]two trillion[/COLOR][COLOR=#ff0000],[/COLOR][COLOR=#0000ff]
three hundred [/COLOR][COLOR=#00ff00]and [/COLOR][COLOR=#0000ff]four billion[/COLOR][COLOR=#ff0000],[/COLOR][COLOR=#0000ff]
five hundred [/COLOR][COLOR=#00ff00]and [/COLOR][COLOR=#0000ff]six million[/COLOR][COLOR=#ff0000],[/COLOR][COLOR=#0000ff]
seven hundred [/COLOR][COLOR=#00ff00]and [/COLOR][COLOR=#0000ff]eight thousand[/COLOR][COLOR=#ff0000],[/COLOR][COLOR=#0000ff]
nine hundred [/COLOR][U][COLOR=#ff0000]twelve[/COLOR][/U][/B]
Bạn có thể giúp mình một hàm ngắn gọn hơn nữa được không? (và không có dấu phẩy "," trong câu.)
 
Lần chỉnh sửa cuối:
Upvote 0
Rất cảm ơn bạn Hoàng Trọng Nghĩa đã nhiêt tình giúp đỡ.
Mình cũng chưa chắc cách viết bài #8 đã là chuẩn chưa nên đang mải Google. nhưng bài #8 của ban không có "and twelve" có vẻ không ổn???
Mã:
[U][B]Số ban đầu:[/B][/U]

[COLOR=#0000ff][B]1[/B][/COLOR][COLOR=#ff0000][B]0[/B][/COLOR][COLOR=#0000ff][B]2,3[/B][/COLOR][COLOR=#ff0000][B]0[/B][/COLOR][COLOR=#0000ff][B]4,5[/B][/COLOR][COLOR=#ff0000][B]0[/B][/COLOR][COLOR=#0000ff][B]6,7[/B][/COLOR][COLOR=#ff0000][B]0[/B][/COLOR][COLOR=#0000ff][B]8,912[/B][/COLOR]

[B][U]Kết quả:[/U][/B]

[B][COLOR=#ff0000]O[/COLOR][COLOR=#0000ff]ne hundred [/COLOR][COLOR=#00ff00]and [/COLOR][COLOR=#0000ff]two trillion[/COLOR][COLOR=#ff0000],[/COLOR][COLOR=#0000ff]
three hundred [/COLOR][COLOR=#00ff00]and [/COLOR][COLOR=#0000ff]four billion[/COLOR][COLOR=#ff0000],[/COLOR][COLOR=#0000ff]
five hundred [/COLOR][COLOR=#00ff00]and [/COLOR][COLOR=#0000ff]six million[/COLOR][COLOR=#ff0000],[/COLOR][COLOR=#0000ff]
seven hundred [/COLOR][COLOR=#00ff00]and [/COLOR][COLOR=#0000ff]eight thousand[/COLOR][COLOR=#ff0000],[/COLOR][COLOR=#0000ff]
nine hundred [/COLOR][U][COLOR=#ff0000]twelve[/COLOR][/U][/B]
Bạn có thể giúp mình một hàm ngắn gọn hơn nữa được không? và không có dấu phẩy "," trong câu.

Không có dấu phẩy trong câu dễ ẹc, nhưng điều đó sẽ khiến bạn rối mắt khi đọc đó nha!

Tạm thời bạn cứ xem tôi xử lý (chữa cháy) cho bạn hàm này:

Mã:
Function SpellNumber(ByVal MyNumber)
    Dim beforeDecimal, afterDecimal, Temp
    Dim DecimalPlace, Count
    ReDim Place(9) As String
    Place(2) = " thousand[COLOR=#ff0000],[/COLOR] "
    Place(3) = " million[COLOR=#ff0000],[/COLOR] "
    Place(4) = " billion[COLOR=#ff0000],[/COLOR] "
    Place(5) = " trillion[COLOR=#ff0000],[/COLOR] "
    ' -----String representation of amount.
    MyNumber = Trim(Str(MyNumber))
    ' -----Position of decimal place 0 if none.
    DecimalPlace = InStr(MyNumber, ".")
    ' -----Convert cents and set MyNumber to dollar amount.
    If DecimalPlace > 0 Then
        afterDecimal = GetTens(Left(Mid(MyNumber, DecimalPlace + 1) & "00", 2))
        MyNumber = Trim(Left(MyNumber, DecimalPlace - 1))
    End If
    Count = 1
    Do While MyNumber <> ""
        Temp = GetHundreds(Right(MyNumber, 3))
        If Temp <> "" Then beforeDecimal = Temp & Place(Count) & beforeDecimal
        If Len(MyNumber) > 3 Then
            MyNumber = Left(MyNumber, Len(MyNumber) - 3)
        Else
            MyNumber = ""
        End If
        Count = Count + 1
    Loop
    If beforeDecimal = "" Then beforeDecimal = "zero"
    Select Case afterDecimal
        Case ""
            afterDecimal = ""
        Case Else
            afterDecimal = " point " & afterDecimal
    End Select
    [COLOR=#0000ff]SpellNumber = Replace(Trim(beforeDecimal & afterDecimal), ", and", " and")[/COLOR]
    If Left(SpellNumber, 4) = "and " Then SpellNumber = Mid(SpellNumber, 5)
   [COLOR=#ff0000] If Right(SpellNumber, 1) = "," Then SpellNumber = Left(SpellNumber, Len(SpellNumber) - 1)[/COLOR]
    SpellNumber = UCase(Left(SpellNumber, 1)) & Right(SpellNumber, Len(SpellNumber) - 1)
End Function

Nếu không muốn có dấu phẩy, thì bạn bỏ những gì có màu đỏ (các dấu phẩy tôi đánh màu đỏ và một hàng cuối cùng màu đỏ)

Và dòng xanh sửa lại thành:

SpellNumber = Trim(beforeDecimal & afterDecimal)
 

File đính kèm

Upvote 0
Không có dấu phẩy trong câu dễ ẹc, nhưng điều đó sẽ khiến bạn rối mắt khi đọc đó nha!

Tạm thời bạn cứ xem tôi xử lý (chữa cháy) cho bạn hàm này:

Mã:
Function SpellNumber(ByVal MyNumber)
    Dim beforeDecimal, afterDecimal, Temp
    Dim DecimalPlace, Count
    ReDim Place(9) As String
    Place(2) = " thousand[COLOR=#ff0000],[/COLOR] "
    Place(3) = " million[COLOR=#ff0000],[/COLOR] "
    Place(4) = " billion[COLOR=#ff0000],[/COLOR] "
    Place(5) = " trillion[COLOR=#ff0000],[/COLOR] "
    ' -----String representation of amount.
    MyNumber = Trim(Str(MyNumber))
    ' -----Position of decimal place 0 if none.
    DecimalPlace = InStr(MyNumber, ".")
    ' -----Convert cents and set MyNumber to dollar amount.
    If DecimalPlace > 0 Then
        afterDecimal = GetTens(Left(Mid(MyNumber, DecimalPlace + 1) & "00", 2))
        MyNumber = Trim(Left(MyNumber, DecimalPlace - 1))
    End If
    Count = 1
    Do While MyNumber <> ""
        Temp = GetHundreds(Right(MyNumber, 3))
        If Temp <> "" Then beforeDecimal = Temp & Place(Count) & beforeDecimal
        If Len(MyNumber) > 3 Then
            MyNumber = Left(MyNumber, Len(MyNumber) - 3)
        Else
            MyNumber = ""
        End If
        Count = Count + 1
    Loop
    If beforeDecimal = "" Then beforeDecimal = "zero"
    Select Case afterDecimal
        Case ""
            afterDecimal = ""
        Case Else
            afterDecimal = " point " & afterDecimal
    End Select
    [COLOR=#0000ff]SpellNumber = Replace(Trim(beforeDecimal & afterDecimal), ", and", " and")[/COLOR]
    If Left(SpellNumber, 4) = "and " Then SpellNumber = Mid(SpellNumber, 5)
   [COLOR=#ff0000] If Right(SpellNumber, 1) = "," Then SpellNumber = Left(SpellNumber, Len(SpellNumber) - 1)[/COLOR]
    SpellNumber = UCase(Left(SpellNumber, 1)) & Right(SpellNumber, Len(SpellNumber) - 1)
End Function

Nếu không muốn có dấu phẩy, thì bạn bỏ những gì có màu đỏ (các dấu phẩy tôi đánh màu đỏ và một hàng cuối cùng màu đỏ)

Và dòng xanh sửa lại thành:

SpellNumber = Trim(beforeDecimal & afterDecimal)
Tương đối ổn nhưng vẫn còn điểm chưa được bạn Nghĩa a! ý mình là nếu có hàng chục hoặc hàng đơn vị (khác số 0) phải có and ở trước.
VD trong file của Nghĩa:
111,111,111,111 : One hundred eleven billion, one hundred eleven million, one hundred eleven thousand, one hundred eleven => (phải là and eleven)
Mà hàm này dài quá đi, có cách nào gọn hơn không nhỉ?
 
Lần chỉnh sửa cuối:
Upvote 0
Tương đối ổn nhưng vẫn còn điểm chưa được bạn Nghĩa a! ý mình là nếu có hàng chục hoặc hàng đơn vị (khác số 0) phải có and ở trước.
VD trong file của Nghĩa:
111,111,111,111 : One hundred eleven billion, one hundred eleven million, one hundred eleven thousand, one hundred eleven => (phải là and eleven)
Mà hàm này dài quá đi, có cách nào gọn hơn không nhỉ?

Theo từ điển Oxford Dictionary thì những số lẻ là có AND bất cứ ở hàng triệu hay hàng trăm.

VD:

4,602: four thousand, six hundred and two

2,033,911: Two million and thirty-three thousand, nine hundred and eleven.

Nhưng có khi 1600 (một ngàn sáu trăm) nó lại có kiểu đọc:

1600: sixteen hundred

Còn ở Mỹ nó loại trừ hết những cái gì liên quan đến AND

VD:
$150 đọc là one hundred fifty dollars; năm 2006 đọc là two thousand six

BẠN CHỌN ĐI, HOẶC LÀ MỸ HOẶC LÀ ANH.

Hay bạn muốn "lai căng" bỏ hết tất cả and ngoại trừ hàng trăm?

 
Upvote 0
Theo từ điển Oxford Dictionary thì những số lẻ là có AND bất cứ ở hàng triệu hay hàng trăm.
Nghĩa giải thích giúp số lẻ có nghĩa là gì vậy? hàng triệu, hàng trăm này là tính bộ 3 số một?
Mình thấy đọc theo kiểu Anh là ổn, không quá thực dụng/ cắt xén như cách đọc kiểu Mỹ (tuy rằng kết quả như nhau).


Nhưng có khi 1600 (một ngàn sáu trăm) nó lại có kiểu đọc:
1600: sixteen hundred
Theo mình biết thì cách đọc như trên thường chỉ áp dụng với thời gian (ở đây không bàn đến)
VD 1600LT: Sixteen hundred Local Time (Giờ địa phương)

Bạn có thể giúp hàm nào đọc số theo chuẩn tiếng Anh - Anh được không? Many tks.
 
Upvote 0
Nghĩa giải thích giúp số lẻ có nghĩa là gì vậy? hàng triệu, hàng trăm này là tính bộ 3 số một?
Mình thấy đọc theo kiểu Anh là ổn, không quá thực dụng/ cắt xén như cách đọc kiểu Mỹ (tuy rằng kết quả như nhau).



Theo mình biết thì cách đọc như trên thường chỉ áp dụng với thời gian (ở đây không bàn đến)
VD 1600LT: Sixteen hundred Local Time (Giờ địa phương)

Bạn có thể giúp hàm nào đọc số theo chuẩn tiếng Anh - Anh được không? Many tks.

1) Tôi nói "số lẻ" là "linh" đó bạn, chẳng hạn: 107 là 1 trăm lẻ 7

2) Dạng chuẩn tiếng Anh là như thế này nè:

2,033,911: Two million and thirty-three thousand, nine hundred and eleven.

1,001: A thousand and one

1,111,167: A million, one hundred and eleven thousand, one hundred and sixty-seven.
 
Upvote 0
1)
2) Dạng chuẩn tiếng Anh là như thế này nè:

2,033,911: Two million and thirty-three thousand, nine hundred and eleven.

1,001: A thousand and one

1,111,167: A million, one hundred and eleven thousand, one hundred and sixty-seven.
Vẫn đang Google, tuy nhiên chưa thấy chỗ nào nói "A" giống ví dụ của bạn. (Cố gắng tìm hiểu tiếp)
Bạn có thể làm giúp 1 hàm ngắn gọn đọc như ví dụ trên được không nhưng:
+ Không có "A" mà phải 1 = One
+ Không có dấu "," (nhìn million, thousand, hundred ... là đủ hiểu rồi)
+ Dấu gạch ngang "-" ở hàng chục/ chục nghìn ... có cũng được nhưng không có thì OK hơn
=> Túm lại là viết liên mạch thêm "And" và những chỗ cần "And" theo tiêu chuẩn Anh-Anh
Many tks
 
Lần chỉnh sửa cuối:
Upvote 0
Vẫn đang Google, tuy nhiên chưa thấy chỗ nào nói "A" giống ví dụ của bạn. (Cố gắng tìm hiểu tiếp)
Bạn có thể làm giúp 1 hàm ngắn gọn đọc như ví dụ trên được không nhưng:
+ Không có "A" mà phải 1 = One
+ Không có dấu "," (nhìn million, thousand, hundred ... là đủ hiểu rồi)
+ Dấu gạch ngang "-" ở hàng chục/ chục nghìn ... có cũng được nhưng không có thì OK hơn
=> Túm lại là viết liên mạch thêm "And" và những chỗ cần "And" theo tiêu chuẩn Anh-Anh
Many tks

Bạn muốn biết tại sao trước dãy số từ hàng trăm trở đi mà có số 1 thì đọc là A thì bạn tham khảo tại đây, kể cả phân cách hàng với nhau cũng là dấu phẩy:

http://www.globaledu.com.vn/Thong-Tin-Chi-Tiet/2683/Tong-hop-ve-cach-doc-cac-so-lieu-trong-tieng-Anh

Tôi đã viết gần như hoàn chỉnh hàm chuyển số ra tiếng Anh. Bạn tham khảo tại link này:

Tặng UDF Function: Hàm đọc số thành chữ Tiếng Anh
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
[GPECODE=vba]
'Hàm này mình mới tham khảo và viết lại, các bạn coi thử nhé :

Option Explicit
Option Base 0
'Author: thaipv@live.com
'Date: 30/11/2014
'Reference: http://support.microsoft.com/kb/95640
'More: http://en.wikipedia.org/wiki/Names_of_large_numbers
Function DOCSOANH(ByVal SOTIEN, Optional VIETHOA As Boolean = True) As String
Dim TENCOSO, TENTEEN, TENCHUC, TENHANG(13), READ1__$, READ_23$, READ123$
Dim NUMBER1 As Byte, NUMBER2 As Byte, NUMBER3 As Byte, X As Byte

TENCOSO = Array("", " one", " two", " three", " four", " five", " six", " seven", " eight", " nine")
TENTEEN = Array(" ten", " elevent", " twelve", " thirteen", " fourteen", " fifteen", " sixteen", " seventeen", " eighteen", " nineteen")
TENCHUC = Array("", "", " twenty", " thirty", " forty", " fifty", " sixty", " seventy", " eighty", " ninety")
TENHANG(1) = " trillion,": TENHANG(4) = " billion,"
TENHANG(7) = " million,": TENHANG(10) = " thousand,"


If Trim$(SOTIEN) = "" Then
DOCSOANH = ""
ElseIf Not IsNumeric(SOTIEN) Then
DOCSOANH = "(ò_ó) Hmm, It is too embarrassing! XA can not read this number: " & "'" & SOTIEN & "'"
ElseIf SOTIEN < -10 ^ 15 Then
DOCSOANH = "(ò_ó) Hmm, It is too embarrassing! This number is too small to read."
ElseIf SOTIEN > 10 ^ 15 Then
DOCSOANH = "(ò_ó) Hmm, It is too embarrassing! This number is too large to read."
ElseIf Round(Abs(SOTIEN), 0) = 0 Then
DOCSOANH = IIf(VIETHOA = True, "Zero", "zero")
Else
'// Doc dau am/duong cua so tien va xy ly so tien truoc khi doc//
DOCSOANH = IIf(Round(SOTIEN, 0) < 0, "minus", "")
SOTIEN = Round(Abs(SOTIEN), 0): SOTIEN = "000000000000000" & SOTIEN
SOTIEN = Replace$(SOTIEN, ",", ""): SOTIEN = Right$(SOTIEN, 15)

'// Bat dau doc so //
For X = 1 To 13 Step 3
NUMBER1 = Mid$(SOTIEN, X, 1)
NUMBER2 = Mid$(SOTIEN, X + 1, 1)
NUMBER3 = Mid$(SOTIEN, X + 2, 1)
READ1__ = IIf(NUMBER1 = 0, "", TENCOSO(NUMBER1) & " hundread" & IIf(NUMBER2 = 0 And NUMBER3 = 0, "", " and"))
Select Case NUMBER2
Case 0: READ_23 = TENCOSO(NUMBER3)
Case 1: READ_23 = TENTEEN(NUMBER3)
Case Else: READ_23 = TENCHUC(NUMBER2) & TENCOSO(NUMBER3)
End Select
READ123 = READ1__ & READ_23
DOCSOANH = Trim$(DOCSOANH & IIf(Len(READ123) = 0, "", READ123 & TENHANG(X)))
Next X

'// Xu ly (nhung) dau phay (",") du thua, thay "one" = "a" o dau cau va VIET HOA chu dau tien //
DOCSOANH = IIf(Right$(DOCSOANH, 1) = ",", Left$(DOCSOANH, Len(DOCSOANH) - 1), DOCSOANH)
DOCSOANH = Replace$(DOCSOANH, "minus one", "minus a")
DOCSOANH = IIf(Left$(DOCSOANH, 3) = "one", "a" & Mid$(DOCSOANH, 4), DOCSOANH)
DOCSOANH = IIf(VIETHOA = True, UCase$(Left$(DOCSOANH, 1)) & Mid$(DOCSOANH, 2), DOCSOANH)
End If
End Function
[/GPECODE]
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom