John Topley's Knowledgebase

Correctly Capitalise Names

Friday, 30 May 2003

This Visual Basic code will correctly capitalise most English names and handles some common exception cases. For example, mcdonald becomes McDonald and d'arcy becomes D'Arcy.

Download 0004.txt

Private Function Capitalise(ByVal vStrText As String) As String
  Dim intPos As Integer
  Dim strCapitalised As String
    
  strCapitalised = vStrText
    
  ' Check for a passed null or empty string.
  If (IsNull(strCapitalised)) Or (LenB(strCapitalised) = 0) Then
    strCapitalised = vbNullString
       
  ' A valid string was passed.
  Else
    
    ' Simple case e.g. Smith.
    strCapitalised = UCase$(Left$(strCapitalised, 1)) & LCase$(Right$(strCapitalised, Len(strCapitalised) - 1))
        
    ' Apostrophe case e.g. D'Arc.
    intPos = InStr(1, strCapitalised, "'")
        
    If intPos > 0 Then
      strCapitalised = UCase$(Left$(strCapitalised, 1)) & LCase$(Mid$(strCapitalised, 2, (intPos - 2))) & "" & UCase$(Mid$(strCapitalised, intPos + 1, 1)) & LCase$(Right$(strCapitalised, Len(strCapitalised) - (intPos + 1)))
    End If
        
    ' McDonald case.
    intPos = InStr(1, LCase$(strCapitalised), "mc")
        
    If intPos > 0 Then
      strCapitalised = UCase$(Left$(strCapitalised, 1)) & LCase$(Mid$(strCapitalised, 2, 1)) & UCase$(Mid$(strCapitalised, 3, 1)) & LCase$(Right$(strCapitalised, Len(strCapitalised) - 3))
    End If
        
    ' MacDonald case.
    intPos = InStr(1, LCase$(strCapitalised), "mac")
        
    If intPos > 0 Then
      strCapitalised = UCase$(Left$(strCapitalised, 1)) & LCase$(Mid$(strCapitalised, 2, 2)) & UCase$(Mid$(strCapitalised, 4, 1)) & LCase$(Right$(strCapitalised, Len(strCapitalised) - 4))
    End If
        
    ' Space case e.g. John Smith.
    intPos = InStr(1, strCapitalised, " ")
        
    If intPos > 0 Then
      strCapitalised = SplitText(strCapitalised, " ")
    End If
        
    ' Hyphen case e.g. John Double-Barrelled.
    intPos = InStr(1, strCapitalised, "-")
        
    If intPos > 0 Then
      strCapitalised = SplitText(strCapitalised, "-")
    End If
  End If
       
  ' Assign the function result.
  Capitalise = strCapitalised
End Function

Private Function SplitText(ByVal vStrText As String, ByVal vStrDelimiter As String) As String
  Dim intIndex As Integer
  Dim intLowerBound As Integer
  Dim intUpperBound As Integer
  Dim strTextArray() As String
    
  SplitText = vbNullString
    
  ' Split the passed text into an array,
  ' delimited by the passed delimiter.
  strTextArray = Split(vStrText, vStrDelimiter)
    
  If Not IsEmpty(strTextArray) Then
    intLowerBound = LBound(strTextArray)
    intUpperBound = UBound(strTextArray)
      
    ' Iterate through the array, capitalising
    ' the substrings in each element.
    For intIndex = intLowerBound To intUpperBound
      strTextArray(intIndex) = Capitalise(strTextArray(intIndex))
    Next
          
    ' Join the substrings together again,
    ' delimit using the passed delimiter
    ' and assign to the function result.
    SplitText = Join(strTextArray, vStrDelimiter)
  End If
End Function

top | index | previous | no next | comments ()

home | archive | kb | media | about | contact | accessibility
Copyright © 2003 - 2005 John Topley. Made with CityDesk.