Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation

Help with number conversion

by Mr.T (Sexton)
on Apr 03, 2002 at 05:12 UTC ( #156236=perlquestion: print w/replies, xml ) Need Help??
Mr.T has asked for the wisdom of the Perl Monks concerning the following question:


I am looking for a nice efficient way to convert: 1 to 001; 2 to 002; 3 to 003; ... 10 to 010; ... 60 to 060; etc...


Replies are listed 'Best First'.
Re: Help with number conversion
by gav^ (Curate) on Apr 03, 2002 at 05:28 UTC
    sprintf is your friend.

    You want:

    $fixed = sprintf('%03d', $num);
    Hope this helps...


Re: Help with number conversion
by wmono (Friar) on Apr 03, 2002 at 05:24 UTC

    $number = 1; $number = "0".$number until length $number >= 3; print $number,"\n";

    Hope that helps..

      $number = 1;
      $number = "0".$number until length $number >= 3;
      print $number,"\n";

      I'm sure merlyn just wanted you to know that although this works as expected, there are better alternatives. To many, "Matt Wright" is a synonym for "clumsy code that does however do what it's supposed to do" (not to be taken literally: merlyn didn't ask if you went to school with clumsy code :)).

      Your approach is directly instructing Perl to do what you want it to do. If you feel comfortable with that, you should do it that way. But often there is some efficiency in both coding and run time to be gained when you use Perl's core functions. In this case, it'd be $number = sprintf '%03d', $number;, which is approximately 2.5 times as fast.

      Learn about sprintf. It can be very confusing at first, but the %-notation is easy to get used to.


      $number = "0".$number until length $number >= 3;
      Did you and Matt Wright go to school together?


      -- Randal L. Schwartz, Perl hacker

      update: You know, when I first posted my comment, and the post was something Matt-Wright-ish, as I commented above, I left my vote neutral. But when it was changed to:
      You know what? merlyn wins. Forget it. I'll stop offering advice before running it past him first.
      I finally invoked a downvote. Don't post code here unless you can take open criticism, including a little ribbing and being compared to the bad-code-poster-Child.

        This is of course a job for a regex ;-)

        $number = 42; s/.*/"s||000$number|&&join'',reverse chop,chop,chop"/eieio; print;




Re: Help with number conversion
by petdance (Parson) on Apr 03, 2002 at 05:48 UTC
    Why is "efficient" important here?

    Efficient in what way?

    <megaphone> Throw down the gun and tiara and come out of the float! </megaphone>

      Well "efficient" is subjective here I think. Does he mean "wins when you Benchmark"? Or does he mean "least number of bytes of source to accomplish a task"? Or perhaps even "the most elegant and understandable solution"? All of which are laudable goals, at different times and for different reasons, which may of course have conflicting solutions. Though yes, in general the first definition is what is intended. Just some rambling thoughts...

      UPDATE: Just wanted to expand on this, when I first started I focused primarily on the second form. For three reasons a) I had a small disk quota b) I did not know how to optimize for the first (and still am not great at it) c) I thought this was optimizing for the first. I figured "the smaller the source the less in memory, the less to handle etc. etc." Which is all of course mostly irrelevant. Insert bit about premature optimization here. Thought this might be some interesting background into how some approach things.

      perl -pe "s/\b;([st])/'\1/mg"

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://156236]
Approved by mdillon
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (4)
As of 2018-04-20 20:02 GMT
Find Nodes?
    Voting Booth?