web-dev-qa-db-fra.com

Capitaliser uniquement le premier caractère de la chaîne et laisser les autres en paix? (Des rails)

J'essaie d'obtenir Rails pour mettre en majuscule le premier caractère d'une chaîne et laisser les autres comme ils sont. Je rencontre un problème où "je viens de New York "se transforme en" Je suis de New York. "

Quelle méthode utiliserais-je pour sélectionner le premier caractère?

Merci

EDIT: J'ai essayé d'implémenter ce que macek a suggéré, mais je reçois une erreur "méthode indéfinie` capitalize '". Le code fonctionne bien sans la ligne en majuscule. Merci pour l'aide!

def fixlistname!
  self.title = self.title.lstrip + (title.ends_with?("...") ? "" : "...")
  self.title[0] = self.title[0].capitalize
  errors.add_to_base("Title must start with \"You know you...\"") unless self.title.starts_with? 'You know you'
end

EDIT 2: Ça marche. Merci pour l'aide!

EDIT 3: Attends, non je ne l'ai pas fait ... Voici ce que j'ai dans mon modèle de liste.

def fixlistname!
  self.title = self.title.lstrip + (title.ends_with?("...") ? "" : "...")
  self.title.slice(0,1).capitalize + self.title.slice(1..-1)
  errors.add_to_base("Title must start with \"You know you...\"") unless self.title.starts_with?  'You know you'
end

EDIT 4: J'ai essayé le montage de macek, et j'ai toujours une erreur méthode indéfinie `capitalize '". Que pourrais-je faire de travers?

def fixlistname!
  self.title = title.lstrip
  self.title += '...' unless title.ends_with?('...')
  self.title[0] = title[0].capitalize
  errors.add_to_base('Title must start with "You know you..."') unless title.starts_with?("You know you")
end

EDIT 5: C'est bizarre. Je suis en mesure de supprimer l'erreur de méthode non définie en utilisant la ligne ci-dessous. Le problème est que cela semble remplacer la première lettre par un chiffre. Par exemple, au lieu de mettre le y dans vous, le y se transforme en 121

self.title[0] = title[0].to_s.capitalize
98
Daniel O'Connor

Titleize va capitaliser chaque mot. Cette ligne semble lourde, mais garantira que la seule lettre modifiée est la première.

new_string = string.slice(0,1).capitalize + string.slice(1..-1)

Mise à jour:

irb(main):001:0> string = "i'm from New York..."
=> "i'm from New York..."
irb(main):002:0> new_string = string.slice(0,1).capitalize + string.slice(1..-1)
=> "I'm from New York..."
91
Taryn East

Cela devrait le faire:

title = "test test"     
title[0] = title[0].capitalize
puts title # "Test test"
120
Pascal Van Hecke

Vous pouvez utiliser humanize. Si vous n'avez pas besoin de traits de soulignement ou d'autres majuscules dans vos lignes de texte.

Contribution:

"i'm from New_York...".humanize

Sortie:

"I'm from new york..."
56
Bartuzz
str = "this is a Test"
str.sub(/^./, &:upcase)
# => "This is a Test"
45
Lasse Bunk

À compter de Rails 5.0.0.beta4 , vous pouvez utiliser le nouveau String#upcase_firstmethod ou ActiveSupport::Inflector#upcase_first pour le faire. Vérifiez ceci blog post pour plus d'informations.

33
user1519240

Une solution orientée objet:

class String
  def capitalize_first_char
    self.sub(/^(.)/) { $1.capitalize }
  end
end

Ensuite, vous pouvez simplement faire ceci:

"i'm from New York".capitalize_first_char
14
lmanners
str.sub(/./, &:capitalize)
7
emlai
my_string = "hello, World"
my_string.sub(/\S/, &:upcase) # => "Hello, World"
6
rwz

Modifier 2

Je n'arrive pas à reproduire votre problème. Allez-y et exécutez ce script natif Ruby. Il génère la sortie exacte que vous recherchez et Rails prend en charge toutes ces méthodes. Quel type d'entrées utilisez-vous? avoir des problèmes avec?

#!/usr/bin/Ruby
def fixlistname(title)
  title = title.lstrip
  title += '...' unless title =~ /\.{3}$/
  title[0] = title[0].capitalize
  raise 'Title must start with "You know you..."' unless title =~ /^You know you/
  title
end

DATA.each do |title|
  puts fixlistname(title)
end

__END__
you know you something WITH dots ...
you know you something WITHOUT the dots
  you know you something with LEADING whitespace...
  you know you something with whitespace BUT NO DOTS
this generates error because it doesn't start with you know you

sortie

You know you something WITH dots ...
You know you something WITHOUT the dots...
You know you something with LEADING whitespace...
You know you something with whitespace BUT NO DOTS...
RuntimeError: Title must start with "You know you..."

Modifier

En fonction de votre modification, vous pouvez essayer quelque chose comme ceci.

def fixlistname!
  self.title = title.lstrip
  self.title += '...' unless title.ends_with?('...')
  self.title[0] = title[0].capitalize
  errors.add_to_base('Title must start with "You know you..."') unless title.starts_with?("You know you")
end

Original

Ça fera l'affaire

s = "i'm from New York"
s[0] = s[0].capitalize
#=> I'm from New York

Lorsque vous essayez d'utiliser String#capitalize sur toute la chaîne, vous voyiez I'm from new york parce que la méthode:

Retourne 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"
6
maček

La plupart de ces réponses modifient la chaîne en place. Lorsque vous vous contentez de formater pour l'affichage, vous ne souhaitez peut-être pas modifier la chaîne sous-jacente afin de pouvoir utiliser tap après un dup pour obtenir une édition modifiée. copie

'test'.dup.tap { |string| string[0] = string[0].upcase }
4
Paul.s

Si et seulement si OP voudrait faire un patch de singe sur un objet String, alors ceci peut être utilisé

class String
  # Only capitalize first letter of a string
  def capitalize_first
    self.sub(/\S/, &:upcase)
  end
end

Maintenant, utilisez-le:

"i live in New York".capitalize_first #=> I live in New York
3
JVK

Personne n'a mentionné gsub, ce qui vous permet de le faire de manière concise.

string.gsub(/^([a-z])/) { $1.capitalize }

Exemple:

 > 'caps lock must go'.gsub(/^(.)/) { $1.capitalize }
=> "Caps lock must go"
2
mahemoff

Une version encore plus courte pourrait être:

s = "i'm from New York..."
s[0] = s.capitalize[0]
2
Saim

Notez que si vous devez gérer des caractères multi-octets, c’est-à-dire si vous devez internationaliser votre site, le s[0] = ... La solution ne sera pas adéquate. Cette question de débordement de pile suggère d'utiliser le unicode-util gem

Ruby 1.9: comment puis-je mettre correctement en valeur les chaînes multi-octets?

[~ # ~] éditer [~ # ~]

En fait, un moyen plus facile d'éviter au moins les codages de chaînes étranges consiste simplement à utiliser String # mb_chars :

s = s.mb_chars
s[0] = s.first.upcase
s.to_s
1
frontendbeauty

Peut-être le moyen le plus simple.

s = "test string"
s[0] = s[0].upcase
# => "Test string"
1
Lukas Baliak

Qu'en est-il de la méthode classify sur string?

'somESTRIng'.classify

sortie:

#Rails => 'SomESTRIng'
0
mArtinko5MB