ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 6772|ตอบกลับ: 1

[VB.NET] การแยกตัวเลขออกมาจากชุดข้อความ

[คัดลอกลิงก์]

308

กระทู้

498

โพสต์

5971

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
5971



บังเอิญไปเจอหัวข้อของ Excel ในเรื่อง TextJoin ฟังค์ชั่นที่คุณต้องรู้ เป็นเรื่องที่กล่าวถึงคำสั่งภายใน หรือฟังค์ชั่นของ Excel ในการเชื่อมต่อ (Join) ข้อความ แต่ในตัวอย่างเขาทำการแยกชุดตัวเลข (Number) ออกมาจากชุดข้อข้อความ (String) พอเห็นแล้วก็คิดว่าเป็นเรื่องที่น่าสนใจ ก็เลยนำมาเผยแพร่เป็นความรู้ให้กับคนที่พึ่งเริ่มหัดเขียนโปรแกรมใหม่ๆ ซึ่งมันมีหลากหลายวิธีมากในการแก้ปัญหาโจทย์เรื่องนี้ เอาเป็นว่าแอดมินจะตัดมาเป็นบางส่วนเพื่อเป็นตัวอย่างให้ได้รับชมกัน โดยเริ่มจากวิธีการคิดแบบพื้นฐานในแบบที่ทุกๆภาษาก็ใช้หลักการเดียวกันนี่แหละ ไปจนถึงการใช้ความสามารถในตัวของ Visual Basic .NET ก็ลองศึกษาและนำไปปรับใช้งานกันเองล่ะครับ ...

วิธีคิดแบบพื้นฐาน ...
1. อ่านค่าชุดข้อความ (String) อินพุทเข้ามาสัก 1 ชุด
2. แยกตัวอักขระ (Character) ทีละตัวออกมา แล้วเช็คว่ามันเป็นตัวเลข 0 - 9 หรือไม่ หากใช่ก็นำไปเก็บในตัวแปร แล้วก็วนรอบตามความยาวของชุดตัวอักษร
3. นำมาแสดงผล ... จบ

จากวิธีการคิดดังกล่าว เราสามารถนำมาเขียนเป็นโปรแกรมเพื่อทำการทดสอบได้ดังนี้คือ ...
  1.     ' / ----------------------------------------------------------------
  2.     ' / ทดสอบวิธีการคิดแบบพื้นฐาน
  3.     Private Sub BasicThinking()
  4.         Dim myString As String = "a25B1"
  5.         Dim myChar As String = ""
  6.         Dim myNum As String = ""
  7.         '/ วนรอบตามความยาวของชุดข้อความ
  8.         For i = 1 To Len(myString)
  9.             '/ แยกตัวอักขระออกมาเช็คทีละตัว เรียงจากซ้ายไปขวา
  10.             myChar = Mid(myString, i, 1)
  11.             Select Case myChar
  12.                 '/ มีค่าระหว่าง 0 - 9 หรือไม่
  13.                 Case "0" To "9"
  14.                     myNum = myNum + myChar
  15.             End Select
  16.         Next
  17.         MsgBox(myNum)
  18.     End Sub
คัดลอกไปที่คลิปบอร์ด
เป็นการคิดแก้ไขปัญหาจากโจทย์ในแบบฉบับขั้นพื้นฐาน

เพิ่มระดับการฝึกฝนด้วยกระบวนการคิด ในการเขียนเป็นฟังค์ชั่นทั้งการส่งค่าและรับค่าคืนกลับ ...
  1.     ' / ----------------------------------------------------------------
  2.     ' / เขียนแบบฟังค์ชั่นโดยการรับค่าชุดข้อความและคืนกลับชุดตัวเลข
  3.     Private Function SeparateNumber(ByVal myString As String) As String
  4.         SeparateNumber = ""
  5.         Dim myChar As String = ""
  6.         '/ วนรอบตามความยาวของชุดข้อความ
  7.         For i = 1 To Len(myString)
  8.             '/ แยกตัวอักขระออกมาเช็คทีละตัว เรียงจากซ้ายไปขวา
  9.             myChar = Mid(myString, i, 1)
  10.             Select Case myChar
  11.                 '/ มีค่าระหว่าง 0 - 9 หรือไม่
  12.                 Case "0" To "9"
  13.                     SeparateNumber = SeparateNumber + myChar
  14.             End Select
  15.         Next
  16.         Return SeparateNumber
  17.     End Function
