2012-01-08 37 views
8

Tôi có một chương trình trong đó người dùng nhập danh sách các số dưới dạng chuỗi. Danh sách các số này luôn là bội số của 8.Cách chia chuỗi bằng x số ký tự

Vì vậy, danh sách có thể chứa số 8, 16, 32, 40, 48, v.v.

Tôi cần chia chuỗi đó thành 8 ký tự.

Ví dụ, nói người dùng nhập "1234123445674567"

Làm thế nào tôi có thể chia nó thành một mảng chuỗi nơi (0) là "12.341.234" và (1) là "45.674.567"

Lưu ý: Kích thước của mảng phải là tương đương với chiều dài của chuỗi chia 8.

như thế này:

Dim stringArray(txtInput.Text.Length/8) as String 

Edi t: Tôi biết tôi có thể làm điều này bằng cách tạo ra một vòng lặp đếm 8 số và chia nó thành một mảng nhưng điều đó sẽ dài và mất một vài biến và tôi biết có một cách hiệu quả hơn để thực hiện nó. Tôi chỉ không biết cú pháp.

Trả lời

4

này nên chia chuỗi thành một mảng của chuỗi con 8 ký tự

Dim orig = "12344321678900987" 
Dim res = Enumerable.Range(0,orig.Length\8).[Select](Function(i) orig.Substring(i*8,8)) 
+4

Nhân tiện, VB đủ thông minh để không cần '[Chọn]'. – Ryan

+0

@minitech Tôi không có ý tưởng về cú pháp VB - Tôi đã dịch truy vấn này tự động từ C# :) – dasblinkenlight

+3

Vâng, không ai muốn viết VB nữa :) Từ khóa trong VB sau một '.' không cần phải được thoát bằng' [ ] 'là tất cả. Vì vậy, bạn có thể làm cho nó một chút neater với '.Select' thay thế. – Ryan

4

Bạn có thể sử dụng một vòng lặp ForSubstring:

Dim strings As New List(Of String) 

For i As Integer = 0 To Me.txtInput.Text.Length - 1 Step 8 
    strings.Add(Me.txtInput.Text.Substring(i, 8)) 
Next 

Để chuyển đổi danh sách strings để một mảng (nếu bạn thực sự cần một), bạn có thể sử dụng strings.ToArray().


Ngoài ra, bạn có thể sử dụng biểu thức thông thường và LINQ cho một fancy một liner:

Text.RegularExpressions.Regex.Matches(Me.txtInput.Text, ".{8}").Select(Function(x) x.Value) 
+0

Tôi thích câu trả lời của bạn hơn những người khác. Đặc biệt là một lớp lót có vẻ rất hiệu quả. Có bất kỳ điều gì thêm tôi phải thêm hoặc nhập vào chương trình của tôi để làm cho nó hoạt động không? Tôi sẽ kiểm tra nó và nếu nó hoạt động tôi sẽ chấp nhận câu trả lời của bạn –

+1

@MarkKramer: Không, không nên có. Một lớp lót cần LINQ, chỉ có sẵn trong .NET 3.5 trở lên (VB 2008 hoặc cao hơn) nhưng đầu tiên hoạt động trong thực tế mọi thứ. – Ryan

+0

LINQ có phải là thứ mà người dùng cần được cài đặt trên máy tính của họ không? Hoặc chỉ cần một cái gì đó tôi cần trên tôi mà đi kèm với Visual Studio để biên dịch mã –

0
Function slice(ByVal s as String) As String() 
    Return (From c As String in s).ToArray() 
End Function 
+2

Tôi không chắc đây là giải pháp cho câu hỏi. Chiều dài của lát cắt đi vào đâu? –

0

Để mở rộng câu trả lời được chấp nhận, điều này sẽ chia chuỗi thành các phần ngay cả khi chuỗi không chia hết cho số chia

Public Function SplitInParts(s As String, partLength As Integer) As IEnumerable(Of String) 
     If String.IsNullOrEmpty(s) Then 
      Throw New ArgumentNullException("String cannot be null or empty.") 
     End If 
     If partLength <= 0 Then 
      Throw New ArgumentException("Split length has to be positive.") 
     End If 
     Return Enumerable.Range(0, Math.Ceiling(s.Length/partLength)).Select(Function(i) s.Substring(i * partLength, If(s.Length - (i * partLength) >= partLength, partLength, Math.Abs(s.Length - (i * partLength))))) 
    End Function 
Các vấn đề liên quan