Spanish Hacer Left, Right, Mid y Split de Visual Basic en B4A (casi tutorial ;-) )

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola a todos:

Despues de leer que a muchos que venimos de Visual Basic echamos a faltar algunos tratamientos de cadenas como son los tipicos Left, Right, Mid y Split, quiero compartir con vosotros una forma facil de hacerlo.
Si lo poneis en un modulo y las haceis publicas lo podreis llamar desde cualquier sitio.

B4X:
Sub Left(Text As String, Length As Int)As String
    If Length>Text.Length Then Length=Text.Length
    Return Text.SubString2(0, Length)
End Sub

Sub Right(Text As String, Length As Int) As String
    If Length>Text.Length Then Length=Text.Length
    Return Text.SubString(Text.Length-Length)
End Sub

Sub Mid(Text As String, Start As Int, Length As Int) As String
    Return Text.SubString2(Start-1,Start+Length-1)
End Sub

Sub Split(Text As String, Delimiter As String) As String()
    Return Regex.Split(delimter,Text)
End Sub

Espero haber ayudado

Saludos:
 

bgsoft

Well-Known Member
Licensed User
Longtime User
No entiendo muy bien a que viene tu pregunta.

Pero entiendo que hay gente que le resulta mas facil entender como manejaban las cadenas en Visual Basic que como se manejan en B4A, y de ahi a hacer este aporte.
Solo pretendo facilitar la programación a los que entran en el mundo de B4A, no dominan el ingles (como yo) y como no existen tutoriales en castellano con ejemplos claros de como hacer cosas tan simples como Left, Right, etc, y despues de ver que hay gente que está interesada en esto, pues un Español con ganas de ayudar y compartir hace ese aporte.

Saludos
 

Zabatta

Member
Licensed User
Chicos disculpen, yo no he podido descomponer un texto en string según sus caracteres. Ni usando las funciones que indica bgsoft ni la librería que indica klaus, podrían ayudarme por favor?
 

Zabatta

Member
Licensed User
Creo que ya pude, realmente lo que quería era solo poder descomponer un string en sus caracteres, para luego reconstruir otro string pero asignándole un formato, esto con el propósito se que cuando el usuario ingrese un número de teléfono en un edittext por ejemplo:

edt1.text = "123456789" al cambiar el focus, el texto no se vea 123456789 si no que se vea +56 1 2345 6789,

también me sirve para eliminar símbolos por ejemplo

edt1.text =" +56 123456789" lo convertiría a +56 1 2345 6789

no se si pueda lograr eso, pero ya por lo menos pude descomponer un string en sus caracteres, lo cual es el primer paso. Lo hice de esta manera. Quizás no sea la mejor manera, la verdad es que no se mucho de programación, pero trato de aprender lo mas que pueda.

B4X:
Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
    Dim text As String
    Dim text2 As StringBuilder
    Dim sf As StringFunctions
    Dim t As Char
   
    Private Bt As Button
    Private edt1 As EditText
    Private lbl As Label
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    Activity.LoadLayout("xx")
    'MsgboxAsync("Welcome to B4A!", "")
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub Bt_Click
    Dim n As Int
    n=1
    sf.Initialize
    text2.Initialize
   
    text=edt1.text

    For i=0 To text.Length
        t=sf.mid(text, n,1)
        Log(t)
        text2.Append(t)
        n=n+1
    Next
    Log(text2)
End Sub

uso la librería StringFunctions, no se de que otra manera se podría hacer. Gracias
 

klaus

Expert
Licensed User
Longtime User
Everything in the in the String Functions library can be done with B4X standard functions, but a bit different.
Examples:
t = sf.mid(text, n,1) > t = text.CharAt(n) or t = text.Substring2(n, n +1)

Your task is not that easy, because you need to define the different possibilities you may expect and then decompose depending on these possibilities.
Examples:
- check the + sign
- check the number of characters
etc.
 

Zabatta

Member
Licensed User
Muchísimas gracias klaus, creo que ya lo logre usando las instrucciones que me dijo, el edittext tendría que estar limitado solo a números y no a teléfonos, ya que este ultimo permite el ingreso de símbolos, a continuación dejo el programa. Se puede crear una lista de selección como un listView o un spinner (no se) donde el usuario seleccione el país, la cantidad de caracteres permitidos y el código de país, dependerán del país seleccionado. En el código siguiente use país como una variable con valor fijo "chile". sin embargo el numero telefónico tuve que mostrarlo por medio de un toast ya que creo que no se puede cambiar el contenido de texto de un edittext o al menos aun no se hacerlo, me sale error si coloco edt1.text=text2....