คัดลอกไปที่คลิปบอร์ด

การใช้ String Builder
  1.     ' / ----------------------------------------------------------------
  2.     ' / การใช้ String Builder
  3.     Function GetNumberFromStringBuilder(ByVal theString As String) As Long
  4.         Dim sb As New System.Text.StringBuilder(theString.Length)
  5.         For Each ch As Char In theString
  6.             '/ หากเป็นตัวเลขให้นำไปต่อท้าย (Append)
  7.             If Char.IsDigit(ch) Then sb.Append(ch)
  8.         Next
  9.         Return Long.Parse(sb.ToString)
  10.     End Function
คัดลอกไปที่คลิปบอร์ด

การใช้ LINQ Statement
  1.     ' / ----------------------------------------------------------------
  2.     ' / การใช้ LINQ Statement
  3.     Private Function GetNumberFromStringLINQ(ByVal myString As String) As String
  4.         Dim numbers = (From s In myString
  5.                 Where (Char.IsDigit(s))
  6.                 Select Int32.Parse(s)).ToArray()
  7.         Dim myNums As String = ""
  8.         For Each n As String In numbers
  9.             myNums = myNums + n
  10.         Next
  11.         Return myNums
  12.     End Function
คัดลอกไปที่คลิปบอร์ด

การใช้ Regular Expressions ...
  1.     ' / ----------------------------------------------------------------
  2.     ' / การใช้ Regular Expressions การกำหนดรูปแบบหรือกลุ่มคำ เพื่อเอาไว้ใช้ค้นหาข้อความต่างๆตามที่เราต้องการ
  3.     ' / ต้อง Imports System.Text.RegularExpressions ด้วยล่ะ
  4.     Private Function RegExpress(ByVal value As String) As Integer
  5.         Dim returnVal As String = String.Empty
  6.         ' / การสร้าง MatchCollection เพื่อเก็บค่าที่ตรงกับความต้องการ
  7.         Dim collection As MatchCollection = Regex.Matches(value, "\d+")
  8.         For Each m As Match In collection
  9.             returnVal += m.ToString()
  10.         Next
  11.         Return Convert.ToInt32(returnVal)
  12.     End Function
คัดลอกไปที่คลิปบอร์ด
สำหรับ Regular Expressions หรือที่เรียกสั้นๆว่า Regex ค่อนข้างจะน่าสนใจเลยทีเดียว ก็ลองศึกษาค้นคว้ากันเพิ่มเติมนะครับ ส่วนเจ้า Pattern ที่เราต้องการค้นหา หรือที่เรียกมันว่า Cheat Sheet เราสามารถดูรูปแบบได้จากที่ Quick-Start: Regex Cheat Sheet

ตัวอย่างวิธีการที่ 1 นำมาใช้ในงานจริงกับการกระทำภายในตารางกริด ... (สำหรับ VB.Net)
  1.     ' / ----------------------------------------------------------------
  2.     ' / V.I เขียนฟังค์ชั่นขึ้นใช้งานเอง
  3.     Private Sub btnVersion1_Click(sender As System.Object, e As System.EventArgs) Handles btnVersion1.Click
  4.         '/ วนรอบตามจำนวนแถว
  5.         For i = 0 To DataGridView1.RowCount - 1
  6.             '/ อ่านค่าหลัก 0 (Index) ในแต่ละแถวเข้ามาเพื่อทำการแยกทีละ Character
  7.             Dim myString As String = DataGridView1.Rows(i).Cells(0).Value
  8.             Dim myNums As String = ""
  9.             Dim myChar As String
  10.             '/ อ่าน Character แต่ละตัวที่อยู่ในชุดข้อความ (ใช้ความยาวของชุดข้อความเป็นเงื่อนไข)
  11.             For x = 1 To Len(myString)
  12.                 '/ แยก Character มาทีละหลัก ไล่จากซ้ายไปขวา
  13.                 myChar = Mid(myString, x, 1)
  14.                 '/ ส่งค่า Character แต่ละตัวไปยังฟังค์ชั่น
  15.                 If CheckDigit(myChar) Then
  16.                     '/ หากมีค่า 0 - 9
  17.                     myNums = myNums + myChar
  18.                 End If
  19.             Next
  20.             DataGridView1.Rows(i).Cells(1).Value = Format(CLng(myNums), "#,##")
  21.         Next
  22.     End Sub
คัดลอกไปที่คลิปบอร์ด

