Ruby majuscule chaque mot première lettre

162

J'ai besoin de mettre le premier caractère de chaque mot en majuscule et de mettre le reste en minuscule ...

manufacturer.MFA_BRAND.first.upcase

met uniquement la première lettre en majuscule, mais j'ai besoin de ceci:

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

Réponses:

217

essaye ça:

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

#=> One Two Three Four

ou

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

la source
7
splitsera divisé sur l'espace par défaut, vous pouvez donc le rendre encore plus court:'one TWO three foUR'.split.map(&:capitalize).join(' ')
Mischa
@waltee Pourriez-vous expliquer le .map(&:capitalize)ou au moins indiquer où dans le document vous l'avez trouvé? Je ne trouve aucune référence à cela. De plus, quel est le problème avec *' 'la fin du deuxième extrait de code?
macsplean
6
@macsplean la &:methodsyntaxe de mapest une manière concise d'appeler une méthode sur chaque élément du tableau . Vous pouvez ensuite appeler joinpour transformer ce tableau en une chaîne. Le * ' 'est une autre manière d'appeler join . Vous pouvez considérer cela comme une multiplication des éléments du tableau pour créer une chaîne.
Andrew
283

Dans les rails:

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

sans Rails:

"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

sans Rails (ActiveSupport des rails de chargement pour patcher la méthode #titleize sur String)

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

(certains) cas d'utilisation de chaînes gérés par #titleize

  • «kirk douglas»
  • "kirk_douglas"
  • "kirk-douglas"
  • "kirkDouglas"
  • «KirkDouglas»

#titleize gotchas

Les rails titleizeconvertissent des éléments tels que les tirets et les traits de soulignement en espaces et peuvent produire d'autres résultats inattendus, en particulier avec des situations sensibles à la casse, comme le souligne @JamesMcMahon:

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

car il est destiné à gérer du code à boîtier camel comme:

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

Pour gérer ce cas particulier, vous pouvez d'abord nettoyer votre chaîne #downcaseavant d'exécuter #titleize. Bien sûr, si vous faites cela, vous effacerez toutes les séparations de mots en camelCased:

"kirkDouglas".downcase.titleize #=> "Kirkdouglas"
boulder_ruby
la source
Il y a aussi un petit bijou titleize qui fonctionne bien.
zhon
6
Titleize n'est pas aussi simple qu'il y paraît, par exemple 'hEy LoOK' devient 'H Ey Lo Ok'
James McMahon
8
ÉNORME GOTCHA, titleize supprimera complètement certains caractères, comme le tiret (-). "who? - me" .titleize => "Who? Me"
pixelearth
@pixelearth pour moi sa conversion de tous les tirets en espaces individuels.
boulder_ruby
37

"hello world".titleize qui devrait afficher "Hello World".

teinte lwin lwin win
la source
Cette sortie "One Two Three Fo Ur"est différente de la sortie souhaitée dans ce cas, mais peut être souhaitée dans d'autres.
Rick Smith
3
Ce n'est pas une méthode Ruby; c'est une méthode ActiveSupport (Rails) introduite dans la v2.2.1
Zack Burt
20

Une autre option consiste à utiliser un regex et un gsub, qui prend un bloc:

'one TWO three foUR'.gsub(/\w+/, &:capitalize)
Bob Nadler
la source
Celui-ci préserve les tirets entre les mots, etc.
Beer Me
3
.gsub(/\b\w/, &:capitalize)préserve la capitalisation voulue dans les mots, par exemple "Jane mcCollins"
user3680688
3
"hello world".split.each{|i| i.capitalize!}.join(' ')
Muhamamd Awais
la source
1
il n'y a aucune raison d'utiliser un opérateur bang (!) si vous ne travaillez pas avec une variable
boulder_ruby
2
@boulder_ruby Ce n'est pas vrai que "il n'y a aucune raison d'utiliser un opérateur bang si vous ne travaillez pas avec une variable." La valeur de retour de chaque itération du eachbloc est supprimée. Le !modifie les chaînes produites par splitin-place. Sans le !, capitalizecréerait une nouvelle chaîne en majuscules par itération, puis la supprimerait immédiatement. Le résultat final serait "hello world", exactement le même que la chaîne d'origine. Avec le !, chaque chaîne du splittableau 'd est modifiée et le résultat de eachest donc un tableau de chaînes en majuscules.
user513951
1
Ouais, tu es juste censé utiliser map. Hack intéressant cependant. Points
boulder_ruby
1

Si vous essayez de mettre en majuscule la première lettre de chaque mot dans un tableau, vous pouvez simplement mettre ceci:

array_name.map (&: capitalize)

astee
la source
0

J'ai utilisé ceci pour un problème similaire:

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

Cela gère les cas étranges suivants que j'ai vus en essayant les réponses précédentes:

  • caractères autres que des mots comme -
  • caractères accentués communs dans les noms comme é
  • caractères majuscules au milieu de la chaîne
sesquipedalian-dev
la source