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
byCoder
fonte

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)*' '

fonte
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"
boulder_ruby
fonte
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".

matiz lwin vitória lwin
fonte
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)
Bob Nadler
fonte
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(' ')
Muhamamd Awais
fonte
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)

astee
fonte
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
sesquipedalian-dev
fonte