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

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)*' '

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"

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".


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)

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

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)


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.