byCoder
byCoder

Reputation: 9184

Ruby capitalize every word first letter

I need to make the first character of every word uppercase, and make the rest lowercase...

manufacturer.MFA_BRAND.first.upcase

is only setting the first letter uppercase, but I need this:

ALFA ROMEO => Alfa Romeo
AUDI => Audi
BMW => Bmw
ONETWO THREE FOUR => Onetwo Three Four

Upvotes: 195

Views: 131048

Answers (8)

sesquipedalian-dev
sesquipedalian-dev

Reputation: 11

I used this for a similar problem:

'catherine mc-nulty joséphina'.capitalize.gsub(/(\s+\w)/) { |stuff| stuff.upcase }

This handles the following weird cases I saw trying the previous answers:

  • non-word characters like -
  • accented characters common in names like é
  • capital characters in the middle of the string

Upvotes: 1

boulder_ruby
boulder_ruby

Reputation: 39763

In Rails:

"kirk douglas".titleize => "Kirk Douglas"
#this also works for 'kirk_douglas'

w/o Rails:

"kirk douglas".split(/ |\_/).map(&:capitalize).join(" ")

#OBJECT IT OUT
def titleize(str)
  str.split(/ |\_/).map(&:capitalize).join(" ")
end

#OR MONKEY PATCH IT
class String  
  def titleize
    self.split(/ |\_/).map(&:capitalize).join(" ")
  end
end

w/o Rails (load rails's ActiveSupport to patch #titleize method to String)

require 'active_support/core_ext'
"kirk douglas".titleize #=> "Kirk Douglas"

(some) string use cases handled by #titleize

  • "kirk douglas"
  • "kirk_douglas"
  • "kirk-douglas"
  • "kirkDouglas"
  • "KirkDouglas"

#titleize gotchas

Rails's titleize will convert things like dashes and underscores into spaces and can produce other unexpected results, especially with case-sensitive situations as pointed out by @JamesMcMahon:

"hEy lOok".titleize #=> "H Ey Lo Ok"

because it is meant to handle camel-cased code like:

"kirkDouglas".titleize #=> "Kirk Douglas"

To deal with this edge case you could clean your string with #downcase first before running #titleize. Of course if you do that you will wipe out any camelCased word separations:

"kirkDouglas".downcase.titleize #=> "Kirkdouglas"

Upvotes: 349

astee
astee

Reputation: 23

If you are trying to capitalize the first letter of each word in an array you can simply put this:

array_name.map(&:capitalize)

Upvotes: 1

tint lwin lwin win
tint lwin lwin win

Reputation: 405

"hello world".titleize which should output "Hello World".

Upvotes: 38

Bob Nadler
Bob Nadler

Reputation: 1287

Another option is to use a regex and gsub, which takes a block:

'one TWO three foUR'.gsub(/\w+/, &:capitalize)

Upvotes: 27

user904990
user904990

Reputation:

try this:

puts 'one TWO three foUR'.split.map(&:capitalize).join(' ')

#=> One Two Three Four

or

puts 'one TWO three foUR'.split.map(&:capitalize)*' '

Upvotes: 232

Muhamamd Awais
Muhamamd Awais

Reputation: 2385

"hello world".split.each{|i| i.capitalize!}.join(' ')

Upvotes: 5

Look into the String#capitalize method.

http://www.ruby-doc.org/core-1.9.3/String.html#method-i-capitalize

Upvotes: 5

Related Questions