B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.

End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
    Dim text As String
    Dim text2 As StringBuilder
    Dim t As Char
   
    Private edt1 As EditText
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    Activity.LoadLayout("xx")
    'MsgboxAsync("Welcome to B4A!", "")
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub edt1_FocusChanged (HasFocus As Boolean)
    'Declaracion de variables
    Dim n As Int
    Dim pais As String
    'Inicializacion de variables
    text2.Initialize
    pais="chile"
    text=edt1.Text
    Log(text)
    n=0
   
    'logica de control
    For i=0 To text.Length-1
       
        t = text.substring2(n, n+1)
        Log("digito:" & t)
        Log("n:" & n)
        n=n+1
       
        If (pais="chile" And text.Length=9)Then
            If (text2.Length=0) Then
                text2.Append("+56 "& t)
            Else If(text2.Length=5) Then
                text2.Append(" "& t)
            Else If (text2.Length=10) Then
                text2.Append(" "& t)
            Else
                text2.Append(t)
            End If
'        Else If (pais="venezuela" And text.Length=10)then
'            If (text2.Length=0) Then
'                text2.Append("+58 "& t)
'            Else If(text2.Length=7) Then
'                text2.Append(" "& t)
'            Else If (text2.Length=11) Then
'                text2.Append(" "& t)
'            Else
'                text2.Append(t)
'            End If
        Else
            MsgboxAsync("El número de telefono parece incorrecto.", "Atención")
        End If
       
        Log(text2)
    Next
    'resultado
    ToastMessageShow(text2,True)
End Sub

Dejo el código por si alguien lo quiere probar, o le es útil y quiere mejorarlo.

Muchísimas gracias Klaus :D
 

Zabatta

Member
Licensed User
:D tienes razon klaus text2 debe convertirse a string porque es un stringbuilder.... muchisimas gracias :D
 

joaquinortiz

Active Member
Licensed User
Longtime User
Hola a todos:

Despues de leer que a muchos que venimos de Visual Basic echamos a faltar algunos tratamientos de cadenas como son los tipicos Left, Right, Mid y Split, quiero compartir con vosotros una forma facil de hacerlo.
Si lo poneis en un modulo y las haceis publicas lo podreis llamar desde cualquier sitio.

B4X:
Sub Left(Text As String, Length As Int)As String
    If Length>Text.Length Then Length=Text.Length
    Return Text.SubString2(0, Length)
End Sub

Sub Right(Text As String, Length As Int) As String
    If Length>Text.Length Then Length=Text.Length
    Return Text.SubString(Text.Length-Length)
End Sub

Sub Mid(Text As String, Start As Int, Length As Int) As String
    Return Text.SubString2(Start-1,Start+Length-1)
End Sub

Sub Split(Text As String, Delimiter As String) As String()
    Return Regex.Split(delimter,Text)
End Sub

Espero haber ayudado

Saludos:

Amigo
Hola a todos:

Despues de leer que a muchos que venimos de Visual Basic echamos a faltar algunos tratamientos de cadenas como son los tipicos Left, Right, Mid y Split, quiero compartir con vosotros una forma facil de hacerlo.
Si lo poneis en un modulo y las haceis publicas lo podreis llamar desde cualquier sitio.

B4X:
Sub Left(Text As String, Length As Int)As String
    If Length>Text.Length Then Length=Text.Length
    Return Text.SubString2(0, Length)
End Sub

Sub Right(Text As String, Length As Int) As String
    If Length>Text.Length Then Length=Text.Length
    Return Text.SubString(Text.Length-Length)
End Sub

Sub Mid(Text As String, Start As Int, Length As Int) As String
    Return Text.SubString2(Start-1,Start+Length-1)
End Sub

Sub Split(Text As String, Delimiter As String) As String()
    Return Regex.Split(delimter,Text)
End Sub

Espero haber ayudado

Saludos:

Muchas Gracias por compartir estas funcions. La verdad te doy toda la razon con respecto a simplificar funciones. Tengo 4 semanas empezando a desarrollar con este lenguaje y me doy cuenta que es necesario contar con la plataforma. Como es este caso, me la pase invirtiendo un par de horas buscando una funcion tan simple como el MID hasta que me tope con tu post.

Saludos!
 
Top