Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Hàm] Hàm tách lấy số trong một chuỗi cho trước
#1
Nhân tiện giúp một bạn bên DKT, tôi đưa chủ đề này vào đây để bạn nào cần thì tham khảo

1a/ Câu hỏi
Tôi có đoạn văn bản sau : "Thanh toán cho Nguyễn Văn A vào tài khoản TK 001234567". Yêu cầu tách lấy sô 001234567. Vậy tôi phải làm sao?
1b/ Trả lời
Trong module, tạo một hàm tách lấy số dạng String như sau (Chỉ có String mới lấy được số 0 ở đầu)

Mã PHP:
Function SplitNumberString(strMyString As String) As String
    Dim strResults 
As StringstrTemp As String
    Dim i 
As Integer
    
For 1 To Len(strMyString)
        
strTemp Mid(strMyStringi1)
        If 
IsNumeric(strTemp) = True Then
            strResults 
strResults strTemp
        End 
If
    
Next
    SplitNumberString 
strResults
End 
Function 

2a/ Hỏi
Trong trường hợp tôi muốn tách lấy số để phục vụ tính toán thì sao?
2b/ Đáp
Sừa lại hàm trên một chút là được

Mã PHP:
Function SplitNumber(strMyString As String) As Double
    Dim strResults 
As StringstrTemp As String
    Dim i 
As Integer
    
For 1 To Len(strMyString)
        
strTemp Mid(strMyStringi1)
        If 
IsNumeric(strTemp) = True Then
            strResults 
strResults strTemp
        End 
If
    
Next
    SplitNumber 
Val(strResults)
End Function 
Chữ ký của Xuân Thanh Trăm năm trước thì ta chưa gặp
Trăm năm sau biết gặp được không?
Cuộc đời sắc sắc không không
Thì thôi ta cứ hết lòng vì nhau
ღღღღღTài sản của Xuân Thanh (View All Items) ღღღღღ
Reply
Những người đã cảm ơn anhemnhangu , quan_pc , haquocquan , pntnguyen , Minh Tiên , Noname , Che_Guevara
#2
3a/ Có bạn lại hỏi tôi : Tôi muốn tách lấy số để tính toán bao gồm cả số thập phân nữa thì làm sao? Ví dụ tách trong dãy số "abnd 12345.567 ghj" để lấy số 12345.567 sử dụng trong tính toán

3b/ Hàm SplitNumberDecimal sau đây sẽ xử lý việc đó

Mã PHP:
Function SplitNumberDecimal(strMyString As StringOptional DecimalPoint As String) As Double
    Dim strResults 
As StringstrTemp As String
    Dim intResultsIn 
As DoubleintResultsDe As Double
    Dim i 
As IntegerAs IntegerSo As Integer
    
For 1 To Len(strMyString)
        
strTemp Mid(strMyStringi1)
        If 
IsNumeric(strTemp) = True Or strTemp DecimalPoint Then
            strResults 
strResults strTemp
        End 
If
    
Next
    
For 1 To Len(strResults)
        
strTemp Mid(strResultsj1)
        If 
strTemp DecimalPoint Then
            intResultsIn 
Val(Left(strResults1))
            
So Val(Len(strResults) - j)
            
intResultsDe 10 ^ (-So) * Val(Right(strResultsLen(strResults) - j))
        Else
            
intResultsIn Val(strResults)
            
intResultsDe 0
        End 
If
    
Next
    SplitNumberDecimal 
intResultsIn intResultsDe
End 
Function 

