Ruby coloca em maiúscula todas as primeiras palavras


162

Preciso fazer o primeiro caractere de cada palavra em maiúsculas e o restante em minúsculas ...

manufacturer.MFA_BRAND.first.upcase

está definindo apenas a primeira letra maiúscula, mas preciso disso:

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

Respostas:


217

tente isto:

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

#=> One Two Three Four

ou

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

7
splitirá dividir em espaço por padrão, para que você possa torná-lo ainda mais curto:'one TWO three foUR'.split.map(&:capitalize).join(' ')
Mischa

@waltee Você poderia explicar o .map(&:capitalize)ou pelo menos apontar para onde, no documento, você o encontrou? Não consigo encontrar nenhuma referência a isso. Além disso, qual é o problema *' 'no final do segundo trecho de código?
macsplean

6
@ macsplean a &:methodsintaxe mapé uma maneira concisa de chamar um método para cada item da matriz . Você pode ligar joinpara transformar essa matriz em uma string. O * ' 'é uma forma alternativa para chamar juntar . Você pode pensar nisso como multiplicar os itens da matriz para criar uma sequência.
Andrew

283

No Rails:

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

sem trilhos:

"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

sem Rails (carregue o ActiveSupport do Rails para corrigir o método #titleize String)

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

(alguns) casos de uso de string tratados por #titleize

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

#titleize dicas

O Rails titleizeconverterá coisas como traços e sublinhados em espaços e poderá produzir outros resultados inesperados, especialmente em situações que diferenciam maiúsculas de minúsculas, como apontado por @JamesMcMahon:

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

porque se destina a lidar com código de camelo, como:

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

Para lidar com esse caso de borda, limpe sua string #downcaseantes de executar #titleize. Obviamente, se você fizer isso, eliminará todas as separações de palavras com cameloCased:

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

Há também é uma jóia titleize que funciona muito bem.
Zhon #

6
Titleize não é tão simples quanto parece, por exemplo, 'hey LoOK' se torna 'H Ey Lo Ok'
James McMahon

8
ENORME GOTCHA, o título removerá completamente certos caracteres, como o traço (-). "quem? - eu" .titleize => "Quem? Eu"
pixelearth 18/06/14

@pixelearth para mim é converter todos os traços em espaços individuais.
boulder_ruby

37

"hello world".titleize que deve exibir "Hello World".


Esta saída "One Two Three Fo Ur"é diferente da saída desejada neste caso, mas pode ser desejada em outros.
Rick Smith

3
Este não é um método Ruby; é um método ActiveSupport (Rails) introduzido na v2.2.1
Zack Burt

20

Outra opção é usar um regex e gsub, que aceita um bloco:

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

Este preserva traços entre palavras etc.
Beer Me

3
.gsub(/\b\w/, &:capitalize)conservas destina capitalização dentro das palavras, por exemplo, "Jane mcCollins"
user3680688


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

1
não há nenhuma razão para usar um estrondo operador, se você não está trabalhando com uma variável (!)
boulder_ruby

2
@boulder_ruby Não é verdade que "não há razão para usar um operador bang se você não estiver trabalhando com uma variável". O valor de retorno de cada iteração do eachbloco está sendo descartado. O !está modificando as seqüências produzidas pelo splitlocal. Sem o !, capitalizeseria criar uma nova cadeia de caracteres em maiúsculas por iteração e descartá-la imediatamente. O resultado final seria "hello world"exatamente o mesmo que a string original. Com o !, cada cadeia de caracteres na splitmatriz 'd está sendo alterada e, portanto, o resultado de eaché uma matriz de cadeias de caracteres maiúsculas.
user513951

1
Sim, você deveria usar map. Corte interessante embora. Pontos
boulder_ruby

1

Se você estiver tentando colocar em maiúscula a primeira letra de cada palavra em uma matriz, basta colocar o seguinte:

array_name.map (&: capitalizar)


0

Eu usei isso para um problema semelhante:

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

Isso lida com os seguintes casos estranhos que vi tentando as respostas anteriores:

  • caracteres que não sejam palavras, como -
  • caracteres acentuados comuns em nomes como é
  • caracteres maiúsculos no meio da string
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.