Class for Proper casing of names.
MainSubName: NameToProperCase
Description: I was asked by a member to look at doing proper case for names a while back, this is what I came up with.
It uses a list of delimiters after which the next character in the returned string will be uppercase, and a list of excluded words, which will always be returned in lower case. I hope that we can make this work for all local name variants, so if there are some that you know of that need to be added, please post them here and we can try to get it to work for all of them.
Create a new class and copy and paste the code into it.
Updated: to cope with roman numerals see post#2
Tags: Proper Case Name Capitalization
MainSubName: NameToProperCase
Description: I was asked by a member to look at doing proper case for names a while back, this is what I came up with.
It uses a list of delimiters after which the next character in the returned string will be uppercase, and a list of excluded words, which will always be returned in lower case. I hope that we can make this work for all local name variants, so if there are some that you know of that need to be added, please post them here and we can try to get it to work for all of them.
Create a new class and copy and paste the code into it.
B4X:
'#####################################################################################
'
' PROPER Name Capitalization Class
'
' Stevel05 9 March 2014
' V 1.1 - Added Roman Numerals - 23/01/2016
'
'#####################################################################################
'Class module
Sub Class_Globals
Private Delimeters,Exclude As List
Private RomanRegexALL As String = "([ivxlcdm]*(?:th|rd|\b))*"
Private RomanRegexNUM As String = "[ivxlcdm]*"
End Sub
'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize
Delimeters.Initialize
Exclude.Initialize
'Always capitalize after one of these
Delimeters.AddAll(Array As String("'","Mc","-"))
'We want these words in the name to always appear in lower case.
Exclude.AddAll(Array As String("van","von","de"))
End Sub
Sub NameToProperCase(Name As String) As String
Dim Pos As Int
Dim Result As String
'Set the whole string to lowercase
Name = Name.ToLowerCase
'Make sure there is no more than one space between words.
Do While Name.Contains(" ")
Name = Name.Replace(" "," ")
Loop
'Process
'Break the name into words
Dim Words() As String = Regex.Split(" ",Name)
For i = 0 To Words.Length - 1
Dim Word As String = Words(i)
'Ignore excluded words
If Exclude.IndexOf(Word) > -1 Then Continue
For Each Delim As String In Delimeters
'Check for Roman Numerals
Dim M As Matcher
M = Regex.Matcher2(RomanRegexALL,Regex.CASE_INSENSITIVE,Word)
If M.Find And M.Match <> "" Then
'Capitalize just the Numerals
M = Regex.Matcher2(RomanRegexNUM,Regex.CASE_INSENSITIVE,Word)
If M.Find And M.Match <> "" Then
Dim W As String = M.Match.ToUpperCase
'Add the suffix
W = W & Word.SubString(W.Length).ToLowerCase
Word = W
Pos = Word.IndexOf(Delim)
If Pos > -1 Then
If Word.Length > Pos + Delim.Length Then
Word = Word.SubString2(0,Pos + Delim.Length) & Word.SubString2(Pos + Delim.Length,Pos + Delim.Length + 1).ToUpperCase & Word.SubString(Pos + Delim.Length + 1).ToLowerCase
End If
End If
End If
Else
'Capitalize the first letter of each word
If Word.Length = 1 Then
Word = Word.ToUpperCase
Else
'If the word is longer than 1 character, capitalize after each delimiter it contains
Word = Word.SubString2(0,1).ToUpperCase & Word.SubString(1)
Pos = Word.IndexOf(Delim)
If Pos > -1 Then
If Word.Length > Pos + Delim.Length Then
Word = Word.SubString2(0,Pos + Delim.Length) & Word.SubString2(Pos + Delim.Length,Pos + Delim.Length + 1).ToUpperCase & Word.SubString(Pos + Delim.Length + 1).ToLowerCase
End If
End If
End If
End If
Next
Words(i) = Word
Next
For i = 0 To Words.Length - 1
Result = Result & Words(i)
If i < Words.Length - 1 Then Result = Result & " "
Next
Return Result
End Sub
Updated: to cope with roman numerals see post#2
Tags: Proper Case Name Capitalization
Last edited: