169 votes

Comment mettre en majuscule la première lettre d'une chaîne de caractères en Ruby ?

El upcase met en majuscules la chaîne entière, mais je dois mettre en majuscules uniquement la première lettre.

J'ai également besoin de prendre en charge plusieurs langues populaires, comme l'allemand et le russe.

Comment dois-je m'y prendre ?

4 votes

Sachez que certaines langues ont des idées différentes sur la première lettre à mettre en majuscule. En irlandais, on fait des choses comme "i mBaile Átha Cliath" ("à Dublin") - m minuscule, B majuscule. (Voir fr.wikipedia.org/wiki/Consonant_mutation#Celtic_languages si vous êtes curieux de savoir pourquoi les Irlandais font cela et pourquoi cela a du sens).

4 votes

Sachez également que #capitalize met en minuscule toutes les lettres qui ne sont pas la première lettre... ce qui n'est pas toujours ce que vous souhaitez. ['space', 'UFO', 'NASA'].collect{|w| w.capitalize} #=> ['Space', 'Ufo', 'Nasa']

297voto

Alberto Santini Points 2887

Cela dépend de la version de Ruby que vous utilisez :

Ruby 2.4 et plus :

Cela fonctionne, car depuis Ruby v2.4.0 prend en charge le mappage de la casse Unicode :

"".capitalize #=> 

Ruby 2.3 et inférieur :

"maria".capitalize #=> "Maria"
"".capitalize #=> 

Le problème, c'est qu'il ne fait pas ce que vous voulez, il produit au lieu de .

Si vous utilisez Rails, il existe une solution de contournement facile :

"".mb_chars.capitalize.to_s # requires ActiveSupport::Multibyte

Sinon, vous devrez installer le unicode et utilisez-la comme suit :

require 'unicode'

Unicode::capitalize("") #=> 

Ruby 1.8 :

Veillez à utiliser le codage commentaire magique :

#!/usr/bin/env ruby

puts "".capitalize

donne invalid multibyte char (US-ASCII) alors que :

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

puts "".capitalize

fonctionne sans erreur, mais voyez aussi la section "Ruby 2.3 et inférieur" pour une vraie capitalisation.

39 votes

Notez qu'apparemment "my API is great".capitalize produira My api is great ce qui est probablement un comportement indésirable. Cette réponse ne répond donc pas vraiment à la question puisqu'il veut seulement que la PREMIÈRE lettre devienne une majuscule et que les autres restent inchangées.

76voto

boulder_ruby Points 6257

met la première lettre du premier mot de la chaîne en majuscule

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

mettre la première lettre de chaque mot en majuscule

Dans les rails :

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

O

"kirk_douglas".titleize
=> "Kirk Douglas"    

En rubis :

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

O

require 'active_support/core_ext'
"kirk douglas".titleize

2 votes

Upvote pour une solution purement Ruby. J'avais trop la flemme de lancer Rails, et ceci a fait l'affaire :)

25voto

user1519240 Points 36

Rails 5+.

À partir de Active Support et Rails 5.0.0.beta4, vous pouvez utiliser l'une des deux méthodes : String#upcase_first o ActiveSupport::Inflector#upcase_first .

"my API is great".upcase_first #=> "My API is great"
"".upcase_first           #=> ""
"".upcase_first           #=> ""
"NASA".upcase_first            #=> "NASA"
"MHz".upcase_first             #=> "MHz"
"sputnik".upcase_first         #=> "Sputnik"

Vérifier " Rails 5 : Nouvelle méthode upcase_first "pour plus d'informations.

21voto

Huliax Points 168

Pour que nous sachions comment mettre en majuscule uniquement la première lettre et ne pas toucher aux autres, car c'est parfois ce que l'on souhaite :

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

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

Appel à capitalize aurait pour conséquence ["Nasa", "Mhz", "Sputnik"] .

20voto

Jörg W Mittag Points 153275

Malheureusement, il est impossible pour une machine de monter, descendre ou capitaliser correctement. Il faut beaucoup trop d'informations contextuelles pour qu'un ordinateur puisse les comprendre.

C'est pourquoi Ruby String ne prend en charge les majuscules que pour les caractères ASCII, car là, c'est au minimum quelque peu bien défini.

Qu'est-ce que j'entends par "informations contextuelles" ?

Par exemple, pour mettre en majuscule i Pour bien faire, vous devez savoir dans quelle langue se trouve le texte. L'anglais, par exemple, n'a que deux i s : capital I sans point et petit i avec un point. Mais le turc a quatre i s : capital I sans point, majuscule avec un point, petit sans point, petit i avec un point. Donc, en anglais 'i'.upcase # => 'I' et en turc 'i'.upcase # => '' . En d'autres termes : puisque 'i'.upcase peut renvoyer deux résultats différents, selon la langue, il est évidemment impossible de mettre correctement un mot en majuscule sans connaître sa langue.

Mais Ruby ne connaît pas la langue, il ne connaît que l'encodage. Il est donc impossible de mettre correctement une chaîne en majuscules avec la fonctionnalité intégrée de Ruby.

Il y a pire : même avec En connaissant la langue, il est parfois impossible de faire les majuscules correctement. Par exemple, en allemand, 'Maße'.upcase # => 'MASSE' ( Maße est le pluriel de Maß signification mesure ). Cependant, 'Masse'.upcase # => 'MASSE' (sens masse ). Alors, qu'est-ce que 'MASSE'.capitalize ? En d'autres termes, pour capitaliser correctement, il faut une intelligence artificielle à part entière.

Donc, au lieu de donner parfois une mauvaise réponse, Ruby choisit de ne pas donner de réponse du tout C'est pourquoi les caractères non ASCII sont tout simplement ignorés dans les opérations de minuscule, majuscule et majuscule. (Ce qui bien sûr donne aussi des résultats erronés, mais au moins c'est facile à vérifier).

4 votes

Désolé, mais votre argumentation ne tient pas la route. Il n'est pas vrai que Ruby choisit de ne pas donner de réponse du tout, Ruby donne toujours une réponse, qui est souvent fausse - par exemple, "".upcase ne devrait jamais retourner "", ce qui n'est correct dans aucun contexte. Et vos digressions sur la nécessité de l'IA ne sont pas du tout pertinentes - il n'y a rien qui empêche upcase de retourner un tableau, disons ['I', ''] pour 'i'.upcase, et de laisser l'appelant décider quelle capitalisation est pertinente dans une situation donnée. Actuellement, la gestion par Ruby de la conversion entre majuscules et minuscules est défectueuse, et c'est tout.

2 votes

-1 parce qu'il y a un capital Eszett . L'utilisation d'un domaine non complètement formalisé ne peut servir de preuve que la solution est possible uniquement avec l'IA.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X