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 ?
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 ?
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.
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.
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
À 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.
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"]
.
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).
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.
-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 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.
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']