Рубіні з великої літери зазначають першу букву кожного слова


162

Мені потрібно зробити перший символ у верхньому регістрі кожного слова, а решта зробити малі регістри ...

manufacturer.MFA_BRAND.first.upcase

встановлює лише великі літери першої літери, але мені це потрібно:

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

Відповіді:


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

@waltee Ви могли б пояснити .map(&:capitalize)або хоча б вказати, де у документі ви його знайшли? Я не можу знайти посилання на це. Крім того, яка угода з *' 'кінцем другого фрагмента коду?
macsplean

6
@macsplean &:methodсинтаксис map- це стислий спосіб викликати метод для кожного елемента в масиві . Потім ви можете зателефонувати, joinщоб перетворити цей масив у рядок. * ' 'Є альтернативним способом виклику приєднатися . Ви можете подумати про це як множення елементів у масиві разом, щоб створити рядок.
Андрій

283

У рейках:

"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

без рейок (завантажте рейки ActiveSupport для виправлення методу #titleize String)

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

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

  • "Кірк дуглас"
  • "kirk_douglas"
  • "Кірк-Дуглас"
  • "kirkDouglas"
  • "KirkDouglas"

#titleize gotchas

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

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

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

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

Щоб розібратися з цим крайовим випадком, ви можете #downcaseспочатку очистити рядок перед запуском #titleize. Звичайно, якщо ви це зробите, ви викреслите будь-яке розділення слів верблюда, що залишилися:

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

Також є титульний номер дорогоцінного каміння, який чудово працює.
zhon

6
Титульний набір не такий простий, як здається, наприклад, "hEy LoOK" стає "H Ey Lo Ok"
Джеймс Макмахон

8
ВЕЛИЧЕЗНА ГОТЧА, титуловання видалить певні символи повністю, наприклад, тире (-). "хто? - мене" .titleize => "Хто? я"
pixelearth

@pixelearth для мене перетворює всі тире в окремі простори.
boulder_ruby

37

"hello world".titleize який повинен вивести "Hello World".


Це вихід, "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)зберігає передбачувані великі літери у словах, наприклад "Jane mcCollins"
користувач3680688


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

1
немає жодної причини використовувати оператор bang (!), якщо ви не працюєте зі змінною
boulder_ruby

2
@boulder_ruby Це неправда, що "немає жодної причини використовувати оператор чування, якщо ви не працюєте зі змінною". Повертається значення кожної ітерації eachблоку відкидається. !Модифікують струни , вироблені splitна місці. Без !, capitalizeбуло б створити одну нову заголовну рядок за ітерацію, а потім відразу ж відкинути його. Кінцевий результат був би "hello world"таким самим, як і початковий рядок. З !, кожен рядок у splitмасиві 'd змінюється, і тому результат each- це масив з великих літер.
користувач513951

1
Так, ви просто повинні використовувати map. Хоча цікавий хак. Очки
boulder_ruby

1

Якщо ви намагаєтесь використовувати великі літери кожного слова в масиві, ви можете просто поставити це:

array_name.map (&: з великої літери)


0

Я використовував це для подібної проблеми:

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

Це стосується таких дивних випадків, які я бачив, пробуючи попередні відповіді:

  • символи без слів, як-от -
  • наголошені символи, поширені в таких іменах, як é
  • великі символи в середині рядка
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.