Ruby zapisuje każde słowo wielką literą jako pierwszą literę

162

Muszę uczynić pierwszy znak każdego słowa wielką, a resztę małymi ...

manufacturer.MFA_BRAND.first.upcase

ustawia tylko pierwszą wielką literę, ale potrzebuję tego:

ALFA ROMEO => Alfa Romeo
AUDI => Audi
BMW => Bmw
ONETWO THREE FOUR => Onetwo Three Four
byCoder
źródło

Odpowiedzi:

217

Spróbuj tego:

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

#=> One Two Three Four

lub

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

źródło
7
splitdomyślnie podzieli się na przestrzeń, więc możesz ją skrócić:'one TWO three foUR'.split.map(&:capitalize).join(' ')
Mischa
@waltee Czy mógłbyś ewentualnie wyjaśnić .map(&:capitalize)lub przynajmniej wskazać, gdzie w dokumencie go znalazłeś? Nie mogę znaleźć żadnego odniesienia do tego. O co chodzi z tym *' 'na końcu drugiego fragmentu kodu?
macsplean
6
@macsplean &:methodskładnia w mapjest zwięzłym sposobem wywołania metody dla każdego elementu tablicy . Następnie możesz wywołać, joinaby przekształcić tę tablicę w ciąg. * ' 'Jest alternatywnym sposobem zadzwonić przyłączyć . Można o tym myśleć jako o pomnożeniu elementów tablicy w celu utworzenia ciągu.
Andrew,
283

W szynach:

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

bez szyn:

"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 (załaduj ActiveSupport railsów do poprawki metody #titleize String)

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

(niektóre) przypadki użycia ciągów obsługiwane przez #titleize

  • „kirk douglas”
  • „kirk_douglas”
  • „kirk-douglas”
  • „kirkDouglas”
  • „KirkDouglas”

#titleize gotchas

Railsy titleizezamieniają takie rzeczy jak myślniki i podkreślenia na spacje i mogą dawać inne nieoczekiwane rezultaty, szczególnie w sytuacjach z rozróżnianiem wielkości liter, jak wskazał @JamesMcMahon:

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

ponieważ jest przeznaczony do obsługi kodu w postaci wielbłąda, takiego jak:

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

Aby poradzić sobie z tym #downcaseskrajnym przypadkiem, możesz najpierw wyczyścić ciąg przed uruchomieniem #titleize. Oczywiście, jeśli to zrobisz, usuniesz wszelkie separacje słów wielbłąda:

"kirkDouglas".downcase.titleize #=> "Kirkdouglas"
boulder_ruby
źródło
Jest też tytułowanie klejnotu, które działa ładnie.
zhon
6
Titleize nie jest tak proste, jak się wydaje, na przykład „hey LoOK” zmienia się na „H Ey Lo OK”
James McMahon
8
OGROMNA GOTCHA, titleize całkowicie usunie niektóre znaki, takie jak myślnik (-). "who? - me" .titleize => "Who? Me"
pixelearth
@pixelearth dla mnie konwertuje wszystkie kreski na pojedyncze spacje.
boulder_ruby
37

"hello world".titleize co powinno wyświetlić „Hello World”.

tint lwin lwin win
źródło
To wyjście, "One Two Three Fo Ur"które jest inne niż pożądane wyjście w tym przypadku, ale może być pożądane w innych.
Rick Smith
3
To nie jest metoda Rubiego; jest to metoda ActiveSupport (Rails) wprowadzona w wersji 2.2.1
Zack Burt
20

Inną opcją jest użycie wyrażenia regularnego i gsub, które przyjmują blok:

'one TWO three foUR'.gsub(/\w+/, &:capitalize)
Bob Nadler
źródło
Ten zachowuje myślniki między wyrazami itp.
Beer Me
3
.gsub(/\b\w/, &:capitalize)zachowuje zamierzone wielkie litery w słowach, np. „Jane mcCollins”
user3680688
3
"hello world".split.each{|i| i.capitalize!}.join(' ')
Muhamamd Awais
źródło
1
nie ma powodu, aby używać operatora bang (!), jeśli nie pracujesz ze zmienną
boulder_ruby
2
@boulder_ruby To nieprawda, że „nie ma powodu, aby używać operatora bang, jeśli nie pracujesz ze zmienną”. Wartość zwracana przez każdą iterację eachbloku jest odrzucana. !Modyfikuje struny produkowane przez splitin-place. Bez !, capitalizebyłoby utworzenie jednego nowego skapitalizowanych za ciąg iteracji, a następnie natychmiast odrzucając go. Ostateczny wynik byłby "hello world"taki sam, jak oryginalny ciąg. W przypadku !, każdy ciąg w splittablicy 'd jest zmieniany, a zatem wynikiem eachjest tablica ciągów pisanych wielkimi literami.
user513951
1
Tak, powinieneś tylko użyć map. Ciekawy hack. Punkty
boulder_ruby
1

Jeśli próbujesz zacząć wielką literę każdego słowa w tablicy, możesz po prostu umieścić to:

nazwa_tablicy.map (&: wielkie litery)

astee
źródło
0

Użyłem tego do podobnego problemu:

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

To rozwiązuje następujące dziwne przypadki, które widziałem, próbując poprzednich odpowiedzi:

  • znaki niebędące słowami, takie jak -
  • akcentowane znaki wspólne w nazwach, takich jak é
  • wielkie znaki w środku ciągu
sesquipedalian-dev
źródło