string - reales - Recortar todos los tipos de espacios en blanco, incluidas las pestañas
libro de android studio en español pdf (6)
En VB6, la función Trim () recorta espacios de la parte frontal y posterior de una cadena. Me pregunto si hay una función que recorte no solo los espacios, sino también todos los espacios en blanco (pestañas en este caso) fuera de cada extremo de una cadena.
Es una pena que no haya una función incorporada. Aquí está el que escribí. Lo hace el truco.
Function TrimAllWhitespace(ByVal str As String)
str = Trim(str)
Do Until Not Left(str, 1) = Chr(9)
str = Trim(Mid(str, 2, Len(str) - 1))
Loop
Do Until Not Right(str, 1) = Chr(9)
str = Trim(Left(str, Len(str) - 1))
Loop
TrimAllWhitespace = str
End Function
Qué tal si:
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenW" ( _
ByVal lpString As Long) As Long
Private Declare Function StrTrim Lib "shlwapi" Alias "StrTrimW" ( _
ByVal pszSource As Long, _
ByVal pszTrimChars As Long) As Long
Private Function TrimWS(ByVal Text As String) As String
''Unicode-safe.
Const WHITE_SPACE As String = " " & vbTab & vbCr & vbLf
If StrTrim(StrPtr(Text), StrPtr(WHITE_SPACE)) Then
TrimWS = Left$(Text, lstrlen(StrPtr(Text)))
Else
TrimWS = Text
End If
End Function
Es rápido, y aún más rápido si usa typelibs en lugar de Declare
para definir las llamadas API.
Deberá combinar la función Trim
con la función Replace
:
s = " ABC " & vbTab & " "
MsgBox Len(s)
MsgBox Len(Trim$(s))
s = Replace$(Trim$(s), vbTab, "")
MsgBox Len(s)
Nota: El código anterior también eliminará las pestañas incrustadas. Probablemente pueda resolver esto con expresiones regulares, pero esta es una forma de recortar espacios / pestañas solo desde los extremos mediante bucle:
Dim s As String, char As String, trimmedString As String
Dim x As Integer
s = " " & vbTab & " ABC " & vbTab & "a " & vbTab
''// Trim all spaces/tabs from the beginning
For x = 1 To Len(s)
char = Mid$(s, x, 1)
If char = vbTab Or char = " " Then
Else
trimmedString = Mid$(s, x)
Exit For
End If
Next
''// Now do it from the end
For x = Len(trimmedString) To 1 Step -1
char = Mid$(trimmedString, x, 1)
If char = vbTab Or char = " " Then
Else
trimmedString = Left$(trimmedString, x)
Exit For
End If
Next
Deberías terminar con ABC{space}{space}{tab}a
Esto también podría ser útil, una continuación de @MathewHagemann Elimina líneas de vacío antes y después
Public Function TrimAllWhitespace(ByVal str As String)
str = Trim(str)
Do Until Not Left(str, 1) = Chr(9)
str = Trim(Mid(str, 2, Len(str) - 1))
Loop
Do Until Not Right(str, 1) = Chr(9)
str = Trim(Left(str, Len(str) - 1))
Loop
Do Until Not Left(str, 1) = Chr(13)
str = Trim(Mid(str, 2, Len(str) - 1))
Loop
Do Until Not Left(str, 1) = Chr(10)
str = Trim(Mid(str, 2, Len(str) - 1))
Loop
Do Until Not Right(str, 1) = Chr(10)
str = Trim(Left(str, Len(str) - 1))
Loop
Do Until Not Right(str, 1) = Chr(13)
str = Trim(Left(str, Len(str) - 1))
Loop
TrimAllWhitespace = str
End Function
Aquí hay algo que se me ocurrió que le permite elegir entre devolver la cuerda recortada en sí o la longitud de la cuerda recortada
en un módulo
''=========================================================
''this function lets get either the len of a string with spaces and tabs trimmed of
''or get the string itself with the spaces and tabs trimmed off
''=========================================================
Public Property Get eLen(sStr As String, Optional bTrimTabs As Boolean = True, Optional bReturnLen As Boolean = True) As Variant
''function which trims away spaces and tabs (if [bTrimTabs] is set to True)
Dim s As String: s = sfuncTrimEnds(sStr, bTrimTabs)
If bReturnLen Then '' if [bReturnLen] = True then return the trimmed string len
eLen = Len(s)
Else '' if [bReturnLen] = False then return the trimmed string
eLen = s
End If
End Property
''===============================================================
'' this function trims spaces from both sides of string and tabs if [bTrimTabs] = true
'' the return value is the string with the spaces (and tabs) trimmed off both sides
''===============================================================
Private Function sfuncTrimEnds(ByVal sStr As String, Optional bTrimTabs As Boolean = True) As String
Dim lStart As Long, lEnd As Long
Dim sChr As String
Dim llen As Long: llen = Len(sStr)
Dim l As Long: For l = 1 To llen
sChr = Mid$(sStr, l, 1)
If sChr <> " " And sChr <> vbTab Then
lStart = l
Exit For
End If
Next l
For l = llen To 1 Step -1
sChr = Mid$(sStr, l, 1)
If sChr <> " " And sChr <> vbTab Then
lEnd = l
Exit For
End If
Next l
sStr = Mid$(sStr, lStart, (lEnd - (lStart - 1)))
sfuncTrimEnds = sStr
End Function
Para usar esto:
Dim s As String: s = " " & vbTab & " " & "mary wants my little lamb " & " " & vbTab & " "
MsgBox Tru.eLen(s, , False) ''will return the trimmed text
MsgBox Tru.eLen(s) '' will return the len of the trimmed text
O
Dim sVal As String: sVal = Tru.eLen(s, , False)
if len(sval) > 0 then '' yada yada
Para vb.net (muy similar) para eliminar todos los espacios en blanco y controlar los caracteres del frente:
Public Function TrimWspFromFront(ByRef MyStr As String) As String
While MyStr.Length > 0 AndAlso Left(MyStr, 1) < " "
MyStr = Trim(Right(MyStr, MyStr.Length - 1))
End While
Return MyStr
End Function
Para quitar de la parte trasera:
Public Function TrimWspFromEnd(ByRef MyStr As String) As String
While MyStr.Length > 0 AndAlso Right(MyStr, 1) < " "
MyStr = Trim(Left(MyStr, MyStr.Length - 1))
End While
Return MyStr
End Function
NÓTESE BIEN. Pasó como ByRef para evitar la sobrecarga de hacer una copia, otros pueden preferir codificar como Sub o pasar ByVal