2012-01-08 83 views
8

Tengo un programa donde un usuario ingresa una lista de números en forma de cadena. Esta lista de números es siempre un múltiplo de 8.Cómo dividir una cadena por x cantidad de caracteres

De modo que la lista puede contener 8, 16, 32, 40, 48, etc. números.

Necesito dividir esa cadena en cada 8 caracteres.

Por ejemplo, digamos que el usuario introduce "1234123445674567"

Cómo puedo dividirlo en una matriz de cadenas, donde (0) es "12341234" y (1) es "45674567"

Nota: el tamaño de la matriz tiene que ser igual a la longitud de la cadena dividido por 8.

Como esto:

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

Edi t: Sé que podría hacer esto haciendo un ciclo que cuente 8 números y lo divida en un conjunto, pero sería muy largo y tomaría algunas variables, y sé que hay una forma más eficiente de hacerlo. Simplemente no sé la sintaxis.

Respuesta

4

Esto debe dividir la cadena en una matriz de subcadenas de 8 caracteres

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

Por cierto, VB es lo suficientemente inteligente como para no necesitar '[Seleccionar]'. – Ryan

+0

@minitech No tengo idea de la sintaxis de VB. Traduje esta consulta automáticamente de C# :) – dasblinkenlight

+3

Sí, nadie quiere escribir VB más :) Las palabras clave en VB que siguen a '.' no necesitan escaparse con' [ ] 'es todo. Así que podrías hacerlo un poco más limpio con '.Select' en su lugar. – Ryan

4

Se puede usar un bucle For y Substring:

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 

Convertir la lista strings a una matriz (si realmente necesita uno) se puede utilizar strings.ToArray().


Además, se puede usar expresiones regulares y LINQ para una fantasía de una sola línea:

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

Me gusta su respuesta más que los otros chicos. Especialmente el one-liner parece muy eficiente. ¿Hay alguna cosa adicional que deba agregar o importar a mi programa para que funcione? Voy a probarlo y, si funciona, aceptaré tu respuesta –

+1

@MarkKramer: No, no debería haberlo. El one-liner necesita LINQ, que solo está disponible en .NET 3.5 y versiones superiores (VB 2008 o superior), pero el primero funciona en prácticamente todo. – Ryan

+0

¿LINQ es algo que el usuario necesita instalado en su computadora? O simplemente algo que necesito en el mío que viene con Visual Studio para compilar el código –

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

No estoy seguro de que esta sea una solución a la pregunta. ¿Dónde pasó la longitud de la porción? –

0

Para expandir la respuesta aceptada, esto dividirá una cadena en partes incluso si la cadena no es divisible por el divisor

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 
Cuestiones relacionadas