- Tham gia
 - 17/8/08
 
- Bài viết
 - 8,662
 
- Được thích
 - 16,725
 
- Giới tính
 - Nam
 
Nhằm đáp ứng nhu cầu của topic này:
Tôi đã nghiên cứu cách đọc từ nhiều nguồn (thậm chí trong từ điển Oxford Dictionary) và cụ thể là theo cách đọc của trang Global Education (http://www.globaledu.com.vn/Thong-Tin-Chi-Tiet/2683/Tong-hop-ve-cach-doc-cac-so-lieu-trong-tieng-Anh).
Vấn đề cách đọc phần thập phân, tôi cũng nghiên cứu như sau:
Nguồn: http://www.themathpage.com/arith/decimals-2.htm
Tôi chọn cách đọc thuận tiện (point zero, three, eight) hơn là cách đọc quy cách (Thirty-eight thousandths) nếu đọc đúng quy cách thật là khó nhận dạng!
Tôi xin tặng các bạn hàm đọc số thành chữ tiếng Anh ReadEnglishNumber. Hàm này đọc được số thập phân (tôi giới hạn đọc 3 số, các bạn có thể mở rộng hơn nếu muốn).
Với hàm này, tôi nghĩ người biết sơ về Array cũng có thể dễ dàng hiểu được cách tôi viết và cũng dễ dàng chỉnh sửa theo ý muốn của mình (có And hay không And, A hay One đầu câu, phẩy hay không phẩy v.v...).
Đây là hàm chính:
	
	
	
		
Các hàm hỗ trợ:
Hàm đọc phần nguyên:
	
	
	
		
Hàm đọc phần thập phân:
	
	
	
		
Sau khi các bạn tải file về, test mọi kiểu, nếu phát hiện lỗi hay cần bổ sung những gì thì gửi bài lên đây tôi sẽ điều chỉnh lại.
Hoàng Trọng Nghĩa.
============================================================
Đã có file update cho việc đọc số âm (Negative Numbers). Các bạn nên tải file NumberConvertHTN_V.1.1_Minus.xls để sử dụng.
				
			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
Tôi đã nghiên cứu cách đọc từ nhiều nguồn (thậm chí trong từ điển Oxford Dictionary) và cụ thể là theo cách đọc của trang Global Education (http://www.globaledu.com.vn/Thong-Tin-Chi-Tiet/2683/Tong-hop-ve-cach-doc-cac-so-lieu-trong-tieng-Anh).
Vấn đề cách đọc phần thập phân, tôi cũng nghiên cứu như sau:
Example 1.
.038
"38 thousandths"
Ignore the decimal point and read 038 as the whole number "Thirty-eight." The last digit, 8, falls in the thousandths place.
When we read .038 as "Point 0, 3, 8," that is "spelling" the number, which is often convenient. But its name is "Thirty-eight thousandths".
Nguồn: http://www.themathpage.com/arith/decimals-2.htm
Tôi chọn cách đọc thuận tiện (point zero, three, eight) hơn là cách đọc quy cách (Thirty-eight thousandths) nếu đọc đúng quy cách thật là khó nhận dạng!
Tôi xin tặng các bạn hàm đọc số thành chữ tiếng Anh ReadEnglishNumber. Hàm này đọc được số thập phân (tôi giới hạn đọc 3 số, các bạn có thể mở rộng hơn nếu muốn).
Với hàm này, tôi nghĩ người biết sơ về Array cũng có thể dễ dàng hiểu được cách tôi viết và cũng dễ dàng chỉnh sửa theo ý muốn của mình (có And hay không And, A hay One đầu câu, phẩy hay không phẩy v.v...).
Đây là hàm chính:
		Mã:
		
	
	Option Explicit
[COLOR=#008000][B]'***************************************************************************************************
'' Author: Hoang Trong Nghia - GiaiphapExcel.com
'' Version: V.1.0 - 5/5/2013
'***************************************************************************************************[/B]
[/COLOR]
Function ReadEnglishNumber(ByVal Series As String) As String
    If Not IsNumeric(Series) Then Exit Function
    Series = Replace(Series, " ", "")
    If Series = "" Then Exit Function
    If Series = 0 Then ReadEnglishNumber = "Zero.": Exit Function
    If Series >= 1E+15 Then ReadEnglishNumber = "No result (huge number).": Exit Function
    Dim arrUnits, Deci As String, Digi As String
    arrUnits = DecimalSpelling(Series)
    Digi = arrUnits(0): Deci = arrUnits(1)
    Dim DigitString, SplitArr, SplitArray, Ubd As Long, i As Long, JoinArr(), n As Long
    DigitString = Array("Hundred", " thousand", " million", " billion", " trillion")
    SplitArray = Split(Digi, ",")
    Ubd = UBound(SplitArray)
    ReDim SplitArr(0 To Ubd)
    For i = Ubd To 0 Step -1
        SplitArr(n) = SplitArray(i)
        n = n + 1
    Next
    Dim Itm As String: n = 0
    For i = Ubd To 0 Step -1
        Itm = SplitArr(i)
        If Itm > 0 Then
            If i = 0 Then
                ReDim Preserve JoinArr(0 To n)
                JoinArr(n) = Hundreds(Itm)
            Else
                ReDim Preserve JoinArr(0 To n)
                JoinArr(n) = Hundreds(Itm) & DigitString(i)
            End If
            n = n + 1
        End If
    Next
    Digi = Join(JoinArr, ", ")
    If Left(Digi, 4) = "one " Then
        Digi = Replace(Digi, "one ", "A ", , 1)
    Else
        Digi = UCase(Left(Digi, 1)) & Mid(Digi, 2)
    End If
    ReadEnglishNumber = Digi & Deci & "."
End Function
	Các hàm hỗ trợ:
Hàm đọc phần nguyên:
		Mã:
		
	
	[COLOR=#008000]''This is a supplemental function for 'ReadEnglishNumber' function:[/COLOR]
Private Function Hundreds(ByVal StrNum As String) As String
    Dim Units, LessThanTwenty, Tens
    Units = Array("zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine")
    LessThanTwenty = Array("ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", _
                           "seventeen", "eighteen", "nineteen")
    Tens = Array("twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety")
    Dim Len1 As String, Len2 As String, Len3 As String
    Select Case Len(StrNum)
    Case 1
        Hundreds = Units(StrNum)
    Case 2
        Select Case StrNum
        Case Is < 20
            Hundreds = LessThanTwenty(StrNum - 10)
        Case Else
            If StrNum Mod 10 = 0 Then
                Hundreds = Tens(StrNum / 10 - 2)
            Else
                Len1 = Right(StrNum, 1)
                Len2 = (StrNum - Len1) / 10 - 2
                Hundreds = Tens(Len2) & "-" & Units(Len1)
            End If
        End Select
    Case Else
        Len3 = Left(StrNum, 1)
        Hundreds = Units(Len3) & " hundred"
        Len3 = Val(Right(StrNum, 2))
        
        If Len3 > 0 Then
            Dim Hdrs As String
            Select Case Len(Len3)
            Case 1
                Hdrs = Units(Len3)
            Case 2
                Select Case Len3
                Case Is < 20
                    Hdrs = LessThanTwenty(Len3 - 10)
                Case Else
                    If StrNum Mod 10 = 0 Then
                        Hdrs = Tens(Len3 / 10 - 2)
                    Else
                        Len1 = Right(Len3, 1)
                        Len2 = (Len3 - Len1) / 10 - 2
                        Hdrs = Tens(Len2) & "-" & Units(Len1)
                    End If
                End Select
            End Select
            Hundreds = Hundreds & " and " & Hdrs
        End If
    End Select
End Function
	Hàm đọc phần thập phân:
		Mã:
		
	
	[COLOR=#008000]''This is a supplemental function for 'ReadEnglishNumber' function:[/COLOR]
Private Function DecimalSpelling(ByVal Series As String) As Variant
    Dim DeciSpell(0 To 1)
    Dim Point As Long, Deci As String, Digi As String
    Point = InStr(Series, "."): Digi = Series
    If Point = 0 Then
GoTo ExitFunction
    Else
        Deci = Mid(Series, Point)
        If Deci = 0 Then
GoTo ExitFunction
        Else
            Digi = Replace(Series, Deci, "")
            If Len(Deci) > 4 Then
                Deci = Format(Deci, "0.000")
                If Deci = 0 Then
GoTo ExitFunction
                ElseIf Deci = 1 Then
                    DeciSpell(0) = Format(Digi + 1, "#,##0")
                    DeciSpell(1) = ""
                    DecimalSpelling = DeciSpell
                    Exit Function
                Else
                    Deci = Replace(Deci, "0.", "")
                End If
            Else
                Deci = Replace(Deci, ".", "")
            End If
            Dim Units, arrUnits, Tens, i As Long, j As Long
            Units = Array("zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine")
            j = Len(Deci)
            ReDim arrUnits(1 To j)
            For i = 1 To j
                arrUnits(i) = Units(Mid(Deci, i, 1))
            Next
            DeciSpell(0) = Format(Digi, "#,##0")
            DeciSpell(1) = " point " & Join(arrUnits, ", ")
        End If
    End If
    DecimalSpelling = DeciSpell
    Exit Function
ExitFunction:
    DeciSpell(0) = Format(Digi, "#,##0")
    DeciSpell(1) = ""
    DecimalSpelling = DeciSpell
End Function
	Sau khi các bạn tải file về, test mọi kiểu, nếu phát hiện lỗi hay cần bổ sung những gì thì gửi bài lên đây tôi sẽ điều chỉnh lại.
Hoàng Trọng Nghĩa.
============================================================
Đã có file update cho việc đọc số âm (Negative Numbers). Các bạn nên tải file NumberConvertHTN_V.1.1_Minus.xls để sử dụng.
File đính kèm
			
				Lần chỉnh sửa cuối: 
			
		
	
								
								
									
	
								
							
							
	
	  




