2010-02-28 12 views
9

Estoy buscando para verificar si una cadena tiene mayúsculas en Rails. ¿Cómo podría hacer eso?Comprueba si una cadena tiene mayúsculas en Rails

Estoy escribiendo mi propio método de ayuda personalizada de pluralización y algo pasaría palabras como "WORD" y, a veces "Word" - Quiero probar si mi palabra es todo en mayúsculas, así que puedo devolver "WORDS" - con una "S" mayúscula al final si la palabra es plural (frente a "WORDs").

Gracias!

+0

posible duplicado de [¿Cómo puedo comprobar una palabra ya está todo en mayúsculas en Ruby?] (Http: // stackoverflow .com/questions/8529595/how-can-i-check-a-word-is-already-all-mayúsculas-en-ruby) – philant

+0

Ah no, esta pregunta fue hecha antes de esa, por lo que si esa pregunta debería ser cerrado como un dup de este. –

+0

@philant: no debe votar para cerrar como duplicado de ambas partes ... solo por un lado. –

Respuesta

23

Haga lo siguiente:

str == str.upcase 

por ejemplo:

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

De ahí que el código para su escenario será:

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

¡gracias! eso funciona :) –

+0

¡Es tan maravillosamente idiomático! Tenga en cuenta, sin embargo, que para cadenas muy largas incurrirá en penalizaciones de tiempo y memoria, ya que requiere asignar otra cadena y atravesar la original dos veces. Las soluciones basadas en expresiones regulares son más óptimas. – skalee

2

O esto:

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

ej .:

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

No funciona cuando la cadena tiene algo más que A-Z. DÖG o CÄT o DOG123 por ejemplo. – Priit

+1

Bastante cierto. Si la internacionalización es un problema, el 'str == str.upcase' podría funcionar mejor, pero eso depende de la definición de' upcase'. En mi sistema, '" cooperación ".case" es '" COOPERACIÓN "', lo cual no ayuda mucho. Ruby 1.9 es más consciente de la codificación; para aquellos en 1.8, existe la gema de Unicode: http://rubygems.org/gems/unicode –

+0

Anclajes incorrectos, además de los problemas mencionados, coincidirá con cadenas como '" lower \ nUPPER "' – skalee

2

Gracias a las expresiones regulares, es muy simple. Simplemente use la clase de caracteres [[:upper:]] que permite todas las letras mayúsculas, incluidas, entre otras, las que se encuentran en ASCII-8.

Dependiendo de lo que necesita hacer exactamente:

# 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!" 

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

Cuestiones relacionadas