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

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

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"

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”.


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)

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

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)


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.