Gustav Brock
gustav at cactus.dk
Tue Apr 13 07:49:34 CDT 2004
Hi Chris > I have a requirement to strip a string of all non-alphanumeric characters. > In addition I wanted to change all upper-case characters to lower-case. I > could not find any ready-rolled solution so I've come up with the code > below. > Can anyone think of a more simple way of doing this? I don't think so. However, if you are about to handle large strings, the appending method will prove very slow. If this is the case, you could use Mid() as in the function below which trims a string for anything else than numerals - you will be able to cut it down and modify it for your purpose quite easily. /gustav <code> Function TrimNumString( _ ByVal strNumString As String, _ Optional ByVal strDecimalChr As String, _ Optional ByVal booAcceptMinus As Boolean) _ As String ' Removes any non-numeric character from strNumString including hexadecimal characters. ' If strDecimalChr is specified, first occurrence of this is not removed. ' If booAcceptMinus is True, a leading or trailing minus sign is accepted. ' ' 1999-08-27. Cactus Data ApS, CPH. ' 2001-06-21. Speed optimized for large string (64 K). ' 2003-12-10. intOffset changed to lngOffset. Const cbytNeg As Byte = 45 ' "-" Dim lngPos As Long Dim lngLen As Long Dim lngOffset As Long Dim booDec As Boolean Dim booNeg As Boolean Dim bytChr As Byte Dim bytDec As Byte Dim strNum As String strNumString = Trim(strNumString) lngLen = Len(strNumString) If lngLen > 0 Then If Len(strDecimalChr) > 0 Then bytDec = Asc(strDecimalChr) End If ' Create empty result string of maximum possible length. strNum = Space(lngLen) For lngPos = 1 To lngLen bytChr = Asc(Mid(strNumString, lngPos, 1)) Select Case bytChr Case 48 To 57 ' Digit. Case bytDec ' Decimal point. If booDec = False Then ' One decimal point only. booDec = True End If Case cbytNeg ' Minus sign. bytChr = 0 If booAcceptMinus = True And booNeg = False Then If Len(Trim(strNum)) = 0 Or lngPos = lngLen Then bytChr = cbytNeg ' One minus sign only. booNeg = True End If End If Case Else ' Ignore any other character. bytChr = 0 End Select If bytChr > 0 Then ' Append accepted character by inserting it in result string. lngOffset = lngOffset + 1 Mid(strNum, lngOffset) = Chr(bytChr) End If Next End If ' Trim and return result string. TrimNumString = Left(strNum, lngOffset) End Function </code>