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
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..."
Cela devrait le faire:
title = "test test"
title[0] = title[0].capitalize
puts title # "Test test"
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..."
str = "this is a Test"
str.sub(/^./, &:upcase)
# => "This is a Test"
À compter de Rails 5.0.0.beta4 , vous pouvez utiliser le nouveau String#upcase_first
method ou ActiveSupport::Inflector#upcase_first
pour le faire. Vérifiez ceci blog post pour plus d'informations.
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
str.sub(/./, &:capitalize)
my_string = "hello, World"
my_string.sub(/\S/, &:upcase) # => "Hello, World"
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
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..."
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
Ç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"
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 }
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
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"
Une version encore plus courte pourrait être:
s = "i'm from New York..."
s[0] = s.capitalize[0]
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
Peut-être le moyen le plus simple.
s = "test string"
s[0] = s[0].upcase
# => "Test string"
Qu'en est-il de la méthode classify sur string?
'somESTRIng'.classify
sortie:
#Rails => 'SomESTRIng'