Hàm này bao trùm cả hàm ở 2a + 2b
Thân mến
Chữ ký của Xuân Thanh Trăm năm trước thì ta chưa gặp
Trăm năm sau biết gặp được không?
Cuộc đời sắc sắc không không
Thì thôi ta cứ hết lòng vì nhau
ღღღღღTài sản của Xuân Thanh (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Minh Tiên , haquocquan , maidinhdan , pntnguyen
#3
Bài viết của Xuan Thanh rất hay và hữu ích, tuy nhiên xin chỉ giáo thêm 1 vấn đề như sau:
Tôi có một chuỗi ví dụ như "Nguyễn Văn A - Tài khoản ngân hàng VCB (007-201551463)"
Bây giời tôi muốn lấy ra số tài khoản có trong dấu ngoặc đơn (    ) qua 1 Field khác thì sẽ phải làm như thế nào??? Lưu ý: số tài khoản sẽ dài, ngắn khác nhau.
Chân thành cảm ơn
Chữ ký của pntnguyen Xin chào, mình là pntnguyen, Tham gia http://thuthuataccess.com/forum từ ngày 22-01 -14.
Reply
Những người đã cảm ơn
#4
(01-08-15, 09:12 PM)pntnguyen Đã viết: Hỏi: Tôi có một chuỗi ví dụ như "Nguyễn Văn A - Tài khoản ngân hàng VCB (007-201551463)"
Bây giời tôi muốn lấy ra số tài khoản có trong dấu ngoặc đơn (    )
Xin đóng góp 1 code
Trả lời để bạn hiểu rằng: Đoạn code saukhông phải là đoạn code lấy số tài khoản, mà là đoạn code xác định cái gì nằm trong dấy ngoặc đơn () thì nó sẽ lấy.
* Điểm yếu hàm này: Nếu số Tài khoản nẳm ở giữa thì nó sẽ ra sai, Vì vậy xem hàm thứ 2 phía dưới bài này, lấy số tài khoản nó đáp ứng hơn


Tạo một hàm mới:

Mã PHP:
Public Function Laysotrongdaungoac(Tencot As String) As String
' code by maidinhdan
Khi nao can thi goi ham nhu sauLaysotrongdaungoac([Tencot])
If 
Tencot Like "*(*" Then
Laysotrongdaungoac 
Replace(TencotLeft(TencotInStr(1Tencot"(") - 1), "")
Else
Laysotrongdaungoac "Chú này không có s" ChrW(7889) & " tài kho" ChrW(7843) & "n"
End If
End Function 

Cú pháp sử dụng: Laysotrongdaungoac([Tencot])

Hình minh họa khi chạy thử:
[Hình: Lay%20so%20trong%20ngoac.jpg]
Link demo phía dưới



Hy vọng giúp được bạn.
Thân mến!


File đính kèm
.zip   ex_Laysotaikhoantrongngoac.zip (Kích cỡ: 10.63 KB / Tải về: 20)
Chữ ký của maidinhdan * Để được hỗ trợ tốt nhất, nhấn vào link dưới đây để xem.
1. [Hướng dẫn] Kiểu file gửi lên để được giúp đỡ
2. [Hướng dẫn] Nội quy diễn đàn
3. [Hướng dẫn] Cách Đưa file và hình vào diễn đàn
4.[Hướng dẫn] Để xây dựng một ứng dụng hoàn hảo và lời cảm tạ
5. Cần tìm Demo hay ứng dụng sử dụng thanh tìm kiếm phía trên cùng, bên phải của diễn đàn.
* Nếu muốn cảm ơn, hãy nhấn nút thank, không cần viết thêm bài nào nửa.



ღღღღღTài sản của maidinhdan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Xuân Thanh , haquocquan
#5
(01-08-15, 09:12 PM)pntnguyen Đã viết: Hỏi: Tôi có một chuỗi ví dụ như "Nguyễn Văn A - Tài khoản ngân hàng VCB (007-201551463)"
Bây giời tôi muốn lấy ra số tài khoản có trong dấu ngoặc đơn (    )
Trả lời bổ sung
Xin đóng góp code thứ 2: Code này so với code trên link động hơn là: Chỉ cần biết số nằm trong dấu ngoặc (), không cần biết ở đầu hay ở cuối nó đều lấy trong dấu ngoặc:
* Code này linh động ở chỗ: Xác định vị trí của dấu ngoặc đơn thứ 1 (, sau đó xác định dấu ngoặc thứ 2 ), rồi lấy trong dấu (   )
* Hướng phát triển: Ta có thể thay vào code dấu ngoặc đơn bằng chữ nào mà ta muốn thay và lấy bất cứ ký tự nào.


Ví dụ: Nguyễn Văn An TK (007-599999999999993) Ngân Hàng X
- Nếu là code trên thi ( Laysotrongdaungoac) nó sẽ cho ra => (007-599999999999993) Ngân Hàng X
- Còn code dưới đây nó sẽ cho ra là: 007-599999999999993
Hàm:
Mã PHP:
Public Function Laysotrongdaungoac2(Tencot As String) As String
' code by maidinhdan
If Tencot Like "*(*" Then
Laysotrongdaungoac2 = Mid(Tencot, InStr(1, Tencot, "(") + 1, (InStr(1, Tencot, ")") - InStr(1, Tencot, "(")) - 1)
Else
Laysotrongdaungoac2 = "Chú này không có s" & ChrW(7889) & " tài kho" & ChrW(7843) & "n"
End If
End Function 

Cú pháp sử dụng: Laysotrongdaungoac2([Tencot])

Hình minh họa khi chạy thử:
[Hình: Lay%20so%20trong%20ngoacII.jpg]

Link demo phía dưới
Hy vọng giúp được bạn.
Thân mến!


File đính kèm
.zip   ex_Laysotaikhoantrongngoac(II).zip (Kích cỡ: 12.54 KB / Tải về: 25)
Chữ ký của maidinhdan * Để được hỗ trợ tốt nhất, nhấn vào link dưới đây để xem.
1. [Hướng dẫn] Kiểu file gửi lên để được giúp đỡ
2. [Hướng dẫn] Nội quy diễn đàn
3. [Hướng dẫn] Cách Đưa file và hình vào diễn đàn
4.[Hướng dẫn] Để xây dựng một ứng dụng hoàn hảo và lời cảm tạ
5. Cần tìm Demo hay ứng dụng sử dụng thanh tìm kiếm phía trên cùng, bên phải của diễn đàn.
* Nếu muốn cảm ơn, hãy nhấn nút thank, không cần viết thêm bài nào nửa.



ღღღღღTài sản của maidinhdan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Xuân Thanh , haquocquan
#6
Hướng phát triển theo cái thứ hai là chuẩn xác
Thân mến
Chữ ký của Xuân Thanh Trăm năm trước thì ta chưa gặp
Trăm năm sau biết gặp được không?
Cuộc đời sắc sắc không không
Thì thôi ta cứ hết lòng vì nhau
ღღღღღTài sản của Xuân Thanh (View All Items) ღღღღღ
Reply
Những người đã cảm ơn maidinhdan
#7
(26-12-13, 07:55 PM)Xuân Thanh Đã viết: 3a/ Có bạn lại hỏi tôi : Tôi muốn tách lấy số để tính toán bao gồm cả số thập phân nữa thì làm sao? Ví dụ tách trong dãy số "abnd 12345.567 ghj" để lấy số 12345.567 sử dụng trong tính toán

3b/ Hàm SplitNumberDecimal sau đây sẽ xử lý việc đó

Mã PHP:
Function SplitNumberDecimal(strMyString As StringOptional DecimalPoint As String) As Double
   Dim strResults 
As StringstrTemp As String
   Dim intResultsIn 
As DoubleintResultsDe As Double
   Dim i 
As IntegerAs IntegerSo As Integer
   For i 
1 To Len(strMyString)
       strTemp Mid(strMyStringi1)
       If IsNumeric(strTemp) = True Or strTemp DecimalPoint Then
           strResults 
strResults strTemp
       End 
If
   Next
   For j 
1 To Len(strResults)
       strTemp Mid(strResultsj1)
       If strTemp DecimalPoint Then
           intResultsIn 
Val(Left(strResults1))
           So Val(Len(strResults) - j)
           intResultsDe 10 ^ (-So) * Val(Right(strResultsLen(strResults) - j))
       Else
           intResultsIn 
Val(strResults)
           intResultsDe 0
       End 
If
   Next
   SplitNumberDecimal 
intResultsIn intResultsDe
End 
Function 

Hàm này bao trùm cả hàm ở 2a + 2b
Thân mến

Của bạn Xuân Thanh rất hay, nhưng sao khi tách một chuỗi như sau : 7AC35D5619434A115A08134151085D115BDD1345CD5954116F5E0C45196341445750

Nó lại ra kết quả là : 735,561,943,411,508,000,000,000,000,000,000,000,000,000,000,000,000,000

Các số 0 nó lấy ở đâu ra ý nhỉ, mà nó chỉ tách đúng được ở đoạn đầu, còn đoạn sau nó không tách nữa
Chữ ký của ledangvan Xin chào, mình là ledangvan, Tham gia http://thuthuataccess.com/forum từ ngày 22-08 -11.
ღღღღღTài sản của ledangvan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#8
Lỗi này có phải do khai báo biến intResultsIn là Double ko nhỉ? chỉ chính xác đến 15 số
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#9
(21-08-15, 12:29 PM)ongke0711 Đã viết: .....

Xin gửi thêm vào rừng cho các cụ một công cụ mạnh với việc xử lý số liệu đó là RegEx.
Về mặt khoa học, RegEx gần to bằng SQL và được sử dụng rất phổ biến trong các ứng dụng liên quan đến xử lý chuỗi.
Với riêng tình huống tách lấy số trong chuỗi thì có thể dùng code sau đây.
Ở đây ta cần chú ý đến đoạn
Optional InputPattern As String = "[\D]"
Mặc định tôi truyền tham số là tìm kiếm tất cả những gì không phải là số.
Sau đó sử dụng regex để thay thế chúng bằng chuỗi rỗng.

Các bạn có thể tham khảo nhiều trang về RegEx để biết thêm nhé.
https://www.google.com/webhp?sourceid=ch...x+tutorial


Mã:
Function GetOnlyNumber(InputText As String, Optional InputPattern As String = "[\D]") As String
    Dim regObj As Object
    Set regObj = CreateObject("VBScript.RegExp")
    With regObj
        .Global = True
        .MultiLine = False
        .IgnoreCase = False
        .Pattern = InputPattern
        If .Test(InputText) Then GetOnlyNumber = .Replace(InputText, "")
    End With
    Set regObj = Nothing
End Function
Chữ ký của paulsteigel ====================
Quốc gia hưng vong
Thất phu hữu trách
====================
Reply
Những người đã cảm ơn ongke0711 , Minh Tiên , Noname , maidinhdan , tranthanhan1962 , Che_Guevara
#10
Công cụ RegEx bác Paulstegel mạnh thật, chỉ cần vài dòng code là đáp ứng được yêu cầu. Được thêm cái để học hỏi nữa.  007
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  Hướng Dẫn Hàm API trong quản lý file và folder maidinhdan 1 290 22-04-16, 09:40 AM
Bài mới nhất: kieu manh
  Hướng Dẫn Tổng hợp hàm xử lý văn bản và chuỗi ( Có ví dụ) maidinhdan 0 314 16-04-16, 01:17 PM
Bài mới nhất: maidinhdan
  Hướng Dẫn Một số hàm D trong Access Xuân Thanh 12 6,620 22-01-16, 01:55 PM
Bài mới nhất: khanghychu
  Hướng Dẫn Một số hàm C... trong Access Xuân Thanh 2 1,324 21-01-16, 11:06 AM
Bài mới nhất: khanghychu
  Hướng Dẫn Demo Code Xếp hạng trong Query giống như hàm Rank trong Excel maidinhdan 0 1,183 02-03-15, 01:01 AM
Bài mới nhất: maidinhdan

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