Руби заглавными буквами каждое слово первая буква

162

Мне нужно сделать первый символ каждого слова заглавными, а остальные - строчными ...

manufacturer.MFA_BRAND.first.upcase

это только установка первой буквы в верхнем регистре, но мне нужно это:

ALFA ROMEO => Alfa Romeo
AUDI => Audi
BMW => Bmw
ONETWO THREE FOUR => Onetwo Three Four
byCoder
источник

Ответы:

217

попробуй это:

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

#=> One Two Three Four

или

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

источник
7
splitпо умолчанию разделится на пробел, поэтому вы можете сделать его еще короче:'one TWO three foUR'.split.map(&:capitalize).join(' ')
Миша
@waltee Не могли бы вы объяснить .map(&:capitalize)или хотя бы указать, где в документе вы его нашли? Я не могу найти ссылку на это. Кроме того, как обстоят дела с *' 'концом второго фрагмента кода?
Максплин
6
@macsplean &:methodсинтаксис в mapявляется кратким способом вызова метода для каждого элемента в массиве . Затем вы можете вызвать joinэтот массив в строку. * ' 'Является альтернативным способом вызова присоединиться . Вы можете думать об этом как о умножении элементов в массиве вместе, чтобы создать строку.
Андрей
283

В Rails:

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

без рельсов:

"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

без Rails (загрузите ActiveSupport от rails для исправления метода #titleize String)

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

(некоторые) варианты использования строки, обработанные #titleize

  • "Кирк Дуглас"
  • "kirk_douglas"
  • "Kirk-Дуглас"
  • «» Кирк Дуглас
  • «» Кирк Дуглас

#titleize gotchas

Rails titleizeпреобразует такие вещи, как тире и подчеркивание, в пробелы и может давать другие неожиданные результаты, особенно в ситуациях с учетом регистра, как указано @JamesMcMahon:

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

потому что он предназначен для обработки кода на верблюде, например:

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

Чтобы справиться с этим #downcaseкрайним случаем, вы можете сначала очистить строку перед запуском #titleize. Конечно, если вы сделаете это, вы уничтожите все разделенные верблюдами слова:

"kirkDouglas".downcase.titleize #=> "Kirkdouglas"
boulder_ruby
источник
Есть также драгоценный камень titleize, который хорошо работает.
Жон
6
Titleize не так прост, как кажется, например, «hEy LoOK» становится «H Ey Lo Ok»
Джеймс МакМахон
8
ОГРОМНОЕ GOTCHA, titleize удалит некоторые символы полностью, такие как тире (-). "кто? - я" .titleize => "Кто? Я"
pixelearth
@pixelearth для меня это преобразование всех штрихов в отдельные пробелы.
boulder_ruby
37

"hello world".titleize который должен вывести «Hello World».

оттенок lwin lwin win
источник
Это выходы, "One Two Three Fo Ur"которые отличаются от желаемого выхода в этом случае, но могут быть желательны в других.
Рик Смит
3
Это не метод Ruby; это метод ActiveSupport (Rails), представленный в v2.2.1
Зак Берт,
20

Другой вариант - использовать регулярные выражения и gsub, которые занимают блок:

'one TWO three foUR'.gsub(/\w+/, &:capitalize)
Боб Надлер
источник
Этот сохраняет межсловные тире и т. Д.
Beer Me
3
.gsub(/\b\w/, &:capitalize)сохраняет заглавную
букву
4

Посмотрите на метод String # с заглавными буквами.

http://www.ruby-doc.org/core-1.9.3/String.html#method-i-capitalize

Роберт Джет Роу
источник
Строка # заглавными буквами преобразует оставшуюся часть строки после первой буквы. Для таких имен, как "McGee", это нежелательный результат, но в этом случае он частично полезен.
Br.Bill
3
"hello world".split.each{|i| i.capitalize!}.join(' ')
Мухаммед Авайс
источник
1
нет смысла использовать оператор bang (!), если вы не работаете с переменной
boulder_ruby
2
@boulder_ruby Это неправда, что «нет смысла использовать оператор взрыва, если вы не работаете с переменной». Возвращаемое значение каждой итерации eachблока отбрасывается. !Модифицируют струны , произведенные splitна месте. Без !, capitalizeбудет создавать одну новую заглавную строку за итерацию, а затем сразу же отбрасывать ее. Окончательный результат будет таким "hello world"же, как и исходная строка. С помощью !каждой строки в splitмассиве 'd изменяется, и поэтому результатом eachявляется массив строк с заглавными буквами.
user513951
1
Да, вы просто должны использовать map. Интересный взлом, хотя. Очки
boulder_ruby
1

Если вы пытаетесь использовать первую букву каждого слова в массиве, вы можете просто поместить это:

array_name.map (&: прописные буквы)

astee
источник
0

Я использовал это для аналогичной проблемы:

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

Это обрабатывает следующие странные случаи, которые я видел, пробуя предыдущие ответы:

  • несловесные символы, такие как -
  • акцентированные символы, встречающиеся в именах, таких как
  • заглавные буквы в середине строки
полуторафутовый-DEV
источник