[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

String Manipulation Nuby Question

Chris Roos

5/5/2005 11:35:00 PM

I have a Person with title, forename and surname (all of which are
optional). I want to return a 'pretty' name for this person in the format..

title + <space> + forename + <space> + surname

..where any extraneous spaces are removed.

My name method currently looks like this

def name
(
(title.to_s.strip.empty? ? "" : title.to_s.strip << " ") <<
(forename.to_s.strip.empty? ? "" : forename.to_s.strip << " ") <<
(surname.to_s.strip.empty? ? "" : surname.to_s.strip)
).strip
end

I created seven tests for this method for each combination of the three
parameters. All seven tests pass with this implementation.

Note. I was half way through writing about how I should probably test
for nil and maybe return an empty string from the three (title,
forename, surname) methods when I realised that all I was really doing
was testing for nil in a roundabout way; i.e. convert possible nil's to
string then strip spaces then check for empty...

I started thinking about this some more and realised that a test for nil
would return false which would allow me to re-write the above method
like so..

def name
(
(title ? title.strip << " " : "") <<
(forename ? forename.strip << " " : "") <<
(surname ? surname.strip : "")
).strip
end

This gets rid of the nasty duplication and double question marks in the
first method.

I also realised that I needed another test - for all nil's. They all
still passed.

What I was originally going to ask was how to improve on the first
implementation above. Even though (in my opinion) the second
implementation is a lot cleaner I'm still interested in whether it can
be made even more succinct as in 'the ruby way'?

It may be a very small method and have taken me about an hour to go
through this process but I'm quite pleased as to how it's turned out.

Chris



12 Answers

Logan Capaldo

5/5/2005 11:45:00 PM

0

"#{title} #{forename} #{surname}".strip

On 5/5/05, Chris Roos <chris@seagul.co.uk> wrote:
> I have a Person with title, forename and surname (all of which are
> optional). I want to return a 'pretty' name for this person in the format..
>
> title + <space> + forename + <space> + surname
>
> ..where any extraneous spaces are removed.
>
> My name method currently looks like this
>
> def name
> (
> (title.to_s.strip.empty? ? "" : title.to_s.strip << " ") <<
> (forename.to_s.strip.empty? ? "" : forename.to_s.strip << " ") <<
> (surname.to_s.strip.empty? ? "" : surname.to_s.strip)
> ).strip
> end
>
> I created seven tests for this method for each combination of the three
> parameters. All seven tests pass with this implementation.
>
> Note. I was half way through writing about how I should probably test
> for nil and maybe return an empty string from the three (title,
> forename, surname) methods when I realised that all I was really doing
> was testing for nil in a roundabout way; i.e. convert possible nil's to
> string then strip spaces then check for empty...
>
> I started thinking about this some more and realised that a test for nil
> would return false which would allow me to re-write the above method
> like so..
>
> def name
> (
> (title ? title.strip << " " : "") <<
> (forename ? forename.strip << " " : "") <<
> (surname ? surname.strip : "")
> ).strip
> end
>
> This gets rid of the nasty duplication and double question marks in the
> first method.
>
> I also realised that I needed another test - for all nil's. They all
> still passed.
>
> What I was originally going to ask was how to improve on the first
> implementation above. Even though (in my opinion) the second
> implementation is a lot cleaner I'm still interested in whether it can
> be made even more succinct as in 'the ruby way'?
>
> It may be a very small method and have taken me about an hour to go
> through this process but I'm quite pleased as to how it's turned out.
>
> Chris
>
>



dblack

5/5/2005 11:47:00 PM

0

Chris Roos

5/5/2005 11:53:00 PM

0

Thanks for coming back so fast. Unfortunately, this doesn't pass one of
the tests - where only a title and surname is supplied this
implementation will put two spaces in the middle...

"Mr Bloggs" instead of
"Mr Bloggs"

Chris

Logan Capaldo wrote:
> "#{title} #{forename} #{surname}".strip
>
> On 5/5/05, Chris Roos <chris@seagul.co.uk> wrote:
>
>>I have a Person with title, forename and surname (all of which are
>>optional). I want to return a 'pretty' name for this person in the format..
>>
>>title + <space> + forename + <space> + surname
>>
>>..where any extraneous spaces are removed.
>>
>>My name method currently looks like this
>>
>>def name
>> (
>> (title.to_s.strip.empty? ? "" : title.to_s.strip << " ") <<
>> (forename.to_s.strip.empty? ? "" : forename.to_s.strip << " ") <<
>> (surname.to_s.strip.empty? ? "" : surname.to_s.strip)
>> ).strip
>>end
>>
>>I created seven tests for this method for each combination of the three
>>parameters. All seven tests pass with this implementation.
>>
>>Note. I was half way through writing about how I should probably test
>>for nil and maybe return an empty string from the three (title,
>>forename, surname) methods when I realised that all I was really doing
>>was testing for nil in a roundabout way; i.e. convert possible nil's to
>>string then strip spaces then check for empty...
>>
>>I started thinking about this some more and realised that a test for nil
>>would return false which would allow me to re-write the above method
>>like so..
>>
>>def name
>> (
>> (title ? title.strip << " " : "") <<
>> (forename ? forename.strip << " " : "") <<
>> (surname ? surname.strip : "")
>> ).strip
>>end
>>
>>This gets rid of the nasty duplication and double question marks in the
>>first method.
>>
>>I also realised that I needed another test - for all nil's. They all
>>still passed.
>>
>>What I was originally going to ask was how to improve on the first
>>implementation above. Even though (in my opinion) the second
>>implementation is a lot cleaner I'm still interested in whether it can
>>be made even more succinct as in 'the ruby way'?
>>
>>It may be a very small method and have taken me about an hour to go
>>through this process but I'm quite pleased as to how it's turned out.
>>
>>Chris
>>
>>
>
>
>
>




dblack

5/5/2005 11:53:00 PM

0

Eric Hodel

5/5/2005 11:54:00 PM

0

On 05 May 2005, at 16:45, Logan Capaldo wrote:

> On 5/5/05, Chris Roos <chris@seagul.co.uk> wrote:
>> I have a Person with title, forename and surname (all of which are
>> optional). I want to return a 'pretty' name for this person in the
>> format..
>>
>> title + <space> + forename + <space> + surname
>>
>> ..where any extraneous spaces are removed.
>
> "#{title} #{forename} #{surname}".strip

This leaves spaces in the middle.

[title, forename, surname].join(' ').gsub(/ /, ' ')

require 'test/unit'

class TestFullName < Test::Unit::TestCase

def setup
@title = "Mr."
@surname = "Hodel"
end

def test_strip
assert_equal "Mr. Hodel", "#{@title} #{@forename} #{@surname}".strip
end

def test_join_gsub
assert_equal("Mr. Hodel",
[@title, @forename, @surname].join(' ').gsub(/ /, '
'))
end

end

--
Eric Hodel - drbrain@segment7.net - http://se...
FEC2 57F1 D465 EB15 5D6E 7C11 332A 551C 796C 9F04



schlu-do

5/5/2005 11:54:00 PM

0

Hi,

Logan Capaldo <logancapaldo@gmail.com> wrote:

> "#{title} #{forename} #{surname}".strip

But that would leave double spaces in the middle if 'forename' was
empty, wouldn't it?


Regards,

Dominik.

Chris Roos

5/5/2005 11:57:00 PM

0

David A. Black wrote:
> Hi --
>
> On Fri, 6 May 2005, Chris Roos wrote:
>
>> I have a Person with title, forename and surname (all of which are
>> optional). I want to return a 'pretty' name for this person in the
>> format..
>>
>> title + <space> + forename + <space> + surname
>>
>> ..where any extraneous spaces are removed.
>>
>> My name method currently looks like this
>>
>> def name
>> (
>> (title.to_s.strip.empty? ? "" : title.to_s.strip << " ") <<
>> (forename.to_s.strip.empty? ? "" : forename.to_s.strip << " ") <<
>> (surname.to_s.strip.empty? ? "" : surname.to_s.strip)
>> ).strip
>> end
>>
> [...]
>
>> What I was originally going to ask was how to improve on the first
>> implementation above. Even though (in my opinion) the second
>> implementation is a lot cleaner I'm still interested in whether it can
>> be made even more succinct as in 'the ruby way'?
>
>
> I'd let Ruby do more of the work, especially the iterating through the
> items. Something like this might be suitable:
>
> class Person
> attr_accessor :title, :forename, :surname
> def name
> [title, forename, surname].compact.map {|s| s.strip }.join(" ")
> end
> end
>
>
> David
>
Hmm, an hours work and a five line implementation replaced by one line a
matter of minutes... I have a long way to go ;-)

Thanks for your help.



Logan Capaldo

5/5/2005 11:59:00 PM

0

Ok Ok I admit it! I forgot the squeeze! ;-)
To reiterate:
"#{title} #{forename} #{surname}".strip.squeeze

On 5/5/05, Dominik Schlütter <schlu-do@gmx.net> wrote:
> Hi,
>
> Logan Capaldo <logancapaldo@gmail.com> wrote:
>
> > "#{title} #{forename} #{surname}".strip
>
> But that would leave double spaces in the middle if 'forename' was
> empty, wouldn't it?
>
> Regards,
>
> Dominik.
>
>



Chris Roos

5/6/2005

0

David A. Black wrote:
>
> Much more succinct than mine :-) You would, however, have to put a
> .squeeze(" ") in there too, to take out extra spaces in the middle.
>
> " Mrs. Emma Peel ".squeeze(" ").strip
> => "Mrs. Emma Peel"
>
>
> David
>

Cool. Thanks again.



dblack

5/6/2005

0