2010-02-28 16 views
9

Sto cercando di verificare se una stringa è tutte maiuscole in Rails. Come potrei fare per farlo?Verifica se una stringa è interamente maiuscola in Rails

Sto scrivendo il mio metodo di pluralize helper personalizzato e vorrei che qualcosa passasse parole come "WORD" e qualche volta "Word" - Voglio testare se la mia parola è tutte maiuscole così posso restituire "PAROLE" - con una "S" maiuscola alla fine se la parola è plurale (rispetto a "WORDs").

Grazie!

+0

possibile duplicato di [Come posso verificare una parola è già tutto in maiuscolo in Ruby?] (Http: // StackOverflow .com/questions/8529595/how-can-i-check-a-word-è-già-tutto-maiuscolo-in-rubino) – philant

+0

Ah no, questa domanda è stata chiesta prima di quella, quindi se qualcosa dovrebbe essere essere chiuso come un dup di questo. –

+0

@philant - non si dovrebbe votare per chiudere come duplicato da entrambi i lati ... solo da un lato. –

risposta

23

Fate questo:

str == str.upcase 

es:

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

Di qui il codice per lo scenario sarà:

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

grazie! funziona :) –

+0

È così meravigliosamente idiomatico! Tenete presente che per stringhe molto lunghe si incorre in penalità di tempo e memoria perché richiede l'allocazione di un'altra stringa e l'attraversamento di due volte l'originale. Le soluzioni basate su espressioni regolari sono più ottimali. – skalee

2

O questo:

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

es .:

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

Non funziona quando la stringa ha altro che A-Z al suo interno. DÖG o CÄT o DOG123 per esempio. – Priit

+1

Abbastanza vero. Se l'internazionalizzazione è un problema, 'str == str.upcase' potrebbe funzionare meglio, ma ciò dipende dalla definizione di 'upcase'. Sul mio sistema, '" coöperation ".upcase' è' "COOPPERAZIONE" ', che in realtà non aiuta. Ruby 1.9 è più sensibile alla codifica; per quelli in 1.8, c'è la gemma Unicode: http://rubygems.org/gems/unicode –

+0

Ancoraggi impropri, a parte i problemi sopra citati, corrisponderà a stringhe come '" lower \ nUPPER "' – skalee

2

Grazie alle espressioni regolari, è molto semplice. Basta usare la classe di caratteri [[:upper:]] che consente tutte le lettere maiuscole, incluse ma non limitate a quelle presenti in ASCII-8.

A seconda di che cosa avete bisogno esattamente:

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

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

Problemi correlati