แปลงตัวเลขเป็นอักษรบน Access2007 อ่านไม่รู้เรื่องค
กระทู้เก่าบอร์ด อ.Yeadram

 1,763   7
URL.หัวข้อ / URL
แปลงตัวเลขเป็นอักษรบน Access2007 อ่านไม่รู้เรื่องค

เรียนถามครับ
ผมคัดลอกโมดูลของกระทู้เก่ามาครับ เรื่องแปลงตัวเลข เป็น อักษรครับ
ก็ทำถูกวิธี คำนวณให้ แต่ผลอักษรมันไขว้ไปมา อ่านไม่รู้เรื่อง เป็นเพราะสาเหตุใดครับ รบกวนหน่อยครับ

7 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R06768
อีกนิดครับ ตัวอย่าง ที่มีปัญหาครับ
ค่าผมใส่ 100 บาท แปลงเป็นตัวอักษรที่ได้มาคือ   หนึ่่นบาทถ้วน

ผม Copy มาจากกระทู้ที่นี่ครับ และทำตามพี่ ๆครับ

Function BahtText(InputCurrency As Currency) As String
    Dim DigitSave, UnitSave, DigitName, DigitName1, UnitName, Satang, StrTmp, StrTmp1 As String
    Dim DecimalValue, CurrDigit, PrevDigit, StrLen, DigitBase, ScanDigit As Integer
    Dim IntegerValue As Double

    ' init variable
    DigitName = "ศูนย์ หนึ่ง สอง สาม สี่ ห้า หก เจ็ด แปด เก้า"    ' name of digit number
    DigitName1 = "ยี่ สาม สี่ ห้า หก เจ็ด แปด เก้า"        ' name of digit number in another call
    UnitName = "แสน ล้าน สิบ ร้อย พัน หมื่น"      ' name of digit base
    BahtText = ""
    Satang = ""

    ' check for negative val
    If InputCurrency < 0 Then
        InputCurrency = -InputCurrency
        BahtText = "ลบ"
    End If

    StrTmp1 = Format(InputCurrency, "0.00")             ' rounds up to 2 decimals
    InputCurrency = Val(StrTmp1)
    IntegerValue = Int(InputCurrency)                           ' get integer value
    DecimalValue = (InputCurrency - IntegerValue) * 100             ' get 2 decimal values

    ' check for zeto val
    If IntegerValue = 0 And DecimalValue = 0 Then
        Satang = "ศูนย์บาทถ้วน"
        GoTo locExit
    End If

    ' translate integer val to name if necesary
    If IntegerValue > 0 Then
        StrTmp = Left(StrTmp1, Len(StrTmp1) - 3)        ' get string of integer val
        StrLen = Len(StrTmp)                                 ' get string len
        CurrDigit = 0

        ' scan integer string and compute its name
        For ScanDigit = StrLen To 1 Step -1
            ' save previous digit
            PrevDigit = CurrDigit
            ' get digit base
            DigitBase = ScanDigit Mod 6
            ' convert digit character to numeric value
            CurrDigit = Asc(Mid(StrTmp, StrLen - ScanDigit + 1, 1)) - 48
            ' get unit name from its base
            UnitSave = RTrim(Mid(UnitName, DigitBase * 5 + 1, 5))
            ' get number name from Currdigit, depends on the digit base
            DigitSave = RTrim(Mid(IIf(DigitBase = 2, DigitName1, DigitName), CurrDigit * 5 + 1, 5))

            ' base ten and number 1
            If DigitBase = 1 And CurrDigit = 1 And PrevDigit <> 0 Then
               DigitSave = "เอ็ด"
            End If

            ' first digit base may be base million or 1
            If DigitBase = 1 And ScanDigit < 6 Then
               UnitSave = ""
            End If

            ' ignore add digit name in result string if it is zero
            If CurrDigit <> 0 Then
               BahtText = BahtText + DigitSave + UnitSave
            ElseIf DigitBase = 1 Then
               BahtText = BahtText + UnitSave
            End If
        Next ScanDigit

        BahtText = BahtText + "บาท"
    End If

    ' if no decimal value
    If DecimalValue = 0 Then
        Satang = "ถ้วน"
    ' compute decimal val to name, there are only 2 digit
    Else
        StrTmp = Right(StrTmp1, 2)

        ' name ot first digit
        CurrDigit = Asc(Left(StrTmp, 1)) - 48
        PrevDigit = CurrDigit

        If CurrDigit > 0 Then
            Satang = RTrim(Mid(DigitName1, CurrDigit * 5 + 1, 5)) + "สิบ"
        End If

        ' name of last digit
        CurrDigit = Asc(Right(StrTmp, 1)) - 48

        If CurrDigit > 0 Then
            Satang = Satang + IIf(CurrDigit = 1 And PrevDigit <> 0, "เอ็ด", RTrim(Mid(DigitName, CurrDigit * 5 + 1, 5)))
        End If

        ' store result and unit
        Satang = Satang + "สตางค์"
    End If

locExit:
    ' store result to BahtText
    BahtText = BahtText + Satang
End Function
2 @R06770
ตรวจสอบแล้วก็ใช้ได้นี่คับ
3 @R06775
ลองแก้ของเก่าเป็น 3 บรรทัดนี้ดู ผมว่าจำนวน space ใน string ของเดิมไม่น่าจะถูกต้อง

    DigitName = "ศูนย์หนึ่งสอง สาม สี่ ห้า หก   เจ็ด แปด เก้า "    ' name of digit number
    DigitName1 = "ยี่ สาม สี่ ห้า หก   เจ็ด แปด เก้า "        ' name of digit number in another call
    UnitName = "แสน ล้าน สิบ ร้อย พัน หมื่น"      ' name of digit base
4 @R06783
ขอบคุณครับ ผมลองทำแล้วครับ แต่ บางตัวเลขก็คำนวนไม่ได้
ที่ได้ หลัก ร้อย พัน หมื่น แสน ล้าน ได้ แต่ หลัก 10 ไม่ได้ เพราะอะไรครับ
เช่น 10-90 บาท ทำไม่ได้ แต่ 100-900 บาท ได้ครับ มันเยื่องแล้วคำนวนผิด

ยกตัวอย่างอีกครับ ถ้า 999,999 มันจะเป็น
เก้าแสนเก้าหมื่นเก้าพันเก้าร้อยสิบเก้าบาทถ้วน เป็นต้น มันไม่คำนวณหลักสิบให้

แก้ยังไงครับ ขอบคุณครับ
5 @R06784
เอาใหม่ DigitName1 = "          ยี่ สาม สี่ ห้า หก   เจ็ด แปด เก้า "
6 @R06786
ขอบคุณครับ พี่สันติสุข เส้นผมบังภูเขาจริง ๆ ครับ ได้แล้วครับ

พี่ครับ ทำไมผมใช้เครื่องตัวผมเอง สามารถดูอักษรจำนวนเงินได้
แต่ว่า ผม Copy File ไปเอาเครื่องอื่น มันไม่คำนวณให้ให้ครับ
มันขึ้น #name? อย่างนี้ แต่กลับผมลอง Copy ไปไว้ที่เครื่องก็ดูได้ครับ
ต้องทำยังไงดีครับ

ขอบคุณครับ พี่ ๆ
7 @R06787
พี่ครับ ผมทำได้แล้ว ไปปลดล๊อก มาโครครับ

@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3437s