Прописать первую букву в рубине - PullRequest
117 голосов
/ 16 сентября 2010

Метод upcase использует заглавные буквы всей строки.

Мне нужно использовать только первую букву.

Кроме того, мне нужно поддерживать несколько популярных языков, таких как немецкий и русский.

Как мне это сделать?

Ответы [ 8 ]

242 голосов
/ 16 сентября 2010

Это зависит от используемой вами версии Ruby.

Рубин 2,4 и выше

Это просто работает, поскольку эта версия ruby ​​поддерживает сопоставление регистров Unicode.

"мария".capitalize #=> Мария

Рубин 2.3 и ниже

"maria".capitalize #=> "Maria"
"мария".capitalize #=> мария

Проблема в том, что он просто не делает то, что вам нужно: он выводит мария вместо Мария.

Если вы используете Rails, есть простой обходной путь:

"мария".mb_chars.capitalize.to_s # requires ActiveSupport::Multibyte

делает работу.

В противном случае вам придется установить юникод гем и использовать его следующим образом:

require 'unicode'

Unicode::capitalize("мария") #=> Мария

Рубин 1,8

Прежде всего, обязательно используйте кодирование магический комментарий:

#!/usr/bin/env ruby

puts "мария".capitalize

дает invalid multibyte char (US-ASCII), а:

#!/usr/bin/env ruby
#coding: utf-8

puts "мария".capitalize

работает без ошибок, но также смотрите раздел Ruby 2.3 и ниже для реальной прописной буквы.

50 голосов
/ 21 февраля 2013

заглавная первая буква первого слова строки

"kirk douglas".capitalize
#=> "Kirk douglas"

заглавная буква каждого слова

в рельсах:

"kirk douglas".titleize
=> "Kirk Douglas"

ИЛИ

"kirk_douglas".titleize
=> "Kirk Douglas"    

В ruby:

"kirk douglas".split(/ |\_|\-/).map(&:capitalize).join(" ") 
#=> "Kirk Douglas"

вне рельсов, но все еще хочет использовать метод titleize

require 'active_support/core_ext'
"kirk douglas".titleize #or capitalize
18 голосов
/ 16 сентября 2010

К сожалению, для машины невозможно правильно прописать / уменьшить регистр / использовать заглавные буквы.Ему нужно слишком много контекстной информации, чтобы компьютер мог ее понять.

Именно поэтому класс String в Ruby поддерживает только заглавные буквы для символов ASCII, потому что по крайней мере несколько четко определено.

Что я подразумеваю под «контекстной информацией»?

Например, чтобы правильно использовать заглавную букву i, вам необходимо знать, на каком языке находится текст. Например, в английском есть только дваi s: заглавная I без точки и маленькая i с точкой.Но у турецкого есть четыре i s: прописная I без точки, прописная İ с точкой, маленькая ı без точки, маленькая i с точкой.Итак, на английском 'i'.upcase # => 'I' и на турецком 'i'.upcase # => 'İ'.Другими словами: поскольку 'i'.upcase может возвращать два разных результата, в зависимости от языка, очевидно, невозможно правильно использовать заглавную букву в слове, не зная его языка.

Но Руби не знает языка, он толькознает кодировкуПоэтому невозможно правильно использовать заглавную строку с помощью встроенной функциональности Ruby.

Становится хуже: даже при , зная язык, иногда невозможно сделать заглавные буквы правильно.Например, на немецком языке 'Maße'.upcase # => 'MASSE' ( Maße - это множественное число от Maß , что означает измерение ).Однако 'Masse'.upcase # => 'MASSE' (имеется в виду масса ).Итак, что такое 'MASSE'.capitalize?Другими словами: для правильного использования заглавных букв необходим полноценный искусственный интеллект.

Таким образом, вместо того, чтобы иногда давать неправильный ответ, Руби предпочитает иногда вообще не давать ответа , поэтомуСимволы -ASCII просто игнорируются в операциях downcase / upcase / capitalize.(Что, конечно, также приводит к неверным результатам, но, по крайней мере, это легко проверить.)

14 голосов
/ 09 ноября 2015

Ну, просто, чтобы мы знали, как писать только первую букву и оставить остальные из них в покое (потому что иногда это то, что нужно) ...

['NASA', 'MHz', 'sputnik'].collect do |word|
  letters = word.split('')
  letters.first.upcase!
  letters.join
end

 => ["NASA", "MHz", "Sputnik"]

Вызов #capitalize приведет к ["Nasa", "Mhz", "Sputnik"]

4 голосов
/ 20 мая 2016

Начиная с Active Support и Rails 5.0.0.beta4 вы можете использовать один из двух методов: String#upcase_first или ActiveSupport::Inflector#upcase_first.Проверьте это сообщение в блоге для получения дополнительной информации.

2 голосов
/ 16 сентября 2010

Используйте capitalize. Из документов :

Возвращает копию строки с первым символом, преобразованным в верхний регистр, а оставшимся - в нижний регистр.

      "hello".capitalize    #=> "Hello"
      "HELLO".capitalize    #=> "Hello"
      "123ABC".capitalize   #=> "123abc"
1 голос
/ 23 января 2016

Вы можете использовать mb_chars. Это уважает умлауте:

class String

  # Only capitalize first letter of a string
  def capitalize_first
    self[0] = self[0].mb_chars.upcase
    self
  end

end

Пример:

"ümlaute".capitalize_first
#=> "Ümlaute"
0 голосов
/ 25 февраля 2019

Ниже приведен еще один способ использовать каждое слово в строке с большой буквы.\w не сопоставляет символы кириллицы или латинского алфавита с диакритическими знаками, но [[:word:]] соответствует.upcase, downcase, capitalize и swapcase не применялись к символам, отличным от ASCII, до выпуска Ruby 2.4.0, выпущенного в 2016 году.

"aAa-BBB ä мария _a a_a".gsub(/\w+/,&:capitalize)
=> "Aaa-Bbb ä мария _a A_a"
"aAa-BBB ä мария _a a_a".gsub(/[[:word:]]+/,&:capitalize)
=> "Aaa-Bbb Ä Мария _a A_a"

[[:word:]] соответствует символамв следующих категориях:

Ll (Letter, Lowercase)
Lu (Letter, Uppercase)
Lt (Letter, Titlecase)
Lo (Letter, Other)
Lm (Letter, Modifier)
Nd (Number, Decimal Digit)
Pc (Punctuation, Connector)

[[:word:]] соответствует всем 10 символам в категории «Знаки пунктуации» (Pc):

005F _ LOW LINE
203F ‿ UNDERTIE
2040 ⁀ CHARACTER TIE
2054 ⁔ INVERTED UNDERTIE
FE33 ︳ PRESENTATION FORM FOR VERTICAL LOW LINE
FE34 ︴ PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
FE4D ﹍ DASHED LOW LINE
FE4E ﹎ CENTRELINE LOW LINE
FE4F ﹏ WAVY LOW LINE
FF3F _ FULLWIDTH LOW LINE

Это еще один способпреобразуйте только первый символ строки в верхний регистр:

"striNG".sub(/./,&:upcase)
=> "StriNG"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...