Agregar un término a una cadena cada enésimo carácter
Mientras trabajaba en mi último proyecto favorito:
Continuar leyendo
Necesitaba «maquillar» algunas firmas en un formato más común. Es decir, necesitaba insertar un espacio cada 2 caracteres para que coincidiera con el formato que ya estaba usando.
Mi objetivo original era muy simple, tenía cadenas como:
53514C69746520666F726D6174203300
y yo quería
53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00
Entonces, simplemente quería insertar un espacio después de cada segundo carácter en la cadena.
Agregar un espacio cada 2 caracteres
Así que rápidamente preparé una función para recorrer la cadena y listo, tenía lo que necesitaba.
'--------------------------------------------------------------------------------------- ' Procedure : AddSpaceEveryTwoChars ' Author : Daniel Pineault, CARDA Consultants Inc. ' Website : ' Purpose : Insert a space every 2 characters in a string ' Copyright : The following is release as Attribution-ShareAlike 4.0 International ' (CC BY-SA 4.0) - ' Req'd Refs: None required ' ' Input Variables: ' ~~~~~~~~~~~~~~~~ ' sInput : String to insert the spaces into ' ' Usage: ' ~~~~~~ ' AddSpaceEveryTwoChars("ECA5C100") ' Returns -> EC A5 C1 00 ' ' Revision History: ' Rev Date(yyyy-mm-dd) Description ' ************************************************************************************** ' 1 2024-11-27 Initial Release '--------------------------------------------------------------------------------------- Function AddSpaceEveryTwoChars(ByVal sInput As String) As String Dim sOutput As String Dim lCounter As Long On Error GoTo Error_Handler For lCounter = 1 To Len(sInput) Step 2 sOutput = sOutput & Mid(sInput, lCounter, 2) & " " Next lCounter AddSpaceEveryTwoChars = Trim(sOutput) Error_Handler_Exit: On Error Resume Next Exit Function Error_Handler: MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _ "Error Source: AddSpaceEveryTwoChars" & vbCrLf & _ "Error Number: " & Err.Number & vbCrLf & _ "Error Description: " & Err.Description & _ Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _ , vbOKOnly + vbCritical, "An Error has Occurred!" Resume Error_Handler_Exit End Function
Agregar un término cada enésimo lugar
Eso me hizo pensar en hacer más flexible la función anterior. ¿Qué pasa si quisiera insertar algo más que un espacio? ¿Qué pasa si quisiera que el espaciado fuera distinto de cada segundo carácter? Y así, desarrollé:
'--------------------------------------------------------------------------------------- ' Procedure : AddTermEveryNChars ' Author : Daniel Pineault, CARDA Consultants Inc. ' Website : ' Purpose : Insert a 'term' every Nth character within the supplied string ' Copyright : The following is release as Attribution-ShareAlike 4.0 International ' (CC BY-SA 4.0) - ' Req'd Refs: None required ' ' Input Variables: ' ~~~~~~~~~~~~~~~~ ' sInput : String to insert the term into ' sInsertionTerm: Term to be added ' lStepSize : Size of the term step, so every how many characters should the ' insertion term be added ' ' Usage: ' ~~~~~~ ' ? AddTermEveryNChars("ECA5C100") ' Returns -> EC A5 C1 00 ' ' ? AddTermEveryNChars("ECA5C100", "~", 3) ' Returns -> ECA~5C1~00 ' ' Revision History: ' Rev Date(yyyy-mm-dd) Description ' ************************************************************************************** ' 1 2024-11-27 Initial Release '--------------------------------------------------------------------------------------- Function AddTermEveryNChars(ByVal sInput As String, _ Optional sInsertionTerm As String = " ", _ Optional lStepSize As Long = 2) As String Dim iIteration As Long Dim lCounter As Long Dim sOutput As String Dim lInputLength As Long Dim lNoIterations As Long On Error GoTo Error_Handler lInputLength = Len(sInput) lNoIterations = Int(lInputLength / lStepSize) + IIf((lInputLength / lStepSize) > Int(lInputLength / lStepSize), 1, 0) For lCounter = 1 To lInputLength Step lStepSize iIteration = iIteration + 1 sOutput = sOutput & Mid(sInput, lCounter, lStepSize) If iIteration < lNoIterations Then sOutput = sOutput & sInsertionTerm Next lCounter AddTermEveryNChars = sOutput Error_Handler_Exit: On Error Resume Next Exit Function Error_Handler: MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _ "Error Source: AddTermEveryNChars" & vbCrLf & _ "Error Number: " & Err.Number & vbCrLf & _ "Error Description: " & Err.Description & _ Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _ , vbOKOnly + vbCritical, "An Error has Occurred!" Resume Error_Handler_Exit End Function
He predeterminado los argumentos de entrada opcionales para que se comporte como la función original (es decir, un espacio cada segundo carácter), pero este es más flexible en caso de que surja la necesidad de desviarse e insertar el término que desee con el espaciado que elija.