String Manipulation Nuby Question

Discussion in 'Ruby' started by Chris Roos, May 6, 2005.

  1. Chris Roos

    Chris Roos Guest

    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
    Chris Roos, May 6, 2005
    #1
    1. Advertising

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

    On 5/5/05, 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
    >
    > 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
    >
    >
    Logan Capaldo, May 6, 2005
    #2
    1. Advertising

  3. 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

    --
    David A. Black
    David A. Black, May 6, 2005
    #3
  4. Chris Roos

    Chris Roos Guest

    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 <> 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
    >>
    >>

    >
    >
    >
    >
    Chris Roos, May 6, 2005
    #4
  5. Hi --

    On Fri, 6 May 2005, Logan Capaldo wrote:

    > On 5/5/05, 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} #{forename} #{surname}".strip


    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

    --
    David A. Black
    David A. Black, May 6, 2005
    #5
  6. Chris Roos

    Eric Hodel Guest

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

    > On 5/5/05, 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.

    >
    > "#{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 - - http://segment7.net
    FEC2 57F1 D465 EB15 5D6E 7C11 332A 551C 796C 9F04
    Eric Hodel, May 6, 2005
    #6
  7. Hi,

    Logan Capaldo <> wrote:

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


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


    Regards,

    Dominik.
    Dominik Schlütter, May 6, 2005
    #7
  8. Chris Roos

    Chris Roos Guest

    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.
    Chris Roos, May 6, 2005
    #8
  9. Ok Ok I admit it! I forgot the squeeze! ;-)
    To reiterate:
    "#{title} #{forename} #{surname}".strip.squeeze

    On 5/5/05, Dominik Schlütter <> wrote:
    > Hi,
    >
    > Logan Capaldo <> wrote:
    >
    > > "#{title} #{forename} #{surname}".strip

    >
    > But that would leave double spaces in the middle if 'forename' was
    > empty, wouldn't it?
    >
    > Regards,
    >
    > Dominik.
    >
    >
    Logan Capaldo, May 6, 2005
    #9
  10. Hi --

    On Fri, 6 May 2005, Logan Capaldo wrote:

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


    It's got to be squeeze(" "). Otherwise:

    " Mrs. Emma Peel ".strip.squeeze
    => "Mrs. Ema Pel"


    David

    --
    David A. Black
    David A. Black, May 6, 2005
    #10
  11. Chris Roos

    Chris Roos Guest

    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.
    Chris Roos, May 6, 2005
    #11
  12. Ooops, one more mistake in my iteration, stop listening to me
    everyone! "#{title} #{forename} #{surname}".strip.squeeze(' ')

    On 5/5/05, Logan Capaldo <> wrote:
    > Ok Ok I admit it! I forgot the squeeze! ;-)
    > To reiterate:
    > "#{title} #{forename} #{surname}".strip.squeeze
    >
    > On 5/5/05, Dominik Schlütter <> wrote:
    > > Hi,
    > >
    > > Logan Capaldo <> wrote:
    > >
    > > > "#{title} #{forename} #{surname}".strip

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

    >
    Logan Capaldo, May 6, 2005
    #12
  13. Chris Roos

    James Britt Guest

    Chris Roos wrote:
    > Hmm, an hours work and a five line implementation replaced by one line a
    > matter of minutes... I have a long way to go ;-)


    Yeah, but it's a great trip and you have excellent company.


    James
    James Britt, May 6, 2005
    #13
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Van Jacques

    nuby question re a method

    Van Jacques, Dec 10, 2003, in forum: Ruby
    Replies:
    0
    Views:
    78
    Van Jacques
    Dec 10, 2003
  2. Boris \BXS\ Schulz

    nuby question: f.rename(x,y) does not work

    Boris \BXS\ Schulz, Jan 3, 2004, in forum: Ruby
    Replies:
    4
    Views:
    90
    Boris \BXS\ Schulz
    Jan 3, 2004
  3. Edwin Eyan Moragas

    nuby question: question marks in method names

    Edwin Eyan Moragas, Aug 30, 2004, in forum: Ruby
    Replies:
    0
    Views:
    129
    Edwin Eyan Moragas
    Aug 30, 2004
  4. Dany Cayouette

    Nuby - help on string spliting

    Dany Cayouette, Sep 30, 2004, in forum: Ruby
    Replies:
    3
    Views:
    95
    Dany Cayouette
    Sep 30, 2004
  5. Lionel Thiry
    Replies:
    5
    Views:
    117
    Lionel Thiry
    Oct 14, 2004
Loading...

Share This Page