Ruby capitaliza cada palabra primera letra

162

Necesito poner el primer carácter de cada palabra en mayúscula, y poner el resto en minúscula ...

manufacturer.MFA_BRAND.first.upcase

solo establece la primera letra en mayúscula, pero necesito esto:

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

Respuestas:

217

prueba esto:

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

#=> One Two Three Four

o

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

fuente
77
splitse dividirá en el espacio de forma predeterminada, por lo que puede hacerlo aún más corto:'one TWO three foUR'.split.map(&:capitalize).join(' ')
Mischa
@waltee ¿Podría explicar el .map(&:capitalize)o al menos señalar en qué parte del documento lo encontró? No puedo encontrar ninguna referencia a eso. Además, ¿cuál es el trato con *' 'el final del segundo fragmento de código?
macsplean
66
@macsplean la &:methodsintaxis mapes una forma concisa de llamar a un método en cada elemento de la matriz . Luego puede llamar joinpara convertir esa matriz en una cadena. El * ' 'es una forma alternativa de llamar a unirse . Puede pensar que multiplica los elementos de la matriz para crear una cadena.
Andrew
283

En rieles:

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

sin rieles:

"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

sin Rails (cargue ActiveSupport de rails para parchear el método #titleize String)

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

(algunos) casos de uso de cadenas manejados por #titleize

  • "Kirk Douglas"
  • "kirk_douglas"
  • "Kirk-Douglas"
  • "kirkDouglas"
  • "KirkDouglas"

#titleize gotchas

Rails titleizeconvertirá cosas como guiones y guiones bajos en espacios y puede producir otros resultados inesperados, especialmente con situaciones sensibles a mayúsculas y minúsculas como lo señala @JamesMcMahon:

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

porque está destinado a manejar código en camello como:

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

Para lidiar con este caso límite, #downcaseprimero puede limpiar su cadena antes de ejecutar #titleize. Por supuesto, si haces eso, eliminarás cualquier separación de palabras en camello:

"kirkDouglas".downcase.titleize #=> "Kirkdouglas"
boulder_ruby
fuente
También hay una gema titulada que funciona muy bien.
zhon 01 de
66
Titleize no es tan simple como parece, por ejemplo, 'hEy LoOK' se convierte en 'H Ey Lo Ok'
James McMahon el
8
ENORME GOTCHA, titleize eliminará ciertos caracteres por completo, como el guión (-). "who? - me" .titleize => "Who? Me"
pixelearth 18/0614
@pixelearth para mí está convirtiendo todos los guiones en espacios individuales.
boulder_ruby
37

"hello world".titleize que debería mostrar "Hola mundo".

tinte lwin lwin gana
fuente
Esta salida "One Two Three Fo Ur"es diferente a la salida deseada en este caso, pero puede ser deseada en otros.
Rick Smith
3
Este no es un método Ruby; es un método ActiveSupport (Rails) introducido en v2.2.1
Zack Burt
20

Otra opción es usar una expresión regular y gsub, que toma un bloque:

'one TWO three foUR'.gsub(/\w+/, &:capitalize)
Bob Nadler
fuente
Este conserva guiones entre palabras, etc.
Beer Me
3
.gsub(/\b\w/, &:capitalize)conserva las mayúsculas previstas en palabras, por ejemplo, "Jane mcCollins"
usuario3680688
3
"hello world".split.each{|i| i.capitalize!}.join(' ')
Muhamamd Awais
fuente
1
no hay razón para usar un operador de explosión (!) si no está trabajando con una variable
boulder_ruby
2
@boulder_ruby No es cierto que "no hay razón para usar un operador de explosión si no está trabajando con una variable". El valor de retorno de cada iteración del eachbloque se descarta. El !está modificando las cadenas producidas por splitin-place. Sin el !, capitalizeestaría creando una nueva cadena en mayúscula por iteración, y luego la descartaría de inmediato. El resultado final sería "hello world"el mismo que la cadena original. Con el !, cada cadena en la splitmatriz 'd se está cambiando y, por lo tanto, el resultado eaches una matriz de cadenas en mayúscula.
user513951
1
Sí, se supone que debes usar map. Interesante truco sin embargo. Puntos
boulder_ruby
1

Si está tratando de poner en mayúscula la primera letra de cada palabra en una matriz, simplemente puede poner esto:

array_name.map (&: capitalize)

astee
fuente
0

Usé esto para un problema similar:

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

Esto maneja los siguientes casos extraños que vi probando las respuestas anteriores:

  • caracteres sin palabras como -
  • caracteres acentuados comunes en nombres como é
  • caracteres en mayúscula en el medio de la cadena
sesquipedalian-dev
fuente