- Tham gia
- 17/8/08
- Bài viết
- 8,662
- Được thích
- 16,718
- 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: