Tặng UDF Function: Hàm đọc số thành chữ Tiếng Anh

Liên hệ QC

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,610
Được thích
16,671
Giới tính
Nam
Nhằm đáp ứng nhu cầu của topic này:

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

  • NumberConvertHTN_V.1.0.xls
    67 KB · Đọc: 153
  • NumberConvertHTN_V.1.1_Minus.xls
    68.5 KB · Đọc: 203
Lần chỉnh sửa cuối:
Với hàm trước tôi chưa chú ý đến vấn đề số âm (Negative numbers), hôm nay tôi cập nhật thêm phiên bản mới bao gồm đọc luôn cả số âm.

Cách đọc số âm trong tiếng Anh cũng khá giống cách đọc của tiếng Việt:

Ví dụ: số -9 thì có hai cách đọc:

+) Đọc "negative nine" tương đương với cách đọc trong Tiếng Việt chúng ta là: "âm chín".

+) Đọc "minus nine" tương đương với cách đọc trong Tiếng Việt là: "trừ chín".

Hai cách đọc đó cũng giống nhau cả.

Tuy nhiên tôi sẽ chọn cách đọc dùng "Minus" vì nó có tính phổ biến hơn là từ kia (nhưng các bạn có thể thay thế "Negative" thay cho nó trong hàm nếu các bạn thích điều đó).

Sau đây là hàm mới cập nhật:

