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']

6voto

jhwist Points 5270

Utilisez capitalize . De la Chaîne de caractères documentation :

Renvoie une copie de str avec le premier caractère converti en majuscule et le reste en minuscule.

"hello".capitalize    #=> "Hello"
"HELLO".capitalize    #=> "Hello"
"123ABC".capitalize   #=> "123abc"

0 votes

N'utilisez le point d'exclamation que si vous voulez que la chaîne originale soit modifiée.

0 votes

doh Merci, j'ai corrigé mon erreur.

5 votes

-1. L'OP explicitement mentionne des textes allemands et russes, ce qui implique des caractères non ASCII. String#upcase (et aussi String#downcase ) ne sont définis que pour les caractères ASCII.

4voto

Inversion Points 106

Ma version :

class String
    def upcase_first
        return self if empty?
        dup.tap {|s| s[0] = s[0].upcase }
    end
    def upcase_first!
        replace upcase_first
    end
end

['NASA title', 'MHz', 'sputnik'].map &:upcase_first  #=> ["NASA title", "MHz", "Sputnik"]

Vérifiez également :
https://www.rubydoc.info/gems/activesupport/5.0.0.1/String%3Aupcase_first
https://www.rubydoc.info/gems/activesupport/5.0.0.1/ActiveSupport/Inflector#upcase_first-instance_method

3voto

phlegx Points 64

Vous pouvez utiliser mb_chars . Cela respecte l'umlaute :

class String

  # Only capitalize first letter of a string
  def capitalize_first
    self[0] = self[0].mb_chars.upcase
    self
  end

end

Exemple :

"ümlaute".capitalize_first
#=> "Ümlaute"

2voto

user4669748 Points 1806

Voici une autre façon de mettre en majuscules chaque mot d'une chaîne de caractères. \w ne correspond pas aux caractères cyrilliques ou aux caractères latins avec diacritiques mais [[:word:]] fait. upcase , downcase , capitalize y swapcase ne s'est pas appliqué aux caractères non ASCII avant la version 2.4.0 de Ruby, publiée en 2016.

"aAa-BBB ä  _a a_a".gsub(/\w+/,&:capitalize)
=> "Aaa-Bbb ä  _a A_a"
"aAa-BBB ä  _a a_a".gsub(/[[:word:]]+/,&:capitalize)
=> "Aaa-Bbb Ä  _a A_a"

[[:word:]] correspond aux caractères de ces catégories :

Ll (Letter, Lowercase)
Lu (Letter, Uppercase)
Lt (Letter, Titlecase)
Lo (Letter, Other)
Lm (Letter, Modifier)
Nd (Number, Decimal Digit)
Pc (Punctuation, Connector)

[[:word:]] correspond aux 10 caractères de la rubrique "Ponctuation, Connecteur" ( Pc ) :

005F _ LOW LINE
203F  UNDERTIE
2040  CHARACTER TIE
2054  INVERTED UNDERTIE
FE33  PRESENTATION FORM FOR VERTICAL LOW LINE
FE34  PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
FE4D  DASHED LOW LINE
FE4E  CENTRELINE LOW LINE
FE4F  WAVY LOW LINE
FF3F  FULLWIDTH LOW LINE

C'est une autre façon de ne convertir en majuscules que le premier caractère d'une chaîne de caractères :

"striNG".sub(/./,&:upcase)
=> "StriNG"

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