การเขียนฟังค์ชั่นเพื่อใช้ตรวจสอบค่า 0 - 9 ขึ้นมาเอง ...
  1.     ' / ----------------------------------------------------------------
  2.     ' / เขียนฟังค์ชั่นขึ้นเอง เพื่อตรวจสอบว่าเป็นตัวเลข 0 - 9 หรือไม่
  3.     Function CheckDigit(ByVal ch As Char) As Boolean
  4.         Select Case ch
  5.             '/ หากมีค่าตั้งแต่ 0 - 9 ให้คืนค่า True
  6.             Case "0" To "9"
  7.                 CheckDigit = True
  8.             Case Else
  9.                 CheckDigit = False
  10.         End Select
  11.     End Function
คัดลอกไปที่คลิปบอร์ด
ค่าที่ส่งมา (ch) ยังฟังค์ชั่นก็จะเป็น Character หรือตัวอักขระ 1 ตัว โดยใช้เงื่อนไข "0" To "9" หากมีค่าตามนี้ก็จะคืนค่า True กลับไปบอก แต่ถ้าหากไม่ใช่มันก็คือ เท็จ หรือ False ... นี่คือวิธีที่เราๆท่านๆน่าจะคิดกันแบบโดยทั่วๆไป และทุกตัวแปรภาษาก็สามารถใช้ได้เลย

ตัวอย่างวิธีการที่ 2   
  1.     ' / ----------------------------------------------------------------
  2.     ' / V.II ใช้ความสามารถของตัวแปลภาษา
  3.     Private Sub btnVersion2_Click(sender As System.Object, e As System.EventArgs) Handles btnVersion2.Click
  4.         '/ วนรอบตามจำนวนแถว
  5.         For i = 0 To DataGridView1.RowCount - 1
  6.             '/ อ่านค่าหลัก 0 (Index) ในแต่ละแถวเข้ามาเพื่อทำการแยกทีละ Character
  7.             Dim myChars() As Char = DataGridView1.Rows(i).Cells(0).Value.ToCharArray()
  8.             Dim myNums As String = ""
  9.             '/ อ่าน Character แต่ละตัวที่อยู่ในชุดข้อความ
  10.             For Each ch As Char In myChars
  11.                 '/ เป็นตัวเลขหรือไม่
  12.                 If Char.IsDigit(ch) Then
  13.                     '/ หากใช่ให้แยกมาเก็บ โดยการจัดเรียงต่อกันด้วยเครื่องหมาย +
  14.                     myNums = myNums + ch
  15.                 End If
  16.             Next
  17.             '/ CLng = Convert To Long มีมาตั้งแต่ VB6 ครับ
  18.             DataGridView1.Rows(i).Cells(1).Value = Format(CLng(myNums), "#,##")
  19.         Next
  20.     End Sub
คัดลอกไปที่คลิปบอร์ด

ตัวอย่างวิธีการที่ 3
  1.     ' / ----------------------------------------------------------------
  2.     ' / V.III
  3.     Private Sub btnVersion3_Click(sender As System.Object, e As System.EventArgs) Handles btnVersion3.Click
  4.         '/ วนรอบตามจำนวนแถว
  5.         For i = 0 To DataGridView1.RowCount - 1
  6.             Dim theString As String = DataGridView1.Rows(i).Cells(0).Value
  7.             Dim sb As New System.Text.StringBuilder(theString.Length)
  8.             For Each ch As Char In theString
  9.                 If Char.IsDigit(ch) Then sb.Append(ch)
  10.             Next
  11.             DataGridView1.Rows(i).Cells(1).Value = Format(CLng(Long.Parse(sb.ToString)), "#,##")
  12.         Next
  13.     End Sub
คัดลอกไปที่คลิปบอร์ด
ดาวน์โหลดโค้ดต้นฉบับ VB.NET (2010) ได้ที่นี่

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

0

กระทู้

51

โพสต์

233

เครดิต

Full Member

Rank: 3Rank: 3

เครดิต
233
โพสต์ 2017-12-16 20:31:04 | ดูโพสต์ทั้งหมด

ขอบพระคุณมากครับอาจารย์

0

กระทู้

58

โพสต์

10

เครดิต

Member

Rank: 2

เครดิต
10
โพสต์ 2022-10-25 17:00:17 | ดูโพสต์ทั้งหมด

ขอบคุณครับ
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-3-29 07:35 , Processed in 0.195265 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้