Ruby mette in maiuscolo ogni parola prima lettera


162

Devo rendere il primo carattere di ogni parola maiuscolo e rendere il resto in minuscolo ...

manufacturer.MFA_BRAND.first.upcase

sta solo impostando la prima lettera maiuscola, ma ho bisogno di questo:

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

Risposte:


217

prova questo:

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

#=> One Two Three Four

o

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

7
splitsi dividerà sullo spazio per impostazione predefinita, quindi puoi renderlo ancora più breve:'one TWO three foUR'.split.map(&:capitalize).join(' ')
Mischa

@waltee Potresti forse spiegare .map(&:capitalize)o almeno indicare dove nel documento l'hai trovato? Non riesco a trovare alcun riferimento a questo. Inoltre, qual è l'accordo *' 'alla fine del secondo frammento di codice?
macsplean,

6
@macsplean la &:methodsintassi in mapè un modo conciso per chiamare un metodo su ciascun elemento dell'array . È quindi possibile chiamare joinper trasformare quell'array in una stringa. Il * ' 'è un modo alternativo per chiamare unirsi . Puoi pensarlo come moltiplicare gli elementi nell'array per creare una stringa.
Andrew,

283

In Rotaie:

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

senza binari:

"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

senza Rails (carica l'ActiveSupport di rails nella patch #titleize method in String)

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

(alcuni) casi d'uso delle stringhe gestiti da #titleize

  • "kirk douglas"
  • "kirk_douglas"
  • "Kirk-Douglas"
  • "Kirk Douglas"
  • "Kirk Douglas"

#titleize gotchas

Rails titleizeconverte cose come trattini e trattini bassi in spazi e può produrre altri risultati inaspettati, in particolare con situazioni sensibili al maiuscolo / minuscolo, come sottolineato da @JamesMcMahon:

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

perché ha lo scopo di gestire il codice in cammello come:

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

Per gestire questo caso limite, puoi pulire la stringa con #downcaseprima di eseguire #titleize. Naturalmente se lo fai spazzerai via le separazioni delle parole di CamelCased:

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

V'è anche un gioiello titleize che funziona bene.
zhon,

6
Titleize non è così semplice come sembra, ad esempio "hEy LoOK" diventa "H Ey Lo Ok"
James McMahon,

8
ENORME GOTCHA, titleize rimuoverà completamente alcuni caratteri, come il trattino (-). "who? - me" .titleize => "Who? Me"
pixelearth

@pixelearth per me sta convertendo tutti i trattini in singoli spazi.
boulder_ruby,

37

"hello world".titleize che dovrebbe generare "Hello World".


Questo output "One Two Three Fo Ur"è diverso dall'output desiderato in questo caso, ma può essere desiderato in altri.
Rick Smith,

3
Questo non è un metodo Ruby; è un metodo ActiveSupport (Rails) introdotto nella v2.2.1
Zack Burt il

20

Un'altra opzione è usare un regex e gsub, che richiede un blocco:

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

Questo conserva trattini inter-word ecc.
Beer Me,

3
.gsub(/\b\w/, &:capitalize)preserva le parole in lettere maiuscole, ad es. "Jane mcCollins"
user3680688


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

1
non c'è motivo di usare un operatore bang (!) se non si lavora con una variabile
boulder_ruby

2
@boulder_ruby Non è vero che "non c'è motivo di usare un operatore bang se non si lavora con una variabile". Il valore restituito di ogni iterazione del eachblocco viene scartato. Il !sta modificando le stringhe prodotte da splitsul posto. Senza il !, capitalizesarebbe creare una nuova stringa in maiuscolo per iterazione e quindi scartarla immediatamente. Il risultato finale sarebbe "hello world", esattamente come la stringa originale. Con !, ogni stringa splitnell'array 'd viene modificata, e quindi il risultato di eachè una matrice di stringhe maiuscole.
user513951

1
Sì, dovresti solo usare map. Hack interessante però. Punti
boulder_ruby,

1

Se stai cercando di scrivere in maiuscolo la prima lettera di ogni parola in un array, puoi semplicemente inserire questo:

array_name.map (&: capitalizzare)


0

L'ho usato per un problema simile:

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

Questo gestisce i seguenti casi strani che ho visto provare le risposte precedenti:

  • caratteri non di parole come -
  • personaggi accentati comuni in nomi come é
  • caratteri maiuscoli nel mezzo della stringa
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.