2010-02-28 5 views
9

Je cherche à vérifier si une chaîne contient toutes les majuscules dans Rails. Comment ferais-je cela? J'écris ma propre méthode d'aide personnalisée au pluriel et je voudrais quelque chose passer des mots comme "WORD" et parfois "Word" - Je veux tester si mon mot est tout en majuscules afin que je puisse retourner "MOTS" - avec un "S" majuscule à la fin si le mot est pluriel (vs "MOTS").Vérifie si une chaîne est en majuscules dans Rails

Merci!

+0

double possible de [Comment puis-je vérifier un mot est déjà en majuscules dans Ruby?] (Http: // stackoverflow .com/questions/8529595/comment-peut-je-vérifier-un-mot-est-déjà-tout-en-majuscule-en-rubis) – philant

+0

Ah non, cette question a été posée avant celle-là, donc si quelque chose devait être cette question être fermé comme un dup de celui-ci. –

+0

@philant - vous ne devriez pas voter-pour-fermer comme double formulaire des deux côtés ... juste d'un côté. –

Répondre

23

Pour ce faire:

str == str.upcase 

par exemple:

str = "DOG" 
str == str.upcase # true 
str = "cat" 
str == str.upcase # false 

D'où le code de votre scénario sera:

# In the code below `upcase` is required after `str.pluralize` to transform 
# DOGs to DOGS 
str = str.pluralize.upcase if str == str.upcase 
+0

merci! ça marche :) –

+0

Il est tellement idiomatique! Gardez cependant à l'esprit que pour les très longues chaînes, il y aura des pénalités de temps et de mémoire, car il faut allouer une autre chaîne et la doubler deux fois. Les solutions à base d'expressions régulières sont plus optimales. – skalee

2

Ou ceci:

str =~ /^[A-Z]+$/ 

.:

par exemple
"DOG" =~ /^[A-Z]+$/ # 0 
"cat" =~ /^[A-Z]+$/ # nil 
+1

Ne fonctionne pas lorsque la chaîne contient autre chose que A-Z. DÖG ou CÄT ou DOG123 par exemple. – Priit

+1

Tout à fait vrai. Si l'internationalisation est un problème, le 'str == str.upcase' pourrait mieux fonctionner, mais cela dépend de la définition de' upcase'. Sur mon système, '' coöperation '.upcase' est '' COÖPERATION' ', ce qui ne m'aide pas vraiment. Ruby 1.9 est plus sensible à l'encodage; pour ceux sur 1.8, il y a la gemme Unicode: http://rubygems.org/gems/unicode –

+0

Ancrages incorrects, en dehors des problèmes mentionnés ci-dessus, il va correspondre à des chaînes comme "lower \ nUPPER" ' – skalee

2

Merci à des expressions régulières, il est très simple. Il suffit d'utiliser [[:upper:]] classe de caractères qui permet toutes les lettres majuscules, y compris, mais sans s'y limiter, ceux présents en ASCII-8.

Selon ce que avez-vous besoin exactement:

# allows upper case characters only 
/\A[[:upper:]]*\Z/ =~ "YOURSTRING" 

# additionally disallows empty strings 
/\A[[:upper:]]+\Z/ =~ "YOURSTRING" 

# also allows white spaces (multi-word strings) 
/\A[[:upper:]\s]*\Z/ =~ "YOUR STRING" 

# allows everything but lower case letters 
/\A[^[:lower:]]*\Z/ =~ "YOUR 123_STRING!" 

Ruby doc: http://www.ruby-doc.org/core-2.1.4/Regexp.html

Questions connexes