Ruby schreibt jeden ersten Buchstaben groß

162

Ich muss das erste Zeichen jedes Wortes in Großbuchstaben schreiben und den Rest in Kleinbuchstaben schreiben ...

manufacturer.MFA_BRAND.first.upcase

setzt nur den ersten Buchstaben in Großbuchstaben, aber ich brauche dies:

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

Antworten:

217

Versuche dies:

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

#=> One Two Three Four

oder

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

quelle
7
splitwird standardmäßig auf Speicherplatz aufgeteilt, so dass Sie es noch kürzer machen können:'one TWO three foUR'.split.map(&:capitalize).join(' ')
Mischa
@waltee Könnten Sie möglicherweise erklären .map(&:capitalize)oder zumindest darauf hinweisen, wo in dem Dokument Sie es gefunden haben? Ich kann keinen Hinweis darauf finden. Und wie sieht es mit dem *' 'am Ende des zweiten Code-Snippets aus?
Macsplean
6
@macsplean Die &:methodSyntax in mapist eine übersichtliche Möglichkeit, eine Methode für jedes Element im Array aufzurufen . Sie können dann aufrufen join, um dieses Array in eine Zeichenfolge umzuwandeln. Dies * ' 'ist eine alternative Möglichkeit, Join aufzurufen . Sie können sich vorstellen, die Elemente im Array zu multiplizieren, um eine Zeichenfolge zu erstellen.
Andrew
283

In Schienen:

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

ohne Schienen:

"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

ohne Rails (Laden Sie den ActiveSupport von Rails, um die # titleleize-Methode zu patchen String)

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

(einige) String-Anwendungsfälle, die von #titleize behandelt werden

  • "Kirk Douglas"
  • "kirk_douglas"
  • "Kirk-Douglas"
  • "kirkDouglas"
  • "KirkDouglas"

#titleize Fallstricke

Rails titleizekonvertiert Dinge wie Bindestriche und Unterstriche in Leerzeichen und kann zu anderen unerwarteten Ergebnissen führen, insbesondere in Situationen, in denen zwischen Groß- und Kleinschreibung unterschieden wird, wie von @JamesMcMahon hervorgehoben:

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

weil es dazu gedacht ist, Code in Kamelhülle wie folgt zu handhaben:

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

Um diesen #downcaseRandfall zu lösen, können Sie Ihren String zuerst bereinigen, bevor Sie #titleize ausführen. Wenn Sie dies tun, werden Sie natürlich alle camelCased-Worttrennungen auslöschen:

"kirkDouglas".downcase.titleize #=> "Kirkdouglas"
boulder_ruby
quelle
Es gibt auch ein Juwel titleize , die gut funktioniert.
Zhon
6
Titleize ist nicht so einfach wie es aussieht, zum Beispiel wird 'hEy LoOK' zu 'H Ey Lo Ok'
James McMahon
8
RIESIGES GOTCHA, titleize entfernt bestimmte Zeichen vollständig, wie z. B. den Bindestrich (-). "wer? - ich" .titleize => "wer? ich"
pixelearth
@pixelearth konvertiert für mich alle Striche in einzelne Räume.
boulder_ruby
37

"hello world".titleize welches "Hallo Welt" ausgeben sollte.

Farbton lwin lwin gewinnen
quelle
Diese "One Two Three Fo Ur"Ausgabe unterscheidet sich von der gewünschten Ausgabe in diesem Fall, kann jedoch in anderen Fällen erwünscht sein.
Rick Smith
3
Dies ist keine Ruby-Methode. Es ist eine ActiveSupport (Rails) -Methode, die in Version 2.2.1
Zack Burt
20

Eine andere Option ist die Verwendung eines regulären Ausdrucks und eines gsub, die einen Block benötigen:

'one TWO three foUR'.gsub(/\w+/, &:capitalize)
Bob Nadler
quelle
Dieser bewahrt Zwischenwortstriche usw.
Beer Me
3
.gsub(/\b\w/, &:capitalize)bewahrt die beabsichtigte Großschreibung in Worten, z. B. "Jane mcCollins"
user3680688
3
"hello world".split.each{|i| i.capitalize!}.join(' ')
Muhamamd Awais
quelle
1
Es gibt keinen Grund, einen Bang (!) - Operator zu verwenden, wenn Sie nicht mit einer Variablen arbeiten
boulder_ruby
2
@boulder_ruby Es ist nicht wahr, dass "es keinen Grund gibt, einen Bang-Operator zu verwenden, wenn Sie nicht mit einer Variablen arbeiten." Der Rückgabewert jeder Iteration des eachBlocks wird verworfen. Das !ändert die von splitin-place erzeugten Strings . Ohne die !, capitalizewürde man neue aktivierte Zeichenfolge pro Iteration erstellen, und es dann sofort zu verwerfen. Das Endergebnis wäre "hello world"genauso wie die ursprüngliche Zeichenfolge. Mit dem !wird jede Zeichenfolge im split'd-Array geändert, und daher ist das Ergebnis von eachein Array von Zeichenfolgen mit Großbuchstaben.
user513951
1
Ja, du sollst es nur benutzen map. Interessanter Hack. Punkte
boulder_ruby
1

Wenn Sie versuchen, den ersten Buchstaben jedes Wortes in einem Array groß zu schreiben, können Sie einfach Folgendes eingeben:

array_name.map (&: großschreiben)

Astee
quelle
0

Ich habe dies für ein ähnliches Problem verwendet:

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

Dies behandelt die folgenden seltsamen Fälle, in denen ich die vorherigen Antworten ausprobiert habe:

  • Nicht-Wort-Zeichen wie -
  • Akzentzeichen, die in Namen wie é häufig vorkommen
  • Großbuchstaben in der Mitte der Zeichenfolge
sesquipedalian-dev
quelle