Mã:
Option Explicit
[COLOR=#008000][B]'***************************************************************************************************
'' Author: Hoang Trong Nghia - GiaiphapExcel.com
'' Version: V.1.1 - 6/5/2013
'***************************************************************************************************
[/B][/COLOR]
Function ReadEnglishNumber(ByVal Series As String) As String
    Series = Replace(Series, " ", "")
    If Not IsNumeric(Series) Then Exit Function
    Dim IsNegative As Boolean
[COLOR=#ff0000]    If Left(Series, 1) = "-" Then
        IsNegative = True
        Series = Replace(Series, "-", "")
    End If
[/COLOR]    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, ", ")
[COLOR=#ff0000]    If IsNegative Then
        Digi = "Minus " & Digi[/COLOR][COLOR=#008000] 'You can use "Negative" instead of "Minus"[/COLOR][COLOR=#ff0000]
[/COLOR]    Else
        If Left(Digi, 4) = "one " Then
            Digi = Replace(Digi, "one ", "A ", , 1)
        Else
            Digi = UCase(Left(Digi, 1)) & Mid(Digi, 2)
        End If
    End If
    ReadEnglishNumber = Digi & Deci & "."
End Function

Các bạn nên tải file NumberConvertHTN_V.1.1_Minus.xls về để test hoặc sử dụng tại bài 1 của topic này.
 
Lần chỉnh sửa cuối:
Upvote 0
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...).
Cảm ơn bạn về hàm này, đồng thời cho những người mới tập tành VBA như mình một ví dụ hay về sử dụng Array.
Code phần nguyên gộp vào chỉ 1 code rất OK, dễ hiểu. Tks again!
 
Upvote 0
Nếu muốn hàm ứng dụng rộng hơn, nhiều người dùng hơn, Nghĩa thêm vào tham số đơn vị tính phần nguyên, đơn vị tính phần thập phân, số chữ số thập phân cần đọc đơn vị tính

Thí dụ ReadE(Number, Unit, DecUnit, DecPlace)
ReadE(Number,"Meter", "Centimeter", 2)
ReadE(Number,"Ton","Kg",3)

Tên hàm ngắn thôi (ReadE, SayE, ...)
 
Upvote 0
Nếu muốn hàm ứng dụng rộng hơn, nhiều người dùng hơn, Nghĩa thêm vào tham số đơn vị tính phần nguyên, đơn vị tính phần thập phân, số chữ số thập phân cần đọc đơn vị tính

Thí dụ ReadE(Number, Unit, DecUnit, DecPlace)
ReadE(Number,"Meter", "Centimeter", 2)
ReadE(Number,"Ton","Kg",3)

Tên hàm ngắn thôi (ReadE, SayE, ...)

Chưa rõ nghĩa lắm Sư phụ, chẳng hạn là đơn vị Tiền Tệ, Khối Lượng, Khoảng Cách, v.v... phần nguyên thì OK, nhưng liên quan đến phần thập phân thì tính làm sao đây Sư phụ? Mình làm chỉ để đọc chứ đâu phải công cụ Convert những thứ đó?
 
Upvote 0
Chưa rõ nghĩa lắm Sư phụ, chẳng hạn là đơn vị Tiền Tệ, Khối Lượng, Khoảng Cách, v.v... phần nguyên thì OK, nhưng liên quan đến phần thập phân thì tính làm sao đây Sư phụ? Mình làm chỉ để đọc chứ đâu phải công cụ Convert những thứ đó?

Thí dụ có người muốn đọc:

Fourteen dollars and twenty cents (40.2)
Six tons and two hundred fifty five kilogams (6.255)

Và dĩ nhiên sẽ có người muốn đọc

Seven point five US dollars (7.5)
 
Lần chỉnh sửa cuối:
Upvote 0
Thí dụ có người muốn đọc:

Fourteen dollars and twenty cents (40.2)
Six tons and two hundred fifty five kilogams (6.255)

Và dĩ nhiên sẽ có người muốn đọc

Seven point five US dollars (7.5)

Thầy Ptm0412 có cách nhìn vấn đề thật tổng quát. Thật ra là ở mục hỏi đáp VBA mình nhờ Nghĩa làm 1 UDF để đọc "tương đối" chuẩn theo kiểu Anh-Anh sau đó tự tùy biến cho riêng mình (mình nghĩ nhu cầu đó cũng không ít)

@Nghĩa: Mình nghĩ Nghĩa phát triển hàm theo hướng thầy Ptm0412 chỉ là rất hay, bổ sung 3 optional. Nếu hàm ko có optional thì đọc số như bthg, nếu có đọc theo từng cách riêng biệt. Trước mắt như ví dụ của thầy PTM 0412.
Mọi người bổ sung thêm những trường hợp khác nhé (chủ yếu là liên quan đến đơn vị tiền tệ, trọng lượng, dung tích, khoảng cách... còn j hay dùng nữa ko nhỉ)
 
Upvote 0
Thầy Ptm0412 có cách nhìn vấn đề thật tổng quát. Thật ra là ở mục hỏi đáp VBA mình nhờ Nghĩa làm 1 UDF để đọc "tương đối" chuẩn theo kiểu Anh-Anh sau đó tự tùy biến cho riêng mình (mình nghĩ nhu cầu đó cũng không ít)

@Nghĩa: Mình nghĩ Nghĩa phát triển hàm theo hướng thầy Ptm0412 chỉ là rất hay, bổ sung 3 optional. Nếu hàm ko có optional thì đọc số như bthg, nếu có đọc theo từng cách riêng biệt. Trước mắt như ví dụ của thầy PTM 0412.
Mọi người bổ sung thêm những trường hợp khác nhé (chủ yếu là liên quan đến đơn vị tiền tệ, trọng lượng, dung tích, khoảng cách... còn j hay dùng nữa ko nhỉ)

Tôi biết chứ, nhưng tôi còn định phát triển nó tổng quát hơn, nhưng tôi đang vướng vấn đề cái phần thập phân, chẳng hạn nếu 40.2$ thì không nói, 40.225 nói chung là gặp trường hợp số thập phân lẻ tùm lum thì đọc làm sao?

Số Kg chẳng hạn, 1.2kg đọc làm sao? 1.25kg thì đọc làm sao? Rồi 1.256kg nó đọc làm sao? Rồi 1.006 kg nó đọc làm sao?

Vì tôi vướng mấy vụ này nên tôi chưa thể làm ngay.

Vã lại, tôi cân nhắc, đây là HÀM ĐỌC SỐ, chứ không phải HÀM CHUYỂN ĐỔI CÁC ĐƠN VỊ, nên tôi chưa có hướng làm.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi biết chứ, nhưng tôi còn định phát triển nó tổng quát hơn, nhưng tôi đang vướng vấn đề cái phần thập phân, chẳng hạn nếu 40.2$ thì không nói, 40.225 nói chung là gặp trường hợp số thập phân lẻ tùm lum thì đọc làm sao?

Số Kg chẳng hạn, 1.2kg đọc làm sao? 1.25kg thì đọc làm sao? Rồi 1.256kg nó đọc làm sao? Rồi 1.006 kg nó đọc làm sao?

Vì tôi vướng mấy vụ này nên tôi chưa thể làm ngay.

Vã lại, tôi cân nhắc, đây là HÀM ĐỌC SỐ, chứ không phải HÀM CHUYỂN ĐỔI CÁC ĐƠN VỊ, nên tôi chưa có hướng làm.

Theo quan điểm của mình: đọc số theo đơn vị tính thường đọc theo 1 số cặp đơn vị (nếu có) được quy là "chuẩn"
VD:
1,325.6t: ONE THOUSAND THREE HUNDRED AND TWENTY FIVE TONS AND SIX HUNDRED KILOGRAMS (tương đương 1,325.60 ~ 1,325.600): một nghìn ba trăm hai mươi lăm tấn và sáu trăm kilogam
68.2$: SIXTY EIGHT POINT TWO DOLLARS = SIXTY EIGHT DOLLARS AND TWENTY CENTS thâm chí đã từng nghe cách nói SIXTY EIGHT DOLLARS POINT TWENTY CENTS
Có thể thấy 1 số quy luật thường mặc định thế này:
+ nếu không có phần thập phân, chỉ có 1 đơn vị thì Ok. Hàm chỉ cần viết có thên 1 Optional: ReadE(number, donvidoc)
+ nếu có phần thập phân thường sẽ quy chuẩn theo đơn vị trước
Vd kilogram-gram, Tons-kilograms, meter-centimeter...: đọc đến 3 chữ số sau dấu phẩy (mặc định)
Dollars-cents: đọc đến 2 chữ số sau dấy phẩy (vì 100cents = 1$ rồi)
TÚM LẠI CHỈ CẦN UDF CÓ 1 OPTIONAL ReadE(number,donvitinh). Nếu người dùng có optional donvitinh và số có phần thập phân thì đọc theo cặp đơn vị và quy chuẩn đọc đến mấy chữ số theo dv tính là ok
TUY NHIÊN GỢI Ý HÀM CỦA THẦY PTM0412 SẼ TỔNG QUÁT, CHUẨN XÁC HƠN
 
Lần chỉnh sửa cuối:
Upvote 0
Theo quan điểm của mình: đọc số theo đơn vị tính thường đọc theo 1 số cặp đơn vị (nếu có) được quy là "chuẩn"
VD:
1,325.6t: ONE THOUSAND THREE HUNDRED AND TWENTY FIVE TONS AND SIX HUNDRED KILOGRAMS (tương đương 1,325.60 ~ 1,325.600): một nghìn ba trăm hai mươi lăm tấn và sáu trăm kilogam
68.2$: SIXTY EIGHT POINT TWO DOLLARS = SIXTY EIGHT DOLLARS AND TWENTY CENTS thâm chí đã từng nghe cách nói SIXTY EIGHT DOLLARS POINT TWENTY CENTS
Có thể thấy 1 số quy luật thường mặc định thế này:
+ nếu không có phần thập phân, chỉ có 1 đơn vị thì Ok. Hàm chỉ cần viết có thên 1 Optional: ReadE(number, donvidoc)
+ nếu có phần thập phân thường sẽ quy chuẩn theo đơn vị trước
Vd kilogram-gram, Tons-kilograms, meter-centimeter...: đọc đến 3 chữ số sau dấu phẩy (mặc định)
Dollars-cents: đọc đến 2 chữ số sau dấy phẩy (vì 100cents = 1$ rồi)
TÚM LẠI CHỈ CẦN UDF CÓ 1 OPTIONAL ReadE(number,donvitinh). Nếu người dùng có optional donvitinh và số có phần thập phân thì đọc theo cặp đơn vị và quy chuẩn đọc đến mấy chữ số theo dv tính là ok
TUY NHIÊN GỢI Ý HÀM CỦA THẦY PTM0412 SẼ TỔNG QUÁT, CHUẨN XÁC HƠN

Đối với tôi, thêm bao nhiêu option cũng chẳng có sao, nhưng tôi muốn là khi người ta tự gõ vào cái đơn vị thì nó sẽ theo đơn vị đó, tuy nhiên tôi chỉ vướng phần thập phân, thí dụ nó tính đơn vị là MÉT, phần thập phân nó không tính là centimet, mà nó tính là decimet chẳng hạn, như vậy đọc theo quy luật nào? Buồn buồn nó lấy là milimet thì tính ra sao?
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi biết chứ, nhưng tôi còn định phát triển nó tổng quát hơn, nhưng tôi đang vướng vấn đề cái phần thập phân, chẳng hạn nếu 40.2$ thì không nói, 40.225 nói chung là gặp trường hợp số thập phân lẻ tùm lum thì đọc làm sao?

Số Kg chẳng hạn, 1.2kg đọc làm sao? 1.25kg thì đọc làm sao? Rồi 1.256kg nó đọc làm sao? Rồi 1.006 kg nó đọc làm sao?

Vì tôi vướng mấy vụ này nên tôi chưa thể làm ngay.

Vã lại, tôi cân nhắc, đây là HÀM ĐỌC SỐ, chứ không phải HÀM CHUYỂN ĐỔI CÁC ĐƠN VỊ, nên tôi chưa có hướng làm.

Cả 3 tham số tôi thêm vào là optional. Tham số nào không dùng thì không gõ vào công thức.

Với số 1.25

1. Không muốn đọc đơn vị gì cả, thì gõ =ReadE(1.25) kết quả one point two five

2. Muốn đọc chỉ đơn vị phần nguyên, thì gõ =ReadE(1.25, "kilo"), kết quả one kilo point two five

3. Muốn đọc cả đơn vị phần nguyên lẫn đơn vị phần thập phân thì gõ = ReadE(1.25, "meter","centimeter",2), kết quả one meter and twenty five centimeters

4. Cũng như 3, nhưng kilo và gram, gõ =ReadE(1.25, "kilo", "gam", 3), kết quả One kilo and two hundred fifty gams

Nên nhớ hàm đọc số nhiều người dùng với nhiều mục đích, trên nhiều loại báo cáo khác nhau, yêu cầu khác nhau. Các mục 2, 3, 4 ở trên cũng là đọc số chứ có phải chuyển đổi đâu?

Chả lẽ cài addin này để đọc số, addin 2 để đọc tiền USD, addin 3 để đọc kilo, addin 4 để đọc tấn tạ, tấn kilo?

Đối với tôi, thêm bao nhiêu option cũng chẳng có sao, nhưng tôi muốn là khi người ta tự gõ vào cái đơn vị thì nó sẽ theo đơn vị đó, tuy nhiên tôi chỉ vướng phần thập phân, thí dụ nó tính đơn vị là MÉT, phần thập phân nó không tính là centimet, mà nó tính là decimet chẳng hạn, như vậy đọc theo quy luật nào? Buồn buồn nó lấy là milimet thì tính ra sao?

Đó là tham số thứ 4, nó vui hay buồn, nó phải biết nó muốn gì, và nó phải điền tham số thứ 4 cho đúng.
 
Upvote 0
Với số 1.25

1. Không muốn đọc đơn vị gì cả, thì gõ =ReadE(1.25) kết quả one point two five

2. Muốn đọc chỉ đơn vị phần nguyên, thì gõ =ReadE(1.25, "kilo"), kết quả one kilo point two five

3. Muốn đọc cả đơn vị phần nguyên lẫn đơn vị phần thập phân thì gõ = ReadE(1.25, "meter","centimeter",2), kết quả one meter and twenty five centimeters

4. Cũng như 3, nhưng kilo và gram, gõ =ReadE(1.25, "kilo", "gam", 3), kết quả One kilo and two hundred fifty gams
Đó là tham số thứ 4, nó vui hay buồn, nó phải biết nó muốn gì, và nó phải điền tham số thứ 4 cho đúng.
Tương đối "xương"
vd ReadE(1.265, "meter", "centimet", 2) = One meter and twenty six point five centimes.
Vừa phải có sự thiết lập mối liên hệ giữa phần thập phân và phần nguyên theo đv tính vừa phải xác định theo tham số thứ 4
Bạn nào có cao kiến gì xử lý đc ko?
 
Upvote 0
Tương đối "xương"
vd ReadE(1.265, "meter", "centimet", 2) = One meter and twenty six point five centimes.
Vừa phải có sự thiết lập mối liên hệ giữa phần thập phân và phần nguyên theo đv tính vừa phải xác định theo tham số thứ 4
Bạn nào có cao kiến gì xử lý đc ko?

Theo cách mà Sư phụ gợi ý là thế này, ReadE(1.265, "meter", "centimet", 2), lựa chọn 1 là số cần đọc, lựa chọn 2 là đơn vị chính trong phần nguyên, lựa chọn 3 là đơn vị phụ nếu có phần thập phân, lựa chọn 4 là số chia cho 10, 100, 1000.

Như thế hàm phải so sánh nhiều thứ, nó lại làm cho tôi tưởng đến hàm ĐỔI ĐƠN VỊ hơn là hàm đọc sồ thành chữ!
 
Upvote 0
Như thế hàm phải so sánh nhiều thứ, nó lại làm cho tôi tưởng đến hàm ĐỔI ĐƠN VỊ hơn là hàm đọc sồ thành chữ!

Hãy nghĩ đó là đọc số thành chữ kèm đơn vị tính.

Cũng không việc gì phải so sánh nhiều thứ đâu:

1. Đọc phần nguyên
2. Gán dơn vị tính 1
3. Lấy phần thập phân (0.25) nhân với 10^ n ra số mới (n là tham số thứ 4)
4. Đọc số mới
5. Gán đơn vị tính 2

Bước 4, 5 sử dụng lại chính hàm readE

PHP:
Function ReadE(number, Optional Unit, Optional DecUnit, Optional DecPlace)

a = Int(Number)
...
tmp = tmp & Unit

b = (Number Mod 1) * 10^ DecPlace
tmp = tmp & ReadE(b, DecUnit)

ReadE = tmp
End Function
 
Upvote 0
Hãy nghĩ đó là đọc số thành chữ kèm đơn vị tính.

Cũng không việc gì phải so sánh nhiều thứ đâu:

1. Đọc phần nguyên
2. Gán dơn vị tính 1
3. Lấy phần thập phân (0.25) nhân với 10^ n ra số mới (n là tham số thứ 4)
4. Đọc số mới
5. Gán đơn vị tính 2

Bước 4, 5 sử dụng lại chính hàm readE

PHP:
Function ReadE(number, Optional Unit, Optional DecUnit, Optional DecPlace)

a = Int(Number)
...
tmp = tmp & Unit

b = (Number Mod 1) * 10^ DecPlace
tmp = tmp & ReadE(b, DecUnit)

ReadE = tmp
End Function

Như thế, làm gì thì làm thì nếu có option 3 thì phải bắt buộc có option 4 chứ không thể bỏ qua được.

Uh, mà thôi, Sư phụ làm luôn đi! hihihihi
 
Lần chỉnh sửa cuối:
Upvote 0
Như thế, làm gì thì làm thì nếu có option 3 thì phải bắt buộc có option 4 chứ không thể bỏ qua được.

Uh, mà thôi, Sư phụ làm luôn đi! hihihihi

Ẹc, search thử xem, lão ct làm rồi. Muốn cho HTN góp chút công lao, hoặc ít ra cũng là học 1 bài về lập luận
 
Upvote 0
Hãy nghĩ đó là đọc số thành chữ kèm đơn vị tính.

Cũng không việc gì phải so sánh nhiều thứ đâu:

1. Đọc phần nguyên
2. Gán dơn vị tính 1
3. Lấy phần thập phân (0.25) nhân với 10^ n ra số mới (n là tham số thứ 4)
4. Đọc số mới
5. Gán đơn vị tính 2

Bước 4, 5 sử dụng lại chính hàm readE

PHP:
Function ReadE(number, Optional Unit, Optional DecUnit, Optional DecPlace)

a = Int(Number)
...
tmp = tmp & Unit

b = (Number Mod 1) * 10^ DecPlace
tmp = tmp & ReadE(b, DecUnit)

ReadE = tmp
End Function
Thầy Ptm0412 kiểm tra lại giúp lập luận từ bước 3 đến bước 5 có ổn ko khi ko có mối liên hệ nào giữa đơn vị phần nguyên và phần thập phân, cũng như giới hạn của tham số thứ 4.
nếu ReadE(1.265, "meter", "centimeter", 3) thì theo giải thuật của Thầy sẽ đọc là: One meter and two hundred and sixty five centimeter ???
Rõ rằng phải có theme điều kiện/ rằng bưộc mới xây dựng đc 1 hàm chuẩn xác. Mong các bạn góp ý
 
Upvote 0
Thầy Ptm0412 kiểm tra lại giúp lập luận từ bước 3 đến bước 5 có ổn ko khi ko có mối liên hệ nào giữa đơn vị phần nguyên và phần thập phân, cũng như giới hạn của tham số thứ 4.
nếu ReadE(1.265, "meter", "centimeter", 3) thì theo giải thuật của Thầy sẽ đọc là: One meter and two hundred and sixty five centimeter ???
Rõ rằng phải có theme điều kiện/ rằng bưộc mới xây dựng đc 1 hàm chuẩn xác. Mong các bạn góp ý

1. Người dùng phải biết mét đi với các đơn vị đo chiều dài cùng hệ. 1 mét 3 inch cũng không được mà 1 mét 10 gam cũng không được.
2. Người dùng phải biết 1 mét bằng bao nhiêu cm.

Không biết thì đừng đi làm lãnh lương, bạn hiểu chứ? Lập cái báo cáo với dòng chữ như vậy mà đem nộp cấp trên, về vợ nuôi cho rảnh.
 
Lần chỉnh sửa cuối:
Upvote 0
1. Người dùng phải biết mét đi với các đơn vị đo chiều dài cùng hệ. 1 mét 3 inch cũng không được mà 1 mét 10 gam cũng không được.
2. Người dùng phải biết 1 mét bằng bao nhiêu cm.

Không biết thì đừng đi làm lãnh lương, bạn hiểu chứ? Lập cái báo cáo với dòng chữ như vậy mà đem nộp cấp trên, về vợ nuôi cho rảnh.

Lắm lúc người ta lại nói, "tôi đi xe đò mất 36 tiếng 45 phút", đại loại là như vậy thì cái hàm nó "tửng từng tưng" luôn!

Theo em nghĩ, chẳng cần bận tâm đến số thập phân, và trong công việc của em cũng thế. Em chẳng bao giờ nói 1 tấn 300 ký, mà chỉ ghi 1,3 tấn, tiếng Anh thì 1.3 mts, thế thôi (chưa kể là Long Ton (1,016.047 kg), Short Ton (907.1847 kg), 2 cái đơn vị đều là Ton hết, quy ra số lẻ cũng ná thở).

Chiều cao cũng thế, cao 1 mét 60 em ghi 1,6 mét, chẳng cần quy ra 1 mét 6 decimet hay 1 mét 60 centimet hoặc 1 mét 600 milimet làm gì!
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom