Here is another solution. It's not so pretty, but it deals with acronyms that you want to remain all caps and contractions that you Don'T want to be mangled like my previous use of the contraction don't. Beyond that, it ensures that your first and last word is capitalized.
class String
def titlecase
lowerCaseWords = ["a", "aboard", "about", "above", "across", "after", "against", "along", "amid", "among", "an", "and", "around", "as", "at", "before", "behind", "below", "beneath", "beside", "besides", "between", "beyond", "but", "by", "concerning", "considering", "d", "despite", "down", "during", "em", "except", "excepting", "excluding", "following", "for", "from", "in", "inside", "into", "it", "ll", "m", "minus", "near", "nor", "of", "off", "on", "onto", "opposite", "or", "outside", "over", "past", "per", "plus", "re", "regarding", "round", "s", "save", "since", "t", "than", "the", "through", "to", "toward", "towards", "under", "underneath", "unlike", "until", "up", "upon", "ve", "versus", "via", "with", "within", "without", "yet"]
titleWords = self.gsub( /\w+/ )
titleWords.each_with_index do | titleWord, i |
if i != 0 && i != titleWords.count - 1 && lowerCaseWords.include?( titleWord.downcase )
titleWord
else
titleWord[ 0 ].upcase + titleWord[ 1, titleWord.length - 1 ]
end
end
end
end
Here are some examples of how to use it
puts 'barack obama'.titlecase # => Barack Obama
puts 'the catcher in the rye'.titlecase # => The Catcher in the Rye
puts 'NASA would like to send a person to mars'.titlecase # => NASA Would Like to Send a Person to Mars
puts 'Wayne Gretzky said, "You miss 100% of the shots you don\'t take"'.titlecase # => Wayne Gretzky Said, "You Miss 100% of the Shots You Don't Take"