Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Test if a word is singular or plural in Ruby on Rails

Quick question.

How can I test a word to see if it is singular or plural?

I'd really like:

test_singularity('word') # => true
test_singularity('words') # => false

I bet rails is capable!

Thanks.

like image 848
doctororange Avatar asked Nov 26 '09 05:11

doctororange


2 Answers

Well in rails, you can do a string#singularize|#pluralize comparison to return a true or false value.

But I would think due to the nature of language itself, this might need some backup to do be completely accurate.

You could do something like this

def test_singularity(str)
  str.pluralize != str && str.singularize == str
end

But to see how accurate, I ran a quick set of words.

%w(word words rail rails dress dresses).each do |v|
  puts "#{v} : #{test_singularity(v)}"
end

word : true
words : false
rail : true
rails : false
dress : false
dresses : false

I was a little surprised actually, since 'dress' does get pluralized properly, but when it goes through the #singularize it runs into a bit of a snag.

'dress'.pluralize # => dresses
'dress'.singularize # => dres
like image 139
nowk Avatar answered Oct 20 '22 05:10

nowk


Most of the times i never test for singularity or plural, i just convert it to the singular or plural form i require.

In Rails 2.3.x this was possible, writing something like this

plural_form = org_word.singularize.pluralize
singular_form = org_word.pluralize.singularize

Working further on this, a working function is easy to supply:

require 'active_support'

def is_singular?(str)
  str.pluralize.singularize == str
end


%w(word words rail rails dress dresses).each do |v|
  puts "#{v} : #{is_singular?(v)}"
end

which gives the following output:

word : true
words : false
rail : true
rails : false
dress : true
dresses : false

In Rails 4, with the given words, it is now much easier. You can just do

plural_form = org_word.pluralize
singular_form = org_word.singularize

and thus the function becomes much easier as well:

require 'active_support'

def is_singular?(str)
  str.singularize == str
end
like image 42
nathanvda Avatar answered Oct 20 '22 05:10

nathanvda